Использование 1С:Конвертация данных 2.1 для загрузки данных из любого источника

26.08.16

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Статья рассказывает об использовании всеми любимого инструмента, 1С:Конвертация данных 2.1 (далее просто Конвертация) для загрузки данных из любого внешнего источника - будь то база SQL, REST-сервис, JSON, XML, текстовые файлы, что угодно. Здесь я опишу сам принцип, как это делать и покажу пример из практики. В качестве бонуса - шаблон внешней обработки заполнения, использующей правила конвертации для загрузки данных.

Обычно программисты, при поступлении задачи на загрузку извне данных в базу данных 1С, начинают делать свои (продвинутые - начинают искать подходящие чужие) обработки загрузки данных, создавая новый велосипед для загрузки, пытаясь обработать им все видимые подводные камни и учесть все возможные косяки. Но мало кто задумывается, что в Конвертации все взаимосвязи, в т.ч. циклические, уже учтены. Нужно только грамотно положить в нее исходные данные и заставить работать УниверсальныйОбменДаннымиXML используя правила конвертации.

Итак начнем.

Цель: загрузить данные из внешнего источника (в нашем примере это будет результат запроса к БД MS SQL) в базу 1С (в нашем случае, это будет 1С:ERP). Загружать будем справочник Номенклатура.

Для этого заходим в программу Конвертация данных 2.1, загружаем структуру конфигурации 1С:ERP 2 и создаем новые правила обмена данными (из 1С:ERP в 1С:ERP).

Далее создаем ПКО (правила конвертации объектов) и ПВД (правила выгрузки данных) для конвертации и, соответственно, выгрузки справочника Номенклатура.

В ПВД указываем способ выборки "Произвольный алгоритм", правило конвертации "Номенклатура".

Код обработчика "Перед обработкой":

_д = "ДФ='yyyyMMdd HH:mm:ss'";
Результат = МодульИнтеграции.ВыполнитьЗапросНаСервере(
"select distinct dd.AID, dd.FullName from dDetails dd
|where dd.IdMeasures is not NULL
|"
,"Provider=SQLOLEDB;Data Source=SRVSQL;Initial Catalog=BASE;User ID=user1c;Password=12345;");

Если Результат <> Неопределено Тогда
	ВыборкаДанных = Новый Массив;
	Для каждого стрТЗ из Результат Цикл
		_номенклатура = Новый Структура;
		_номенклатура.Вставить("Код",стрТЗ.AID);
		_номенклатура.Вставить("Наименование",стрТЗ.FullName);
		_номенклатура.Вставить("ГруппаДоступа","Прочее");
		ВыборкаДанных.Добавить(_номенклатура);
	КонецЦикла;
КонецЕсли;

Тут я не буду расписывать модуль функции МодульИнтеграции.ВыполнитьЗапросНаСервере(). Предположим, что эта функция по указанному SQL запросу и параметрам подключения возвращает ТаблицуЗначений, соответствующую ожидаемому результату запроса.

На закладке Правила конвертации объектов создаем все необходимые для загрузки правила ПКО (ПКО - правила конвертации объектов) и соответствующие ПКС (ПКС - правила конвертации свойств). Для ПКО Номенклатура Код, Наименование и ГруппаДоступа забираем из передаваемых данных, остальные реквизиты заполняем синтетическими данными, которые описываем тут же, в ПКС.

Например структуру данных для конвертации реквизита ВидНоменклатуры заполняем в обработчике ПКС ПередВыгрузкой:

ТипНоменклатуры определяем так же в обработчике ПередВыгрузкой, значением перечисления:

Остальное аналогичным образом. (нюансы могу пояснить в комментариях, чтобы не засорять статью).

Мы получили XML-файл правил обмена.

Эти правила можно использовать типовой обработкой из БСП "УниверсальныйОбменДаннымиXML" (далее просто обработка) - выгрузить данные в XML, и этой же обработкой загрузить их в эту же базу уже из XML.

Но мы пойдем дальше.

Есть такое понятие как Online-обмен. Суть его в том, что обработка создает COM-экземпляр обработки в базе-получателе данных.

Данные в обработку-получатель передаются при записи обработкой-отправителем каждого узла XML в создаваемый файл данных (даже если это online-обмен, файл данных все же создается, пусть и неявно). Т.е. как только обработка-отправитель записывает очередной узел в файл с данными, этот же узел передается для загрузки обработке-получателю (не файл, а именно узел).

