Часто возникает задача автоматизировать обмен данными между базами 1С. Один из распространенных сценариев — запустить выгрузку данных в XML-файл по внешнему событию, например, по HTTP-запросу, без участия пользователя. Рассмотрим, как программно, без открытия формы, вызвать стандартную обработку "Универсальный обмен данными в формате XML" (известную как "Загрузка_Выгрузка_xml") и выполнить выгрузку.
Ключевая идея заключается в том, что для программной работы с обработкой нам не нужно открывать ее интерфейс (форму). Вместо этого мы создаем в коде экземпляр объекта этой обработки и работаем с его свойствами и методами напрямую. Это позволяет полностью автоматизировать процесс.
Разберем по шагам, как это сделать на примере выгрузки данных (включая выгрузку и загрузку движений документа).
Обработки.Создать(). Если обработка встроена в конфигурацию, мы обращаемся к ней по имени.
// Создаем экземпляр стандартной обработки из конфигурации
ОбработкаВыгрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
РежимОбмена: Устанавливаем в значение "Выгрузка" (для сложных задач возможна выгрузка произвольным запросом).ИмяФайлаПравилОбмена: Полный путь к файлу правил обмена (.xml), который был создан в конфигурации "Конвертация данных".ИмяФайлаВыгрузки: Полный путь к файлу, в который будут сохранены данные. Важно: так как код выполняется на сервере (особенно в случае HTTP-сервиса), этот путь должен быть доступен с сервера 1С.ВыполнитьВыгрузку().
Попытка ... Исключение ... КонецПопытки для корректной обработки нештатных ситуаций и их логирования.
Рассмотрим обобщенный и правильный пример кода, который можно разместить в модуле HTTP-сервиса или в регламентном задании.
Процедура ВыполнитьАвтоматическуюВыгрузкуНоменклатуры()
// 1. Создаем объект обработки
ОбработкаВыгрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
// 2. Устанавливаем ключевые параметры
ОбработкаВыгрузки.РежимОбмена = "Выгрузка";
// Путь к файлу правил. Должен быть доступен на сервере!
ОбработкаВыгрузки.ИмяФайлаПравилОбмена = "C:\ExchangeRules\Rules_Nomenclature.xml";
// Путь для файла с данными. Каталог должен существовать!
ОбработкаВыгрузки.ИмяФайлаВыгрузки = "C:\ExchangeData\Nomenclature_export.xml";
// 3. Дополнительные параметры (по необходимости)
// Например, если нужно выгружать только измененные объекты, а не все подряд
ОбработкаВыгрузки.ВыгружатьТолькоИзменения = Ложь; // В данном случае выгружаем все
// Можно также программно задавать отборы, если это предусмотрено правилами
// Например, отбор по конкретной группе номенклатуры
// СтруктураОтборов = ОбработкаВыгрузки.ПолучитьСтруктуруОтборов();
// Если СтруктураОтборов.Свойство("Номенклатура") Тогда
// СтруктураОтборов.Номенклатура.Использование = Истина;
// СтруктураОтборов.Номенклатура.Значение = Справочники.Номенклатура.НайтиПоНаименованию("Компьютеры");
// СтруктураОтборов.Номенклатура.ВидСравнения = ВидСравнения.ВИерархии;
// ОбработкаВыгрузки.УстановитьОтборы(СтруктураОтборов);
// КонецЕсли;
// 4. Запускаем выгрузку с обработкой ошибок
Попытка
ОбработкаВыгрузки.ВыполнитьВыгрузку();
// Записываем в журнал регистрации информацию об успехе
ЗаписьЖурналаРегистрации("Обмен.Выгрузка",
УровеньЖурналаРегистрации.Информация, , ,
"Выгрузка номенклатуры успешно завершена в файл: " + ОбработкаВыгрузки.ИмяФайлаВыгрузки);
Исключение
// В случае ошибки получаем ее описание и логируем
ИнформацияОбОшибке = ИнформацияОбОшибке();
ТекстОшибки = "Ошибка при автоматической выгрузке номенклатуры: " + ИнформацияОбОшибке.Описание;
ЗаписьЖурналаРегистрации("Обмен.Выгрузка",
УровеньЖурналаРегистрации.Ошибка, , ,
ТекстОшибки);
КонецПопытки;
КонецПроцедуры
Этот код является надежным шаблоном для автоматизации выгрузки. Он создает обработку, настраивает ее и безопасно выполняет операцию, логируя как успех, так и возможные сбои.
В ходе обсуждения на форуме был поднят важный архитектурный вопрос: зачем использовать промежуточный файл, если данные передаются по HTTP? Выгрузка в файл на диске сервера, чтобы потом другая система его оттуда забрала, усложняет схему и создает дополнительную точку отказа (файловую систему).
Более современный подход — передавать XML-данные напрямую в теле HTTP-ответа. Схема работы при этом меняется:
Этот метод исключает работу с файловой системой, что делает обмен более надежным и быстрым, особенно если базы находятся в одной сети. Однако он может быть неэффективен для очень больших объемов данных, которые могут не поместиться в оперативную память или превысить лимиты HTTP-сервера.
ЗаписьЖурналаРегистрации для фиксации всех ключевых этапов и, что самое важное, всех ошибок.