При разработке собственных решений на платформе 1С часто возникает задача передачи данных в типовые конфигурации, такие как Бухгалтерия предприятия 2.0. Если ваша конфигурация является узкоспециализированной («самописной»), использование Библиотеки стандартных подсистем (БСП) может быть избыточным из-за огромного количества зависимостей. В такой ситуации оптимальным решением становится использование механизма планов обмена совместно с обработкой Универсальный обмен данными XML. Рассмотрим подробно, как автоматизировать этот процесс, чтобы обмен запускался без участия пользователя.
Для реализации автоматического обмена нам потребуется подготовить несколько ключевых элементов в самописной конфигурации:
V8Exchan82.epf (или ее серверная версия).Прежде всего, создадим в конфигураторе новый объект типа ПланОбмена. В его состав необходимо включить все справочники и документы, которые вы планируете выгружать. Проанализируем важный момент: для того чтобы механизм регистрации изменений работал корректно, необходимо создать хотя бы один узел (помимо предопределенного), который будет представлять базу-приемник (Бухгалтерию).
Обратите внимание: если вы планируете получать подтверждение о приеме данных, в базе-приемнике также стоит создать аналогичный план обмена с тем же именем. Это позволит корректно управлять номерами сообщений.
Чтобы автоматизация работала автономно, правила обмена не должны лежать в виде отдельного файла на диске, который может быть случайно удален. Мы сохраним их внутри конфигурации. Рассмотрим, как это сделать:
Плане обмена макет с типом Текстовый документ или Двоичные данные.В коде выгрузки мы будем извлекать эти правила следующим образом:
ПравилаТекст = ПланыОбмена.ИмяВашегоПлана.ПолучитьМакет("ПравилаОбмена").ПолучитьТекст();
ИмяФайлаПравил = ПолучитьИмяВременногоФайла("xml");
ТекстПравил = Новый ЗаписьТекста(ИмяФайлаПравил, КодировкаТекста.UTF8);
ТекстПравил.Записать(ПравилаТекст);
ТекстПравил.Закрыть();
Разберем основной механизм выгрузки. Вместо ручного нажатия кнопок в интерфейсе Универсального обмена данными XML, мы создадим объект обработки программно и заполним его параметры. Это позволит нам использовать всю мощь стандартного движка конвертации в фоновом режиме.
Проанализируем пример кода для серверного модуля:
Процедура ВыполнитьАвтоматическуюВыгрузку(УзелПриемник) Экспорт
// Подготовка файлов
ИмяФайлаДанных = "C:\Exchange\ExportData.xml"; // Путь должен быть доступен серверу 1С
ИмяФайлаПравил = ПолучитьИмяВременногоФайла("xml");
// Извлекаем правила из макета (как описано выше)
// ...
// Создаем объект обработки
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Выгрузка";
Обработка.ИмяФайлаПравил = ИмяФайлаПравил;
Обработка.ИмяФайлаДанных = ИмяФайлаДанных;
// Указываем узел, по которому берем изменения
Обработка.УзелОбменаДляВыгрузки = УзелПриемник;
// Если нужно передать параметры в правила конвертации
// Обработка.ПараметрыОбмена.Вставить("ОрганизацияВыгрузки", Справочники.Организации.НайтиПоКоду("001"));
// Выполняем выгрузку
Обработка.ВыполнитьВыгрузку();
// Очистка временных файлов
Попытка
УдалитьФайлы(ИмяФайлаПравил);
Исключение
КонецПопытки;
КонецПроцедуры
Выясним важный нюанс: если мы просто выгрузим данные, они останутся зарегистрированными в плане обмена, и при следующем запуске программа снова попытается их выгрузить. Чтобы этого избежать, нужно «сбросить» регистрацию. В ручном режиме обработка делает это автоматически при успешном завершении, но в коде мы можем управлять этим процессом через НомерСообщения.
Рассмотрим правильную последовательность действий:
НомерОтправленного сообщения в узле.ВыполнитьВыгрузку() вызываем очистку регистрации:
ПланыОбмена.УдалитьРегистрациюИзменений(УзелПриемник, НомерСформированногоСообщения);
Важно: делайте это только в том случае, если вы уверены, что файл данных успешно сформирован. В идеале подтверждение должно приходить из базы-приемника после загрузки, но для одностороннего «простого» обмена достаточно факта успешной генерации файла.
Чтобы обмен был полностью автоматизированным, на стороне Бухгалтерии 2.0 также должно работать регламентное задание. Оно должно проверять наличие файла в папке обмена и запускать ту же обработку Универсальный обмен данными XML, но уже в режиме Загрузка.
Посмотрим на пример параметров для загрузки:
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Загрузка";
Обработка.ИмяФайлаДанных = "C:\Exchange\ExportData.xml";
Обработка.ВыполнитьЗагрузку();
Поскольку регламентные задания выполняются в фоновом режиме на сервере, необходимо учитывать следующие ограничения:
Предупреждение(), Вопрос() или Сообщить(). Проверьте встроенную обработку V8Exchan82 — иногда в старых версиях встречаются команды открытия форм, их нужно закомментировать или обернуть в проверку #Если Клиент.ИмяВременногоФайла(), чтобы избежать конфликтов при одновременном выполнении нескольких заданий.Если в вашей «самописке» фиксируется огромное количество мелких платежей (как упоминалось в обсуждении темы), файл XML может вырасти до гигантских размеров. Чтобы сервер не «упал» по памяти, в настройках обработки (в правилах конвертации) включите опцию «Выгружать объекты порциями». В коде вызова это настраивается через свойство КоличествоОбъектовНаУзел. Программа будет записывать данные в файл постепенно, очищая оперативную память после каждой порции.
Таким образом, мы получили надежный и легковесный механизм обмена, который не требует внедрения тяжелых подсистем БСП и полностью контролируется программным кодом вашей конфигурации.