Но зачем же нам городить огород с COM-объектами?! Создадим еще один экземпляр объекта типовой обработки локально и укажем механизму конвертации использовать его так, как если бы это был COM-объект в случае online-обмена.

Собственно код, который делает эту замену:

// *** БЛОК ВКЛЮЧЕНИЯ ОНЛАЙН ОБМЕНА ***
// Для включения #online обмена при универсальной выгрузке
// Этот волшебный код обманывает универсальный механизм и переопределяет обработку, которая должна была быть создана COM-соединением.
// На самом деле мы ее создаем локально, просто другим объектом, чтобы уж совсем отторжения не было. Посмотрим, как оно взлетит...
мОбработкаДляЗагрузкиДанных = Обработки.УниверсальныйОбменДаннымиXML.Создать();
НепосредственноеЧтениеВИБПриемнике = Истина;
// заполняем необходимые свойства
ЗаполнитьЗначенияСвойств(мОбработкаДляЗагрузкиДанных,ЭтотОбъект,"ИспользоватьТранзакции,КоличествоОбъектовНаТранзакцию,ФлагРежимОтладки,ДописыватьДанныеВПротоколОбмена,ВыводВПротоколИнформационныхСообщений");
мОбработкаДляЗагрузкиДанных.РежимОбмена = "Загрузка";
мОбработкаДляЗагрузкиДанных.ИмяФайлаПротоколаОбмена = ПолучитьИмяПротоколаДляВторойИнформационнойБазыComСоединения();

ВыполнитьПередачуИнформацииОНачалеОбменаВПриемник(ТекущаяСтрокаДляЗаписи);
// *** КОНЕЦ БЛОКА ВКЛЮЧЕНИЯ ОНЛАЙН ОБМЕНА ***

Этот код нужно добавить в правила обмена в глобальный обработчик конвертации ПередВыгрузкойДанных (например так:). Пишу здесь, т.к. я этот обработчик добавляю программно при заполнении реквизитов Обработки.УниверсальныйОбменДаннымиXML, чтобы оставить возможность отладки.

Пример заполнения текста глобального обработчика ПередВыгрузкойДанных правил обмена при программном создании и запуске обработки обмена:

// Проконтролируем, что есть блок, включающий #online обмен
Если НЕ Найти(ОбработкаОбмена.Конвертация.ПередВыгрузкойДанных,"мОбработкаДляЗагрузкиДанных") Тогда // можно конечно на хэш-тег ориентироваться, но оставил пока так
	ОбработкаОбмена.Конвертация.ПередВыгрузкойДанных = СокрЛП(ОбработкаОбмена.Конвертация.ПередВыгрузкойДанных)
	+Символы.ПС+ПолучитьМакет("Конвертация_БлокВключенияОнлайнОбмена").ПолучитьТекст();
КонецЕсли;

Собственно все.

Остается только ВыполнитьВыгрузку(), которая обработает включенные ПВД, загрузит данные из БД SQL, сформирует XML и сразу же выполнит его загрузку в эту же базу.

Ниже приведу код, которым я пользуюсь для программной загрузки данных с использованием правил конвертации:

ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();	

ИмяВременногоФайлаПравилОбмена = ПолучитьИмяВременногоФайла("xml");
ИмяВременногоФайлаПротоколаОбмена = ПолучитьИмяВременногоФайла("txt");
ИмяВременногоФайлаДанных = ПолучитьИмяВременногоФайла("xml");

МакетПравилОбмена.Записать(ИмяВременногоФайлаПравилОбмена);

ОбработкаОбмена.РежимОбмена                           = "Выгрузка";
ОбработкаОбмена.ИмяФайлаПравилОбмена                  = ИмяВременногоФайлаПравилОбмена;
ОбработкаОбмена.ВыводВПротоколИнформационныхСообщений = Истина;
ОбработкаОбмена.ВыводВПротоколСообщенийОбОшибках      = Истина;

Если ЗначениеЗаполнено(ИмяВременногоФайлаПротоколаОбмена) Тогда
	ОбработкаОбмена.ИмяФайлаПротоколаОбмена = ИмяВременногоФайлаПротоколаОбмена;
КонецЕсли;

ОбработкаОбмена.ЗагрузитьПравилаОбмена(ИмяВременногоФайлаПравилОбмена, "XMLФайл");

