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