gifts2017

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

Опубликовал Наталья Петрухина (Sharky_85) в раздел Обмен - Перенос данных из 1C8 в 1C8

Данный алгоритм помогает универсализировать процесс загрузки данных в БД 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();
    //тут указываем свои наименования
    ВидДокумента="Продажа";
    НазваниеТабличнойЧасти="Товары";
    ДляОбработокЗагрузкиСервер.ЗаполнениеДокументовИзДереваЗначений(ВидДокумента,НазваниеТабличнойЧасти,ДЗ);
    Сообщить("Все!   "+Формат(ТекущаяДата(), "ДЛФ=В"));
КонецПроцедуры

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

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

 


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

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

См. также

Автор запретил комментарии