// Проконтролируем, что есть блок, включающий #online обмен
Если НЕ Найти(ОбработкаОбмена.Конвертация.ПередВыгрузкойДанных,"мОбработкаДляЗагрузкиДанных") Тогда // можно конечно на хэш-тег ориентироваться, но оставил пока так
	ОбработкаОбмена.Конвертация.ПередВыгрузкойДанных = СокрЛП(ОбработкаОбмена.Конвертация.ПередВыгрузкойДанных)
	+Символы.ПС+ПолучитьМакет("Конвертация_БлокВключенияОнлайнОбмена").ПолучитьТекст();
КонецЕсли;

// заполнение уточняющих параметров
Если ЗначениеЗаполнено(ПараметрыВыполнения) Тогда
	ЗаполнитьЗначенияСвойств(ОбработкаОбмена.Параметры,ПараметрыВыполнения);
	ЗаполнитьЗначенияСвойств(ОбработкаОбмена,ПараметрыВыполнения,"ДатаНачала,ДатаОкончания");
КонецЕсли;

ОбработкаОбмена.ИмяФайлаОбмена                        = ИмяВременногоФайлаДанных;

ОбработкаОбмена.ТаблицаНастройкиПараметров.Очистить();

// здесь мы включаем только конкретное ПВД, если их много, а нужно сделать выгрузку только по одному
_имяПВД = Неопределено;
Если ПараметрыВыполнения.Свойство("ИмяПВД",_имяПВД) Тогда
	Для каждого стрТЗвыгрузки из ОбработкаОбмена.ТаблицаПравилВыгрузки.Строки.НайтиСтроки(Новый Структура("Включить",1),Истина) Цикл
		стрТЗвыгрузки.Включить = 0;
	КонецЦикла;
	Для каждого стрТЗвыгрузки из ОбработкаОбмена.ТаблицаПравилВыгрузки.Строки.НайтиСтроки(Новый Структура("Имя",_имяПВД),Истина) Цикл
		стрТЗвыгрузки.Включить = 1;
	КонецЦикла;
КонецЕсли;

// Собственно сама выгрузка
ОбработкаОбмена.ВыполнитьВыгрузку();

// загрузка не нужна, т.к. механизм сам загрузит данные используя свой же online-обмен

P.S.

Итого имеем:

  • универсальный механизм для загрузки любой информации из любого источника с использованием всем известного продукта (1С:Конвертация данных 2.1);
  • правила загрузки понятны и легко модифицируемы - нет необходимости копаться в коде для понимания взаимосвязей загружаемых данных;

Есть планы по созданию БСП-совместимой универсальной обработки заполнения (фактически она создана, но пока не готова к публикации - в ней еще много наколенных методов) - идея в том, что все параметры обработки описываются в правилах обмена, команды = ПВД, параметры = JSON-комментарий, остальное в процессе. Останется только подсунуть в обработку правила обмена в виде макета и загрузить ее в базу (Дополнительные отчеты и обработки).

Всем спасибо за чтение, комментарии, плюсы!

загрузка импорт конвертация ADO XML JSON

См. также

SALE! 20%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки

Обмен между базами 1C Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) в продаже с 2015 года, постоянно работаем над их развитием | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

45650 36520 руб.

04.08.2015    159686    363    267    

345

SALE! 15%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 22572 руб.

12.06.2017    134937    723    291    

388

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22449    19    1    

22

SALE! 20%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

34650 27720 руб.

15.04.2019    68418    178    138    

111

SALE! 20%

Перенос данных из ERP 2 / КА 2 в ЗУП 3. Переносятся остатки, документы и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Воспользовались более 79 предприятий! | Предлагаем приобрести готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | В продаже с 2020г. | Оперативно обновляем правила до актуальных релизов 1С | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

43450 34760 руб.

03.12.2020    34169    80    58    

78

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.87.x) и УТ 11.5 (11.5.16.x).

28000 25200 руб.

23.07.2020    46301    196    64    

158

SALE! 10%

Перенос данных из БП 3.0 в УТ 11 / КА 2 / ERP 2. Переносятся начальные остатки, документы и справочники

Обмен между базами 1C Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

В продаже с 2014г. | Воспользовались более 122 предприятий! | Перенос данных из БП 3.0 в УТ 11 | из БП 3.0 в КА 2 | из БП 3.0 в ERP | Сэкономьте свое время - используйте готовое решение для перехода! | Постоянно работаем над развитием переноса данных | Обновляем на новые релизы 1С | Есть фильтр выгрузки по организациям | Переносятся начальные остатки на выбранную дату, документы за период времени и вся возможная справочная информация | Перенос сделан на технологии КД 2 (правила конвертации данных)

