Все публикации

БСП
Разработки

Запрос в SQL базу

Получение результата запроса из SQL в таблицу значений
ChOP 30 5
// Возвращает результат запроса в таблице значений.
//
// Параметры:
//  Connection	 - COMОбъект("ADODB.Connection"), коннект к бд (необязательный).
//  SQLText      - текст, текст запроса.
//  ДанныеДляПодключения - структура, формируется в СоздатьДанныеДляПодключения() (необязательный).
//
Функция ПолучитьРезультатЗапроса(SQLText, ДанныеДляПодключения = Неопределено, Connection = Неопределено) Экспорт
	
	Если Connection = Неопределено Тогда
		Connection = НовоеСоединениеССУБД(ДанныеДляПодключения);
	КонецЕсли;
	
	RecordSet                = Новый ComObject("ADODB.RecordSet");
	RecordSet.CursorLocation = 3;
	RecordSet.LockType       = 3;
	
	Попытка
		
		RecordSet.Open(SQLText, Connection);
		
		ТЗ = Новый ТаблицаЗначений;
		КоличествоПолей = RecordSet.Fields.Count;
		
		Для НомерСтолбца = 0 По КоличествоПолей - 1 Цикл // Создание и добавление колонок во временную таблицу
			
			ИмяСтолбца = RecordSet.Fields.Item(НомерСтолбца).Name;
			ТЗ.Колонки.Добавить(RecordSet.Fields.Item(НомерСтолбца).Name, SQLТипВ1СТип(RecordSet.Fields.Item(НомерСтолбца).Type, RecordSet.Fields.Item(НомерСтолбца).DefinedSize));
			
		КонецЦикла;
		
		Пока НЕ RecordSet.EOF Цикл // Заполнение созданной таблицы
			
			НоваяСтрока = ТЗ.Добавить();
			
			Для ПолеСч = 0 По КоличествоПолей - 1 Цикл
				
				Поле = RecordSet.Fields.item(ПолеСч);
				НоваяСтрока[Поле.name] = Поле.Value;
				
			КонецЦикла;
			
			RecordSet.MoveNext();
			
		КонецЦикла;
		
		RecordSet.Close();
		
	Исключение
		
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Запрос в SQL базу " + ДанныеДляПодключения.ИмяБД + "'"), УровеньЖурналаРегистрации.Ошибка, , , "Ошибка выполнения запроса: " + SQLText + Символы.ПС + ОписаниеОшибки());
		ТЗ = Неопределено; 
		
	КонецПопытки;
	
	Возврат ТЗ;
	
КонецФункции

Функция НовоеСоединениеССУБД(ДанныеДляПодключения) Экспорт 
	
	Con = Новый COMОбъект("ADODB.Connection");
	СтрокаПодключения = "Provider=SQLOLEDB; Data Source=" + ДанныеДляПодключения.АдресСервера + ";Initial Catalog=" 
	+ ДанныеДляПодключения.ИмяБД + ";Persist Security Info=True;User ID=" + ДанныеДляПодключения.Логин + ";Password=" + ДанныеДляПодключения.Пароль;
	
	Попытка
		
		Con.ConnectionTimeOut = 15;
		Con.CommandTimeout = 220;
		Con.Open(СтрокаПодключения);
		
	Исключение
		
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Соединение с SQL базой " + ДанныеДляПодключения.ИмяБД + "'"), УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
		Con = Неопределено;
		
	КонецПопытки;
	Возврат Con;
	
КонецФункции

