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

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

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

55778 50200 руб.

04.08.2015    166466    333    277    

373

SALE! 20%

Перенос данных 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

26280 22338 руб.

12.06.2017    141522    798    297    

419

SALE! 10%

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

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

35000 31500 руб.

15.12.2021    24021    169    51    

127

SALE! 10%

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

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

35000 31500 руб.

23.07.2020    51267    228    69    

185

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

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

28500 руб.

15.11.2022    20686    21    49    

38

SALE! 10%

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

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

53111 47800 руб.

03.12.2020    36591    94    66    

89

SALE! 10%

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

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

55778 50200 руб.

29.10.2018    56208    59    105    

61

SALE! 10%

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

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    171177    303    257    

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

Это круто, ...наверное.
7. serg_infostart 390 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 Ответить
Оставьте свое сообщение