50722 45650 руб.

31.10.2014    231408    124    327    

296

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9208    9    8    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Somebody1 68 29.08.16 08:18 Сейчас в теме
По-моему, ничего лучше этого нет.
shaykhelov; Kvitka_ru; +2 Ответить
3. serg_infostart 386 29.08.16 10:24 Сейчас в теме
(1) Somebody1, я не использовал это. Но наверное крутая штука, навороченная. Но, честно, я как-то не очень доверяю навороченным штукам. Хотя, если разобраться один раз, полагаю, что можно успешно использовать.
У меня все просто - обычная конвертация, принцип загрузки откуда угодно (формируем структуры из любых данных), кусок кода (достаточно маленький и простой для проверки), включающий online-обмен.
2. unichkin 1559 29.08.16 09:25 Сейчас в теме
А можно еще создать внешний источник данных, подключающийся по нужному запросу к внешней БД, и при разработке правил пользоваться уже им...
4. serg_infostart 386 29.08.16 10:28 Сейчас в теме
(2) unichkin, а это уже доработка конфигурации. Да, внешние источники работают гораздо быстрее.
5. unichkin 1559 29.08.16 22:03 Сейчас в теме
(4) необязательно доработка. Для разового обмена можно просто пустую конфу создать
serg_infostart; +1 Ответить
6. Makushimo 160 30.08.16 09:32 Сейчас в теме
Все равно не понятно куда подсовывать эти волшебные куски кода.
Какие то важные части пазла остались у автора в голове.

Это круто, ...наверное.
7. serg_infostart 386 30.08.16 10:22 Сейчас в теме
(6) Makushimo, ведь русским по белому написано:
Этот код нужно добавить в правила обмена в глобальный обработчик конвертации ПередВыгрузкойДанных
.
Что тут не понятного?
На всякий случай расписал подробнее со ссылкой на картинку.
8. Kvitka_ru 14.07.17 12:53 Сейчас в теме
Статья просто супер!!!
Спасибо, дружище! Я делала загрузку из текстового файла.У меня все получилось!
9. avz_1C 10 24.01.18 20:12 Сейчас в теме
10. leosoft 165 22.05.18 10:52 Сейчас в теме
Интересная информация!

А что за функция
ВыполнитьПередачуИнформацииОНачалеОбменаВПриемник() ?

И еще я не понял -
"В качестве бонуса - шаблон внешней обработки заполнения, использующей правила конвертации для загрузки данных". Что-то я не вижу обработку?
11. ak0710 162 08.11.18 13:03 Сейчас в теме
Автор спасибо отличная идея, лежала на поверхности
12. sanya0873 25.04.19 06:57 Сейчас в теме
Автор, спасибо за статью!
Полезнейшая информация! Сейчас в работе сталкиваюсь с проблемой по этой теме... Возможно ли как нибудь получить Вашу консультацию? Буду признателен Вам за ответ!
13. alexpvs 63 27.11.19 08:00 Сейчас в теме
Использую подобный подход с преобразованием входящего файла в произвольном формате, преобразовании данных в наборы структур.. И вот с какой проблемой столкнулся: видимо из-за того, что в качестве источника используется нессылочный тип данных, в выходном файле многократно дублируются данные об объектах. Например, входной файл из 180 Мб превращается в выходной на 4.8 Гб.
К примеру, если есть несколько структур-документов, в которых в табличных частях есть структуры-номенклатуры, то в выходном файле будет несколько полных блоков для одной и той же номенклатуры, с разными НПП, вместо того чтобы был один блок номенклатуры в начале, а уже в блоках документов была бы отсылка по НПП к этому блоку.

Никто с таким не сталкивался?
14. alexpvs 63 27.11.19 10:17 Сейчас в теме
Сам спросил, сам и отвечу:
чтобы такого не происходило, надо "сказать" обработке V8Exchange запоминать выгруженные объекты. Типовая версия для объектов, у которых не определен ТипДанных для источника, не формирует КлючВыгруженныхДанных и не запоминает в соответствие выгруженные объекты. Надо самим формировать КлючВыгруженныхДанных на основании данных структуры
serg_infostart; +1 Ответить
Оставьте свое сообщение