Функция SQLТипВ1СТип(Num, size)
	
	ПараметрыСтроки = Новый КвалификаторыСтроки(size);
	
	Если
		Num = 20 Тогда
		Возврат Новый ОписаниеТипов("Число");
	ИначеЕсли
		Num = 128 Тогда
		Возврат Новый ОписаниеТипов("Булево");
	ИначеЕсли
		Num = 8 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
	ИначеЕсли
		Num = 136 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
	ИначеЕсли
		Num = 129 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
	ИначеЕсли
		Num = 7 Тогда
		Возврат Новый ОписаниеТипов("Дата");
	ИначеЕсли
		Num = 133 Тогда
		Возврат Новый ОписаниеТипов("Дата");
	ИначеЕсли
		Num = 134 Тогда
		Возврат Новый ОписаниеТипов("Дата");
	ИначеЕсли
		Num = 135 Тогда
		Возврат Новый ОписаниеТипов("Дата");
	ИначеЕсли
		Num = 14 Тогда
		Возврат Новый ОписаниеТипов("Число");
	ИначеЕсли
		Num = 0 Тогда
		Возврат Новый ОписаниеТипов("Строка,  , , , ПараметрыСтроки"); // adEmpty 0 no value
	ИначеЕсли
		Num = 3 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adInteger 3 4 - byte signed integer
	ИначеЕсли
		Num = 205 Тогда
		Возврат Новый ОписаниеТипов("Строка,  , , , ПараметрыСтроки"); // adLongVarBinary 205 Long binary value
	ИначеЕсли
		Num = 201 Тогда
		Возврат Новый ОписаниеТипов("Строка,  , , , ПараметрыСтроки"); // adLongVarChar 201 Long string value
	ИначеЕсли
		Num = 203 Тогда
		Возврат Новый ОписаниеТипов("Строка,  , , , ПараметрыСтроки"); // adLongVarWChar 203 Long Null - terminates string value
	ИначеЕсли
		Num = 131 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adNumeric 131 Number with fixed precision and scale
	ИначеЕсли
		Num = 5 Тогда
		Возврат Новый ОписаниеТипов("Число");
	ИначеЕсли
		Num = 4 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adSingle 4 Single - precision floating - point value
	ИначеЕсли
		Num = 2 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adSmallInt 2 2 - byte signed integer
	ИначеЕсли
		Num = 16 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adTinyInt 16 1 - byte signed integer
	ИначеЕсли
		Num = 21 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adUnsignedBigInt 21 8 - byte unsigned integer
	ИначеЕсли
		Num = 19 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adUnsignedInt 19 4 - byte unsigned integer
	ИначеЕсли
		Num = 18 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adUnsignedSmallInt 18 2 - byte unsigned integer
	ИначеЕсли
		Num = 17 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adUnsignedTinyInt 17 1 - byte unsigned integer
	ИначеЕсли
		Num = 132 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adUserDefined 132 User - defined variable
	ИначеЕсли
		Num = 204 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adVarBinary 204 Binary value
	ИначеЕсли
		Num = 12 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adVariant 12 Automation variant
	ИначеЕсли
		Num = 139 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adVarNumeric 139 Variable width exact numeric with signed scale
	ИначеЕсли
		Num = 202 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adVarWChar 202 Null - terminated Unicode character string
	ИначеЕсли
		Num = 130 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adWChar 130
	ИначеЕсли
		Num = 200 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
	Иначе
		Возврат Новый ОписаниеТипов("Строка");
	КонецЕсли;
	
КонецФункции

// Возвращает структуру с данными для НовоеСоединениеССУБД().
//
// Параметры:
//  АдресСервера	 - текст, адрес сервера.
//  ИмяБД      - текст, текст имя базы данных.
//  Логин - текст, логин.
//  Пароль - текст, пароль.
//
Функция СоздатьДанныеДляПодключения(АдресСервера, ИмяБД, Логин, Пароль) Экспорт
	
	ДанныеДляПодключения = Новый Структура("АдресСервера, ИмяБД, Логин, Пароль", АдресСервера, ИмяБД, Логин, Пароль);
	Возврат ДанныеДляПодключения;
	
КонецФункции

Очистка номера телефона от "мусора" (нецифровых символов)

Очевидным решением этой задачи является организация цикла, в котором по одному просматриваются символы исходной строки и к результату добавляются символы, являющиеся цифрами. Но, во-первых, здесь требуется цикл, на организацию которого будет потрачено время, во-вторых, без стринг-билдера посимвольная конкатенация не эффективна. В платформе 8.3.6 появились функции СтрРазделить и СтрСоединить, которые позволяют решить эту задачу в одну строку без цикла:

Автор: ildarovich

