Пример загрузки данных с помощью COMObject в 1С 8.2


Данный алгоритм помогает универсализировать процесс загрузки данных в БД 1С.
В отличие от 1С 7.7 возможно использование таких полезных объектов и свойств: «ДеревоЗначений», «ЗаполнитьЗначенияСвойств()», а также вынести повторяющиеся части процедур в Общий модуль, что упрощает читаемость кода  и исключает дублирующиеся записи. Кроме того, если понадобится внести какие-либо изменения, то это необходимо будет сделать всего в одном месте.

Задача: Компания ООО «Альфа» занимается реализацией  различной бытовой техники. Логистический учет производится в ПО на «С Sharp» собственной разработки. Необходимо вытягивать информацию о продажах в 1С8.2.

Решение:

Для подключения к базам использовать COMObject.

Создаем обработку «ЗагрузкиИзЛогистическойСистемы».

Реквизиты формы: «СписокБаз» — если несколько систем учета (Например, для разных видов товара)[Справочник «БДПредприятия»], «ВыборПериода»[СтандартныйПериод], «ЗагруженныеДанные» [ДеревоЗначений].

 


 **********************************************************************

**************  Модуль Формы Обработки:  *********************************

 

Создаем команду «ЗагрузитьПродажуИзЛогистическойСистемы», создаем к ней обработчикДействия:

&НаКлиенте
Процедура ЗагрузитьПродажуИзЛогистическойСистемы (Команда)
НачДата=ВыборПериода.ДатаНачала;
КонДата=ВыборПериода.ДатаОкончания;
// Процедура, которая с сервера запускает Модуль Менеджера Обработки
ЗагрузкиИзЛогистическойСистемыСервер(НачДата,КонДата,Режим, СписокБаз);
КонецПроцедуры

&НаСервере
Процедура ВызовПроцМенеджераОбработкиССервераЗагрузить(НачДата,КонДата,Режим,ТекущееИмяБазы)
ЗагруженныеДанные =0;
Обработки.ЗагрузкиИзЛогистическойСистемы. ЗагрузитьПродажуИзЛогистическойСистемы(НачДата,КонДата, ЗагруженныеДанные, СписокБаз);
КонецПроцедуры

**********************************************************************

**********************************************************************


**********************************************************************

****** Общий модуль «ДляОбработокЗагрузкиСервер»  *************************

Галочки: Сервер, Вызов Сервера

// Данная функция возвращает дату для получения данных из БД в нужном формате
Функция ДатаДлязапроса(Дата) ЭКСПОРТ
Возврат ""+фДата(УПВЗ(Год(Дата)))+"-"+фДата(Месяц(Дата))+"-"+фДата(День(Дата));
КонецФункции // ДатаДлязапроса()

Функция фДата(Д)    ЭКСПОРТ
Если СтрДлина(Д) < 2 Тогда
Д = Строка("0"+Д)
КонецЕсли;
Возврат Д;
КонецФункции

//Данная функция открывает доступ к Объекту COMObject, выполняет запрос
Функция ПолучитьИсточник(Source,Источник,db) ЭКСПОРТ
db = Новый COMObject ("ADODB.Connection");
db.ConnectionString = источник;
db.Mode = 1;
db.CommandTimeout = 0;
попытка
db.Open();
Сообщить("db.Open() прошло");
Исключение
Сообщить("db.Open()не прошло:"+ОписаниеОшибки())
КонецПопытки;
Сообщить(Source );
Возврат db.Execute(Source);
КонецФункции // ПолучитьИсточник()

//Функция  удаляет пробелы внутри значения
//Пробелы возникают из-за того, что восьмерка определяет некое значение как числовое
Функция УПВЗ(Д)      ЭКСПОРТ
//Ищем пробел в каждой позиции
А="";
Для сч=1 по StrLen(Д) Цикл
А=А+trimall(Right(left(Д,Сч),1));
КонецЦикла;
Возврат А;
КонецФункции

