Как настроить двусторонний обмен данными между БП 1.6 и ERP 2: выбор между КД 2.1 и КД 3 с реализацией квитирования

Программист 1С v8.3 (Обычные формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

Интеграция устаревших конфигураций на обычных формах (таких как 1С:Бухгалтерия предприятия 1.6) с современными флагманскими решениями вроде 1С:ERP Управление предприятием 2 — задача нетривиальная. Основная сложность заключается в колоссальном технологическом разрыве между конфигурациями. БП 1.6 создавалась во времена платформы 1С 8.1, в то время как ERP 2 базируется на современных стандартах БСП, управляемых формах и формате обмена EnterpriseData (КД 3).

В этой статье мы подробно разберем, как решить проблему двустороннего обмена, не допуская критического разрастания файлов обмена, и как правильно реализовать механизм квитирования (подтверждения доставки сообщений) с использованием планов обмена. Мы детально проанализируем подходы с использованием Конвертации данных 2.1 и Конвертации данных 3.0.

---

Решение 1: Организация двустороннего обмена в КД 2.1 с механизмом квитирования

Частой ошибкой при настройке обмена через КД 2.1 является выгрузка всех данных без учета их изменений в базе-источнике (как описано в сообщении 8). Это приводит к тому, что файл обмена ежедневно разрастается, а время его загрузки увеличивается в геометрической прогрессии. Чтобы избежать этого, мы применим стандартный механизм платформы 1С — инфраструктуру сообщений обмена на базе планов обмена.

Суть механизма квитирования (подтверждения получения) заключается в следующем:

  1. В базе-источнике (БП 1.6) создается специализированный план обмена, на узлах которого регистрируются измененные объекты.
  2. При выгрузке формируется XML-документ, обернутый в сообщение обмена. В заголовке сообщения фиксируется уникальный номер отправленного пакета (например, НомерОтправленного = 10).
  3. Приемник (ERP) считывает файл, загружает данные и запоминает, что он успешно обработал пакет №10.
  4. При обратной выгрузке (из ERP в БП) в заголовок файла-ответа записывается подтверждение: НомерПринятого = 10.
  5. При загрузке этого ответа в БП 1.6 платформа считывает заголовок и автоматически очищает регистрацию изменений для всех объектов, которые ушли в пакете №10 и ранее.

Рассмотрим, как реализовать этот процесс программно на стороне БП 1.6 с использованием обработки УниверсальныйОбменДаннымиXML.

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


Процедура ВыгрузитьДанныеСКвитированием(УзелСсылка, ПутьКФайлуОбмена, ПутьКПравилам) Экспорт
    
    // Создаем запись XML и связываем её с файлом
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ПутьКФайлуОбмена, "UTF-8");
    
    // Инициализируем запись сообщения обмена для конкретного узла плана обмена
    ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
    ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелСсылка);
    
    // Инициализируем обработку "Универсальный обмен данными XML"
    ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    ОбработкаОбмена.РежимОбмена = "Выгрузка";
    ОбработкаОбмена.ИмяФайлаПравилОбмена = ПутьКПравилам;
    ОбработкаОбмена.ЗагрузитьПравилаОбмена();
    
    // Важно: передаем подготовленный XML-поток внутрь обработки
    ОбработкаОбмена.ЗаписыватьВходныеПараметрыВЛог = Ложь;
    ОбработкаОбмена.УзелДляОбмена = УзелСсылка;
    ОбработкаОбмена.ВыгружатьТолькоРегистрированные = Истина;
    
    // Передаем открытый поток записи XML, чтобы обработка писала данные внутрь сообщения
    ОбработкаОбмена.ВыполнитьВыгрузкуПотоком(ЗаписьXML);
    
    // Завершаем запись сообщения обмена и закрываем файлы
    ЗаписьСообщения.ЗакончитьЗапись();
    ЗаписьXML.Закрыть();
    
    Сообщить("Выгрузка успешно завершена. Сформирован пакет № " + ЗаписьСообщения.НомерОтправленного);
    
КонецПроцедуры

Теперь разберем, как принять ответный файл в БП 1.6 и автоматически подтвердить получение данных в ERP (снять объекты с регистрации):