FastCode 66 8
СтрСоединить(СтрРазделить(СтрокаСЦифрами, СтрСоединить(СтрРазделить(СтрокаСЦифрами, "0123456789"))))

// Если список ненужных символов известен, например, "(", ")" и "-", то выражение может быть еще короче:

СтрСоединить(СтрРазделить(СтрокаСЦифрами, "()-"))

OneTracker - трекер учета рабочего времени программиста 1С Промо

Программа автоматически замеряет время работы разработчика с 1С в режиме Конфигуратора или Предприятия. Учет ведется в разрезах задач, информационных баз или объектов конфигураций.
990 руб.

BSL Language Server

Мощный open-source инструмент для анализа и обработки кода на языке 1С.
FastCode 66 8
Бесплатно

Python + 1C. Защищенный OAuth 2 сервер. Курс

Разработай защищенный OAuth 2 сервер на Python для 1С за одно занятие.
FastCode 66 8
-10%

MAGAZKA - лучшая программа для магазина

Фирменная конфигурация для Платформы 1С 8.2/8.3 На рынке 11 лет, представлена в 14 странах, более 4500 довольных клиентов
-25%

Игра : Самоцветы для 1С

Bejeweled for 1C
Tatitutu
Бесплатно

Удалить пространство имен из готового файла xml

также 1C 8 при работе XDTO может добавить атрибут type фильтр на атрибут выглядит так @*[name(.)!='type'] и добавлен перенос строки, иначе весь XML будет в одну строку |<xsl:text> |</xsl:text>
Функция УдалитьПространство(хмл)	//хмл - полное имя файла
	Х =  Новый COMОбъект("Msxml2.DOMDocument.6.0");
	х.async = 0;
	х.validateOnParse = 0;
	х.resolveExternals=0;
	х.load(хмл);
	xslDoc= Новый COMОбъект("MSXML2.DOMDocument.6.0");
	xslDoc.async = 0;
		
	xslDoc.loadXML("<?xml version=""1.0"" encoding=""utf-8""?>
	|<xsl:stylesheet version=""1.0""
	|  xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
	|  <xsl:output method=""xml""  encoding=""UTF-8"" indent=""no""/>	
	|  <xsl:template match=""/|comment()|processing-instruction()"">
	|    <xsl:copy>
	|<!-- go process children (applies to root node only) -->
	|      <xsl:apply-templates/>
	|    </xsl:copy>
	|  </xsl:template>	
	|  <xsl:template match=""*"">
	|    <xsl:element name=""{local-name()}"">
	|      <!-- go process attributes and children -->
	|      <xsl:apply-templates select=""@*[name(.)!='type']|node()""/>
	|    </xsl:element>
	|<xsl:text>
	|</xsl:text>
	|  </xsl:template>
	|   	
	|  <xsl:template match=""@*"">
	|    <xsl:attribute name=""{local-name()}"">
	|      <xsl:value-of select="".""/>
	|    </xsl:attribute>
	|  </xsl:template>	
	|</xsl:stylesheet>
	|");
		
	xmlDoc= Новый COMОбъект("MSXML2.DOMDocument.6.0");
	// XML = xmlDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""");  	
	х.transformNodeToObject(xslDoc, xmlDoc);
	//xmlDoc.insertBefore(XML,);
	
	xslDoc=0;
	х=0;
	xmlDoc.save(хмл);
	xmlDoc=0;
	Возврат 1;
КонецФункции // УдалитьПространство()

Скрипт установки модели восстановления Simple для всех баз

код выполняется в SQL MS на сервере или в его агенте по расписанию
DECLARE @SqlText VARCHAR(max)  = ''


SELECT @SqlText += 'alter database ['+name+'] set recovery simple' + ';' + CHAR(10) + CHAR(13)
from master.sys.databases
where database_id > 4 and state_desc = 'online' AND recovery_model_desc <> 'SIMPLE'

PRINT @SqlText
EXEC (@SqlText)

Добавить кнопку на форму в командную панель

Добавление кнопки в панель управления формы
СергейТ 9 1
Процедура ДобавитьКнопкуНаФормуВПанель(Форма) Экспорт
	НоваяКоманда		=Форма.Команды.Добавить("ФормаКоманднаяПанель_КомандаМояКоманда");
	НоваяКоманда.Действие="Подключаемый_ВыполнитьКоманду";
	
	Кнопка				=Форма.Элементы.Добавить("МояКнопка", Тип("КнопкаФормы"), Форма.Элементы.ФормаКоманднаяПанель);
	Кнопка.Заголовок	="Заголовок кнопки";
	Кнопка.ИмяКоманды	="ФормаКоманднаяПанель_КомандаМояКоманда";
КонецПроцедуры

Интерактивный отбор дерева значений

В связи с тем, что у дерева значений на форме, нет интерактивного отбора, реализовываем свой отбор Постановка задачи: На управляемой форме имеем дерево значений, необходимо дать пользователю возможно производить отбор строк Решение, теория: Так как, соз...
markers 16 3

Выгрузить Таблицу значений в массив структур (для передачи сервер - клиент)

Для передачи таблицы значений с сервера на клиент нельзя использовать объект типа таблица значений. Нужно преобразовывать таблицу в массив структур. Функция для преобразования Таблицы значений (ТаблицаЗначений) в массив структур.
СергейТ 9 1
&НаСервереБезКонтекста
Функция ТаблицуЗначенийВМассив(ТаблЗнач)
	Результат=Новый Массив;
	Для Каждого ТекСтр Из ТаблЗнач Цикл
		СтруктураСтроки=Новый Структура;
		Для Каждого ТекКол Из ТаблЗнач.Колонки Цикл
			СтруктураСтроки.Вставить(ТекКол.Имя,ТекСтр[ТекКол.Имя])
		КонецЦикла;
		Результат.Добавить(СтруктураСтроки)
	КонецЦикла;
	Возврат Результат
КонецФункции

ДеревоЗначений вывод на управляемую форму

Вручную на форме ничего не надо создавать
&НаСервере
Процедура ВывестиДзНаФорму(ДеревоОбъект)
	
	// Создание Реквизита формы типа ДанныеФормыДерево
	МассивДобавляемыхРеквизитов = Новый Массив;
	МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Дерево", 
	Новый ОписаниеТипов("ДеревоЗначений")));
	Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
		МассивДобавляемыхРеквизитов.Добавить(
		Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево"));
	КонецЦикла;
	ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
	
	
	// Преобразование объекта прикладного типа ДеревоЗначений 
	// в реквизит управляемой формы (данные формы)
	ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево");
	
	
	// Создание элемента формы типа ТаблицаФормы для отображения дерева
	ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
	ЭлементДерево.ПутьКДанным = "Дерево";
	ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;
	
	
	Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
		НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), 
		ЭлементДерево);
		НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
		НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя;
	КонецЦикла;
	
	
