HelpF.pro

Автоматизация обмена данных используя обработку "Универсальный обмен данными в формате XML"

Автоматизация обмена между базами используя обработку "Универсальный обмен данными в формате XML"
В основу данной публикации положены найденные мною материалы по cозданию обмена между двумя базами с использованием обработки "Универсальный обмен данными в формате XML" . Но предлагается вариант автоматизации решения задачи которая позволяет выполнять обмен неквалифицированным пользователям, либо по регламенту. Скажем такой обмен применим если вы не можите по ряду причин использовать РБД, либо совсем разные конфигурации баз (случаи бывают разные, а хочется максимально настраиваемой гибкости).

Вначале безусловно воспользуемся конфигурацией "Конвертация данных" чтобы создать необходимые нам правила обмена (как - это отдельная тема).
Итак Собственно сама ВЫГРУЗКА:
Код 1C v 8.х
 Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Выгрузка";
Обработка.ВыводВОкноСообщенийИнформационныхСообщений = Истина;
При необходимости можно задать период выгрузки (как пример):
Обработка.ДатаНачала = ТекущаяДата();
Обработка.ДатаОкончания = ТекущаяДата();

Обработка.ИмяФайлаПравилОбмена = "D:\ПравилаОбменаДанными.xml";
Источник = ЭтотОбъект.Ссылка;
ИмяФайла = Строка(ТипЗнч(Источник)) + " " + Строка(Источник.Номер);
Обработка.ИмяФайлаОбмена = "D:\E\"+ Источник +".xml";
Обработка.ЗагрузитьПравилаОбмена();
Основные параметры мы определили, теперь надо настроить отбор, если в этом нет необходимости то просто запускаете выгрузку:
Обработка.ВыполнитьВыгрузку();


Настройка ОТБОРА:
Тут надо обратить внимание на массив "ВременнаяТаблицаПравил.Строки[1]" и в частности на индекс массива строк,
1 - это ветка "Справочники". Ну и так далее по аналогии
Код 1C v 8.х
 ВременнаяТаблицаПравил = Обработка.ТаблицаПравилВыгрузки.Скопировать();
Для Каждого СтрокаУровня2 Из ВременнаяТаблицаПравил.Строки[1].Строки Цикл
Наименование = СтрокаУровня2.Имя;
Если Наименование <> "ПеремещениеТоваров00001" Тогда
СтрокаУровня2.Включить = 0;
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаУровня2 Из ВременнаяТаблицаПравил.Строки[2].Строки Цикл
Наименование = СтрокаУровня2.Имя;
Если Наименование <> "ПеремещениеТоваров00001" Тогда
СтрокаУровня2.Включить = 0;
КонецЕсли;
КонецЦикла;

Сдесь вы определяете искомое правило выгрузки которое нужно оставить включенным на определенной ветке (сами можите варьировать чего и сколько)
Код 1C v 8.х
  Для Каждого СтрокаУровня2 Из ВременнаяТаблицаПравил.Строки[0].Строки Цикл
Наименование = СтрокаУровня2.Имя;
Если Наименование = "ПеремещениеТоваров00001" Тогда
СтрокаУровня2.Включить = 1;
Иначе
СтрокаУровня2.Включить = 0;
КонецЕсли;
КонецЦикла;
Обработка.ТаблицаПравилВыгрузки = ВременнаяТаблицаПравил.Скопировать();

Теперь настраиваем ОТБОР смысл которого передать в нашу выгрузку ссылку на документ(ты) который(е) хотим выгрузить:
Код 1C v 8.х
 Для Каждого СтрокаУровня2 Из ВременнаяТаблицаПравил.Строки[0].Строки Цикл
Наименование = СтрокаУровня2.Имя;
Если Наименование = "ПеремещениеТоваров00001" Тогда
ТекущееПВД = СтрокаУровня2;

Построитель = Новый ПостроительОтчета;
Если ТекущееПВД.ИмяОбъектаДляЗапроса <> Неопределено Тогда

Построитель.Текст =
"ВЫБРАТЬ Разрешенные _.* ИЗ " + ТекущееПВД.ИмяОбъектаДляЗапроса + " КАК _
|
|
|{ГДЕ _.Ссылка.* КАК " + СтрЗаменить(ТекущееПВД.ИмяОбъектаДляЗапроса, ".", "_") + "}";
КонецЕсли;

Отбор = Построитель.Отбор;

Если Отбор.Найти("Документ_ПеремещениеТоваров") = Неопределено Тогда
Отбор.Добавить("Документ_ПеремещениеТоваров");
КонецЕсли;

Массив = Новый Массив;
Массив.Добавить(Тип("ДокументСсылка.ПеремещениеТоваров"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , );

Отбор["Документ_ПеремещениеТоваров"].Использование = Истина;
Отбор["Документ_ПеремещениеТоваров"].Значение = ЭтотОбъект.Ссылка;
Отбор["Документ_ПеремещениеТоваров"].ВидСравнения = ВидСравнения.Равно;

ДоступностьПостроителя = Истина;
Если Построитель.Отбор.Количество() > 0 Тогда
ТекущееПВД.НастройкиПостроителя = Построитель.ПолучитьНастройки();
ТекущееПВД.ИспользоватьОтбор = ИСТИНА;
КонецЕсли;
КонецЕсли;
КонецЦикла;


Обработка.ТаблицаПравилВыгрузки = ВременнаяТаблицаПравил.Скопировать();
Ну и собственно запускаем саму выгрузку и получаем файл для загрузки:
Код 1C v 8.х
    Обработка.АрхивироватьФайл = Истина;
Обработка.ВыполнитьВыгрузку();


Далее процесс загрузки:
Он довольно прост
Код 1C v 8.х
  МассивФайлов = НайтиФайлы("D:\E\", "*.zip");
Для Каждого Стм Из МассивФайлов Цикл
ТекстВопроса = "Загрузить - " + Стм.ПолноеИмя;
Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да);
Если Ответ = КодВозвратаДиалога.Да Тогда
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.ИмяФайлаОбмена = Стм.ПолноеИмя;
Обработка.РежимОбмена = "Загрузка";
Обработка.ЗаписыватьРегистрыНаборамиЗаписей = Истина;
Обработка.ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина;
Обработка.ЗагружатьДанныеВРежимеОбмена = Истина;
Обработка.ВыполнитьЗагрузку();
УдалитьФайлы(Стм.ПолноеИмя);
КонецЕсли;
КонецЦикла;

Расширение .zip для файлов обмена пусть вас не смущает, обработка самостоятельно упакует .xml файл в архив:
Код 1C v 8.х
  Обработка.АрхивироватьФайл = Истина;   

И также самостоятельно уже без дополнительных указаний распакует и загрузит. Это существенно уменьшает размеры файла обмена.
Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1287.html