Как организовать автоматический односторонний обмен данными по правилам XML между самописной конфигурацией и 1С:Бухгалтерией

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке собственных решений на платформе 1С часто возникает задача передачи данных в типовые конфигурации, такие как Бухгалтерия предприятия 2.0. Если ваша конфигурация является узкоспециализированной («самописной»), использование Библиотеки стандартных подсистем (БСП) может быть избыточным из-за огромного количества зависимостей. В такой ситуации оптимальным решением становится использование механизма планов обмена совместно с обработкой Универсальный обмен данными XML. Рассмотрим подробно, как автоматизировать этот процесс, чтобы обмен запускался без участия пользователя.

Общая архитектура решения

Для реализации автоматического обмена нам потребуется подготовить несколько ключевых элементов в самописной конфигурации:

  1. План обмена: будет служить «фильтром» для регистрации только измененных данных.
  2. Обработка выгрузки: встроенная в конфигурацию универсальная обработка V8Exchan82.epf (или ее серверная версия).
  3. Макет с правилами: для хранения файла правил конвертации (XML), созданного в программе «1С:Конвертация данных».
  4. Программный код: процедура в общем модуле, которая соединит все части воедино.
  5. Регламентное задание: для запуска выгрузки по расписанию.

Шаг 1. Настройка Плана обмена

Прежде всего, создадим в конфигураторе новый объект типа ПланОбмена. В его состав необходимо включить все справочники и документы, которые вы планируете выгружать. Проанализируем важный момент: для того чтобы механизм регистрации изменений работал корректно, необходимо создать хотя бы один узел (помимо предопределенного), который будет представлять базу-приемник (Бухгалтерию).

Обратите внимание: если вы планируете получать подтверждение о приеме данных, в базе-приемнике также стоит создать аналогичный план обмена с тем же именем. Это позволит корректно управлять номерами сообщений.

Шаг 2. Хранение правил конвертации в макете

Чтобы автоматизация работала автономно, правила обмена не должны лежать в виде отдельного файла на диске, который может быть случайно удален. Мы сохраним их внутри конфигурации. Рассмотрим, как это сделать:

  1. Создадим в Плане обмена макет с типом Текстовый документ или Двоичные данные.
  2. Вставим туда содержимое XML-файла правил, полученного из «Конвертации данных».

В коде выгрузки мы будем извлекать эти правила следующим образом:


ПравилаТекст = ПланыОбмена.ИмяВашегоПлана.ПолучитьМакет("ПравилаОбмена").ПолучитьТекст();
ИмяФайлаПравил = ПолучитьИмяВременногоФайла("xml");
ТекстПравил = Новый ЗаписьТекста(ИмяФайлаПравил, КодировкаТекста.UTF8);
ТекстПравил.Записать(ПравилаТекст);
ТекстПравил.Закрыть();

Шаг 3. Программный вызов обработки универсального обмена

Разберем основной механизм выгрузки. Вместо ручного нажатия кнопок в интерфейсе Универсального обмена данными XML, мы создадим объект обработки программно и заполним его параметры. Это позволит нам использовать всю мощь стандартного движка конвертации в фоновом режиме.

Проанализируем пример кода для серверного модуля:


Процедура ВыполнитьАвтоматическуюВыгрузку(УзелПриемник) Экспорт
    
    // Подготовка файлов
    ИмяФайлаДанных = "C:\Exchange\ExportData.xml"; // Путь должен быть доступен серверу 1С
    ИмяФайлаПравил = ПолучитьИмяВременногоФайла("xml");
    
    // Извлекаем правила из макета (как описано выше)
    // ...
    
    // Создаем объект обработки
    Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    Обработка.РежимОбмена = "Выгрузка";
    Обработка.ИмяФайлаПравил = ИмяФайлаПравил;
    Обработка.ИмяФайлаДанных = ИмяФайлаДанных;
    
    // Указываем узел, по которому берем изменения
    Обработка.УзелОбменаДляВыгрузки = УзелПриемник;
    
    // Если нужно передать параметры в правила конвертации
    // Обработка.ПараметрыОбмена.Вставить("ОрганизацияВыгрузки", Справочники.Организации.НайтиПоКоду("001"));
    
    // Выполняем выгрузку
    Обработка.ВыполнитьВыгрузку();
    
    // Очистка временных файлов
    Попытка
        УдалитьФайлы(ИмяФайлаПравил);
    Исключение
    КонецПопытки;

КонецПроцедуры

Шаг 4. Управление регистрацией изменений

Выясним важный нюанс: если мы просто выгрузим данные, они останутся зарегистрированными в плане обмена, и при следующем запуске программа снова попытается их выгрузить. Чтобы этого избежать, нужно «сбросить» регистрацию. В ручном режиме обработка делает это автоматически при успешном завершении, но в коде мы можем управлять этим процессом через НомерСообщения.

Рассмотрим правильную последовательность действий:

  1. Перед началом выгрузки фиксируем текущий НомерОтправленного сообщения в узле.
  2. После успешного завершения метода ВыполнитьВыгрузку() вызываем очистку регистрации:

ПланыОбмена.УдалитьРегистрациюИзменений(УзелПриемник, НомерСформированногоСообщения);

Важно: делайте это только в том случае, если вы уверены, что файл данных успешно сформирован. В идеале подтверждение должно приходить из базы-приемника после загрузки, но для одностороннего «простого» обмена достаточно факта успешной генерации файла.

Шаг 5. Настройка загрузки в Бухгалтерии

Чтобы обмен был полностью автоматизированным, на стороне Бухгалтерии 2.0 также должно работать регламентное задание. Оно должно проверять наличие файла в папке обмена и запускать ту же обработку Универсальный обмен данными XML, но уже в режиме Загрузка.

Посмотрим на пример параметров для загрузки:


Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Загрузка";
Обработка.ИмяФайлаДанных = "C:\Exchange\ExportData.xml";
Обработка.ВыполнитьЗагрузку();

Особенности работы в фоновом режиме

Поскольку регламентные задания выполняются в фоновом режиме на сервере, необходимо учитывать следующие ограничения:

Оптимизация при больших объемах данных

Если в вашей «самописке» фиксируется огромное количество мелких платежей (как упоминалось в обсуждении темы), файл XML может вырасти до гигантских размеров. Чтобы сервер не «упал» по памяти, в настройках обработки (в правилах конвертации) включите опцию «Выгружать объекты порциями». В коде вызова это настраивается через свойство КоличествоОбъектовНаУзел. Программа будет записывать данные в файл постепенно, очищая оперативную память после каждой порции.

Таким образом, мы получили надежный и легковесный механизм обмена, который не требует внедрения тяжелых подсистем БСП и полностью контролируется программным кодом вашей конфигурации.

← На главную