КонецПроцедуры

Программное добавление нового пользователя

Программное добавление нового пользователя в базу, в которой используется стандартная подсистема "Пользователи" БСП.
Iyad1020 6 1
Процедура СоздатьНовогоПользователя(Имя, Пароль)
    
    ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы.НайтиПоИмени(Имя);
    
    Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
        
        ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
        
        //В списке выбора не показываем
        ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь;
        
        ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;            
        
        ОписаниеПользователяИБ.Вставить("Действие", "Записать");
        ОписаниеПользователяИБ.Имя = Имя;
        ОписаниеПользователяИБ.Пароль = Пароль;
        
        
        НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
        НовыйПользователь.Имя    = Имя;
        НовыйПользователь.Код             = Имя;
        НовыйПользователь.Недействителен  = ложь;
        
        НовыйПользователь.ДополнительныеСвойства.Вставить(
            "ОписаниеПользователяИБ", ОписаниеПользователяИБ);
        
        Попытка
            НовыйПользователь.Записать();            
            ДобавитьРолиНовомуПользователю(НовыйПользователь.Имя);
       	Исключение
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка создания нового пользователя" + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЕсли;
        
    
КонецПроцедуры

Процедура ДобавитьРолиНовомуПользователю(Имя);
    Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(Имя);
    Пользователь.Роли.Добавить(Метаданные.Роли.АдминистраторСистемы);
    Пользователь.Роли.Добавить(Метаданные.Роли.ПолныеПрава);
    Пользователь.Записать();