Процедура ЗагрузитьДанныеСПодтверждением(УзелСсылка, ПутьКФайлуОбмена) Экспорт
    
    // Инициализируем чтение XML файла
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ПутьКФайлуОбмена);
    
    // Создаем объект чтения сообщения обмена
    ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
    ЧтениеСообщения.НачатьЧтение(ЧтениеXML, УзелСсылка);
    
    // Инициализируем обработку загрузки
    ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    ОбработкаОбмена.РежимОбмена = "Загрузка";
    ОбработкаОбмена.ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина;
    ОбработкаОбмена.ЗагружатьДанныеВРежимеОбмена = Истина;
    
    // Запускаем загрузку данных из открытого потока XML
    ОбработкаОбмена.ВыполнитьЗагрузкуПотоком(ЧтениеXML);
    
    // Завершаем чтение сообщения. 
    // В этот момент платформа автоматически удаляет регистрацию изменений,
    // подтвержденную номером принятого сообщения из заголовка файла.
    ЧтениеСообщения.ЗакончитьЧтение();
    ЧтениеXML.Закрыть();
    
    Сообщить("Загрузка завершена. Подтвержден прием нашего пакета № " + ЧтениеСообщения.НомерПринятого);
    
КонецПроцедуры

---

Решение 2: Программное квитирование при прямом COM-подключении

Если вы хотите настроить обмен в режиме реального времени "источник-приемник" без промежуточных файлов (БП -> ERP напрямую через COM), то квитирование необходимо реализовать программным способом в рамках единой транзакции.

Рассмотрим алгоритм реализации прямого обмена с контролем транзакций:

  1. В БП 1.6 выбираются зарегистрированные изменения по конкретному узлу плана обмена.
  2. Объекты сериализуются в XML-строку с помощью правил КД 2.1.
  3. Через COM-соединение вызывается экспортная функция ERP, в которую передается эта XML-строка.
  4. ERP выполняет разбор XML и записывает данные в транзакции. Если запись прошла успешно, функция возвращает Истина.
  5. Получив успешный ответ от ERP, БП 1.6 в своей базе очищает регистрацию изменений для переданного массива объектов.

Пример программной реализации отправки данных через COM с очисткой регистрации:


Процедура ВыполнитьПрямойОбменЧерезCOM(УзелСсылка, ИмяСервера, ИмяБазы, Пользователь, Пароль) Экспорт
    
    // 1. Устанавливаем COM-соединение с базой ERP
    COMConnector = Новый COMObject("V83.COMConnector");
    Попытка
        СоединениеERP = COMConnector.Connect("Srvr=""" + ИмяСервера + """;Ref=""" + ИмяБазы + """;Usr=""" + Пользователь + """;Pwd=""" + Пароль + """;");
    Исключение
        Предупреждение("Не удалось установить соединение с ERP: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // 2. Выбираем измененные объекты, зарегистрированные на узле
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелСсылка, ВыборкаИзмененийНомерСообщения);
    МассивОбъектов = Новый Массив;
    
    Пока ВыборкаИзменений.Следующий() Цикл
        МассивОбъектов.Добавить(ВыборкаИзменений.Получить());
    КонецЦикла;
    
    Если МассивОбъектов.Количество() = 0 Тогда
        Сообщить("Нет зарегистрированных изменений для выгрузки.");
        Возврат;
    КонецЕсли;
    
    // 3. Выгружаем данные во временный XML-файл в памяти
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
    
    ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    ОбработкаОбмена.РежимОбмена = "Выгрузка";
    ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Rules\Rules_BP_ERP.xml";
    ОбработкаОбмена.ЗагрузитьПравилаОбмена();
    ОбработкаОбмена.УзелДляОбмена = УзелСсылка;
    ОбработкаОбмена.ВыгружатьТолькоРегистрированные = Истина;
    ОбработкаОбмена.ИмяФайлаОбмена = ИмяВременногоФайла;
    ОбработкаОбмена.ВыполнитьВыгрузку();
    
    // Читаем сформированный XML в строку
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.Прочитать(ИмяВременногоФайла, КодировкаТекста.UTF8);
    ДанныеДляПередачи = ТекстовыйДокумент.ПолучитьТекст();
    
    // 4. Передаем данные в ERP через COM
    Попытка
        // На стороне ERP должна быть создана общая функция ЗагрузитьДанныеИзБП в общем модуле
        РезультатЗагрузки = СоединениеERP.ОбменДаннымиСервер.ЗагрузитьДанныеИзБП(ДанныеДляПередачи);
    Исключение
        РезультатЗагрузки = Ложь;
        Сообщить("Ошибка вызова метода в ERP: " + ОписаниеОшибки());
    КонецПопытки;
    
    // 5. Квитирование: если ERP подтверждает успешный импорт, снимаем регистрацию в БП
    Если РезультатЗагрузки Тогда
        НачатьТранзакцию();
        Попытка
            ПланыОбмена.УдалитьРегистрациюИзменений(УзелСсылка, МассивОбъектов);
            ЗафиксироватьТранзакцию();
            Сообщить("Данные успешно доставлены в ERP, регистрация изменений очищена.");
        Исключение
            ОтменитьТранзакцию();
            Сообщить("Ошибка очистки регистрации изменений: " + ОписаниеОшибки());
        КонецПопытки;
    Иначе
        Сообщить("Загрузка на стороне ERP завершилась ошибкой. Регистрация изменений сохранена.");
    EndIf;
    
    // Очищаем временные файлы
    УдалитьФайлы(ИмяВременногоФайла);
    
КонецПроцедуры

---

Решение 3: Внедрение EnterpriseData (КД 3) в БП 1.6 — реальность и сложности

Идея внедрить современный формат обмена EnterpriseData (ED) в БП 1.6 выглядит крайне привлекательно, поскольку ERP уже имеет встроенные механизмы для работы с этим стандартом. Однако при реализации этого пути на практике мы неизбежно столкнемся с серьезными техническими препятствиями:

  1. Режим совместимости платформы: Конфигурация БП 1.6 разрабатывалась под платформу 1С 8.1. Если запустить её на современной платформе 8.3, она, скорее всего, продолжит работать в режиме совместимости "Версия 8.1" или "Версия 8.2.13". Механизмы ED используют сериализацию XDTO, работу с JSON, новые строковые функции и методы работы с UUID, которые физически заблокированы платформой в старых режимах совместимости. Попытка полностью отключить режим совместимости в БП 1.6 приведет к массовым синтаксическим ошибкам в старом коде конфигурации.
  2. Методологические отличия метаданных: Типовые правила обмена КД 3 ориентированы на БП 3.0. Структура хранения данных в БП 1.6 принципиально отличается:
    • В БП 1.6 используется старый партионный учет и иная структура субконто на плане счетов.
    • Регистры учета НДС в БП 1.6 абсолютно не совпадают с современной моделью НДС в ERP 2.
    • Аналитические разрезы справочников договоров, контрагентов и складов требуют глубокого переосмысления и ручного сопоставления.

Как обойти ограничения с помощью внешней обработки-адаптера:

Если внедрять полноценную БСП для интеграции КД 3 в БП 1.6 нецелесообразно, можно применить подход внешнего адаптера. Для этого используется внешняя обработка, которая эмулирует работу механизмов EnterpriseData:

---

Итоговые рекомендации: какую технологию обмена выбрать?

Проанализируем обе технологии и примем взвешенное решение на основе жизненного цикла ваших систем:

Критерий сравнения Конвертация данных 2.1 (XML-формат) Конвертация данных 3.0 (EnterpriseData)
Сложность внедрения на БП 1.6 Низкая. Требуется минимальная доработка существующих планов обмена. Работает на любых версиях платформы и совместимости. Очень высокая. Требуется адаптация XDTO-схем, перенос общих модулей БСП или покупка/разработка внешнего адаптера.
Стабильность при обновлениях ERP Средняя. При изменении метаданных ERP правила в КД 2.1 придется обновлять вручную. Высокая. ERP поддерживает формат EnterpriseData "из коробки" и обеспечивает обратную совместимость версий формата.
Производительность Высокая при использовании планов обмена и механизмов квитирования. Высокая за счет оптимизированных механизмов БСП, но требует больших ресурсов процессора на сериализацию.

Наш вердикт:

← На главную