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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

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

35000 руб.

15.11.2022    31252    46    49    

47

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

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

58000 руб.

04.08.2015    187624    448    302    

454

SALE! 15%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27633 руб.

12.06.2017    160837    968    321    

482

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

Переносите справочную информацию, остатки и документы из УПП 1.3 в Бухгалтерию 3.0 с помощью готовых правил. Переносится более 50 видов документов. Простой интерфейс и понятные настройки.

42000 руб.

15.12.2021    34228    259    64    

195

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 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" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    188298    359    289    

418

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

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

50600 руб.

21.05.2019    58111    81    131    

73

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

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

58000 руб.

15.04.2019    84123    225    175    

162

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

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

58000 руб.

29.10.2018    62824    82    132    

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

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

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

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

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