Использование 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

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

15.11.2022    16745    17    SQV0    48    

35

Перенос данных 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 руб.

12.06.2017    138330    764    294    

405

Перенос данных 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 руб.

04.08.2015    163003    372    273    

360

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

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.230.x) и БП 3.0 (3.0.156.x). Правила подходят для версии ПРОФ и КОРП.

28000 руб.

15.12.2021    21913    144    40    

104

Перенос данных 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 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

45650 руб.

15.04.2019    70484    174    146    

117

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

Переход и перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:ERP Управление предприятием 2.5 и 1С:Комплексную автоматизацию 2.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.227.x), ERP 2.5 (2.5.16.x), КА 2.5 (2.5.16.x) .

28000 руб.

24.06.2020    62450    51    27    

81

SALE! %

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

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос в продаже с 2015г., и мы постоянно работаем над его развитием. Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

45650 27000 руб.

24.04.2015    192608    143    241    

274

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

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

84000 руб.

19.08.2020    23331    21    1    

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

Это круто, ...наверное.
7. serg_infostart 388 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 166 22.05.18 10:52 Сейчас в теме
Интересная информация!

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

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

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