КонецПроцедуры

Чтение Excel через Табличный документ

chugindanil 16 1
//На клиенте

ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Заголовок = "Выберите файл";

Если ДиалогВыбора.Выбрать() Тогда
	ИмяФайла = ДиалогВыбора.ПолноеИмяФайла; 
	Команда1НаСервере(ИмяФайла);
	
КонецЕсли; 


//На сервере

//Вывод в табличный документ

ТабличныйДокумент = Новый ТабличныйДокумент;

ТабличныйДокумент.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);

//вывод в таблицу значений

ПЗ = Новый ПостроительЗапроса;

ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());

ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

ПЗ.ЗаполнитьНастройки();

ПЗ.Выполнить();

ТаблицаЗначений = ПЗ.Результат.Выгрузить();

Выгрузка запроса в XML. Выгрузка объекта

chugindanil 16 1
&НаСервере
Процедура КомандаВыполнитьНаСервере()
	
	ИмяФайла = "d:\test.xml";
	
	Запрос = Новый Запрос("ВЫБРАТЬ
	| Номенклатура.Код КАК Код,
	| Номенклатура.Наименование КАК Наименование,
	| Номенклатура.Артикул КАК Артикул,
	| Номенклатура.Ссылка КАК Номенклатура
	|ИЗ
	| Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	| Номенклатура.ЭтоГруппа = ЛОЖЬ");
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ИмяФайла,"UTF-8");
	
	ВыборкаРезультата = Запрос.Выполнить().Выгрузить(); 
	ЗаписьXML.ЗаписатьНачалоЭлемента("Номенклатура");
	Для каждого Выборка Из ВыборкаРезультата Цикл
		ЗаписатьXML(ЗаписьXML, Выборка.Номенклатура.ПолучитьОбъект());           
	КонецЦикла;
	ЗаписьXML.ЗаписатьКонецЭлемента();
	ЗаписьXML.Закрыть();
	
КонецПроцедуры

Проверка заполненности сложных объектов

Проверяет, содержит ли переменная или коллекция какие-либо данные
Функция СодержитДанные(ЗначениеДляПроверки) Экспорт
	Результат = Ложь;
	
	Если ЗначениеДляПроверки <> Неопределено Тогда
		Если ТипЗнч(ЗначениеДляПроверки) = Тип("ТаблицаЗначений")
			Или ТипЗнч(ЗначениеДляПроверки) = Тип("Массив") 
			Или ТипЗнч(ЗначениеДляПроверки) = Тип("СписокЗначений") 
			Тогда
			
			Если ЗначениеДляПроверки.Количество() > 0 Тогда
				Результат = Истина;
			КонецЕсли;
			
		Иначе
			Результат = ЗначениеЗаполнено(ЗначениеДляПроверки);
		КонецЕсли
		
	КонецЕсли;
	
	Возврат Результат;
КонецФункции 

Создать объект ОписаниеТипов

Автор: HostHost

FastCode 66 8
НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаДата", ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты.Дата));

НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаЧисло", ОбщегоНазначения.ОписаниеТипаЧисло(12));

НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаСтрока", ОбщегоНазначения.ОписаниеТипаСтрока(100));

НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаСсылка", ОбщегоНазначения.ОписаниеТипаВсеСсылки());

HTTP в 1С для начинающих. Курс

Закрой все вопросы по работе с HTTP в 1C за одно занятие!
FastCode 66 8
-10%

Открытие формы выбора с отбором

Приведен пример открытия формы выбора с отбором по контрагенту и по периоду, как для управляемых форм так и для обычных. Для открытия форм следует применять метод глобального контекста ОткрытьФорму (при использовании версии платформы 1С:Предприятие 8.2 ...
Razlagutt 10 2

Интеграция 1С и Битрикс 24 через расширения. Курс

Разработка модуля интеграции ведется полностью в расширении, что позволит вам добавлять его даже в 1С:Fresh.
FastCode 66 8
-10%