//Функция ПолучитьСсылкуНоменклатуры возвращает
Функция ПолучитьСсылкуНоменклатуры(КодЗЧ,НаименЗЧ,ПартНомер) ЭКСПОРТ
НоменклатураСсылка=Справочники.Номенклатура.НайтиПоКоду(Trimall(КодЗЧ));
Если  НоменклатураСсылка.Пустая() Тогда
Номенклатура=Справочники.Номенклатура.СоздатьЭлемент();
Номенклатура.Код=Trimall(КодЗЧ);
Номенклатура.Наименование=Trimall(НаименЗЧ);
Номенклатура.ПартНомер=trimall(ПартНомер);
Номенклатура.Записать();
НоменклатураСсылка=Номенклатура.Ссылка;
КонецЕсли;
Возврат НоменклатураСсылка;
КонецФункции // ПолучитьСсылкуНоменклатуры()

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

**********************************************************************

**********************************************************************


**********************************************************************

**************** Модуль Менеджера Обработки *****************************


Процедура  ЗагрузитьПродажуИзЛогистическойСистемы (НачДата,КонДата,ДЗ,ТекущееИмяБазы) Экспорт
Сообщить("Начали: "+Формат(ТекущаяДата(), "ДЛФ=В"));
Источник="DRIVER=SQL Server;SERVER=ИМЯСЕРВЕРА;UID=ЛОГИН;PWD=ПАРОЛЬ;DATABASE="+ТекущееИмяБазы;

//Пример запроса
Source="SELECT *
|FROM TABLE1 as T1
|INNER JOIN TABLE2 as T2 on (T2.Реквизит1='0') and  Т2.Реквизит2=T1.Реквизит1
|LEFT OUTER JOIN TABLE3  as T3 ON T2.Реквизит3=Т3.Реквизит1
|WHERE   (Т1.OpenDate BETWEEN '"+ДляОбработокЗагрузкиСервер.ДатаДлязапроса(НачДата)+" 00:00:00' and '"+ДляОбработокЗагрузкиСервер.ДатаДлязапроса(КонДата)+" 23:59:59')
|order by T1.OpenDate";

db="";
rs=ДляОбработокЗагрузкиСервер.ПолучитьИсточник(Source,Источник,db);

// это колонки, которые будут выгружены в Дерево значений на форму
// кроме того в самом реквизите формы «ЗагруженныеДанные» необходимо создать такие же реквизиты.
ДЗ=Новый ДеревоЗначений;
ДЗ.Колонки.Добавить("Номер");
ДЗ.Колонки.Добавить("Дата");
ДЗ.Колонки.Добавить("Контрагент");
ДЗ.Колонки.Добавить("Договор");
ДЗ.Колонки.Добавить("Подразделение");
ДЗ.Колонки.Добавить("Сумма");
//И т.д. по необходимости.
ТекНомер="";
Пока rs.eof()=0  Цикл
//Получаем данные из выборки
Номер =  rs.Fields("Номер").Value;
Если ТекНомер<>Номер   Тогда
Реквизит1  =  rs.Fields("Реквизит1").Value;
Реквизит2  =  ДляОбработокЗагрузкиСервер.УПВЗ(rs.Fields("Реквизит2").Value);
Реквизит3  =  ДляОбработокЗагрузкиСервер.УПВЗ(rs.Fields("Реквизит3").Value);
//Заполняем ДеревоЗначений 1 уровень
НоваяСтрока=ДЗ.Строки.Добавить();
НоваяСтрока.Дата  =  Реквизит1;
НоваяСтрока.Номер =  Реквизит2;
КонецЕсли;
//Заполняем ДеревоЗначений 2 уровень
ПодчиненнаяСтрока  =  НоваяСтрока.Строки.Добавить();
ПодчиненнаяСтрока.Номенклатура   = ДляОбработокЗагрузкиСервер.ПолучитьСсылкуНоменклатуры(Реквизит3);
ТекНомер  = Номер;
//Следующая Запись
rs.movenext();
КонецЦикла;
//Закрываем выборку
db.Close();
//тут указываем свои наименования
ВидДокумента="Продажа";
НазваниеТабличнойЧасти="Товары";
ДляОбработокЗагрузкиСервер.ЗаполнениеДокументовИзДереваЗначений(ВидДокумента,НазваниеТабличнойЧасти,ДЗ);
Сообщить("Все!   "+Формат(ТекущаяДата(), "ДЛФ=В"));
КонецПроцедуры

**********************************************************************

**********************************************************************

 


После загрузки данных на Форме будет сформирован список в виде дерева значений из загруженных документов.

Я надеюсь, что для Вас была интересна и познавательна данная заметка.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *