Перейти к основному содержимому

Универсальный обмен данными 1С

Разработчику Архитектору

Что такое универсальный обмен

Универсальный механизм обмена — это использование плана обмена, регистрации изменений и XML для схем, которые не укладываются в жёсткие правила РИБ:

  • разные конфигурации 1С (УТ и Бухгалтерия);
  • обмен с сторонней системой через файлы или свой транспорт;
  • произвольная топология без «главного офиса»;
  • ручная сериализация отдельных полей или типов.

РИБ можно рассматривать как специализацию с дополнительным протоколом (конфигурация в сообщении, начальный образ). Универсальный обмен — максимальная свобода и максимум кода на стороне разработчика.


Стек технологий

КомпонентРоль
План обменаУзлы, состав, события — см. 136.md
Регистрация измененийЗарегистрироватьИзменения, ВыбратьИзменения
Инфраструктура сообщенийЗаписьСообщенияОбмена, ЧтениеСообщенияОбмена
XML-сериализацияЗаписатьXML, ПрочитатьXML, ручные элементы
ТранспортКаталог, FTP, почта, HTTP — по выбору проекта

Формат носителя может быть не только XML, но объекты ЗаписьСообщения / ЧтениеСообщения работают поверх ЗаписьXML / ЧтениеXML.


Цикл выгрузки и загрузки

Выгрузка:

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);

Узел = ПланыОбмена.ОбменСКонтрагентом.НайтиПоКоду("CRM");
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Узел);

Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗаписьСообщения.НомерСообщения);
Пока Выборка.Следующий() Цикл
Данные = Выборка.Получить();
ЗаписатьXML(ЗаписьXML, Данные);
КонецЦикла;

ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();

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

Загрузка:

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

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

Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
Данные = ПрочитатьXML(ЧтениеXML);
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЦикла;

ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();

Имена файлов часто стандартизируют, например Message_<КодОтправителя>_<КодПолучателя>.xml в общем каталоге.


Ручная сериализация

Когда структура не совпадает один к одному, в XML пишут кастомные элементы или выбирают подмножество реквизитов:

ЗаписьXML.ЗаписатьНачалоЭлемента("CatalogObject.Номенклатура.Вручную");
ЗаписатьXML(ЗаписьXML, Объект.Код, "Code", НазначениеТипаXML.Явное);
ЗаписатьXML(ЗаписьXML, Объект.Наименование, "Description", НазначениеТипаXML.Явное);
ЗаписьXML.ЗаписатьКонецЭлемента();

На приёме — своя функция ПрочитатьДанные() с проверкой ПолучитьXMLТип(). Так строят обмен с legacy-форматами и «урезанными» контрактами.

Служебная информация в теле сообщения (метаданные пакета, команды для принимающей стороны) — отдельные XML-элементы до или после блока изменений.


Транзакции

ПодходПлюсМинус
Одна транзакция на весь пакет (ЗаписатьИзменения(..., 0))Согласованность, скорость в файловой ИБДолгие блокировки
Пакеты по N объектов (1000)Баланс параллельности и скоростиСложнее откат «на полпути»

При ошибке на середине пакета используют НачатьТранзакцию / ОтменитьТранзакцию и журнал статусов пакета — см. 119.md.


Односторонний обмен

Иногда данные идут только в одну сторону (витрина в DWH, выгрузка в гос. систему). Тогда:

  • регистрируют изменения только для «исходящего» узла;
  • обработчики приёма отключены или игнорируют входящие типы;
  • регистрацию очищают после успешной отправки без ожидания ответного сообщения.

Для получения без обратной регистрации используют отдельный контур (HTTP, ВИД).


Автоматизация

Типовой продакшен-контур:

  1. Регламентное задание на сервере — выгрузка/загрузка по расписанию.
  2. Каталог обмена или FTP — транспорт файлов.
  3. Регистр сведений — статус пакета, ошибка, повтор.
  4. Оповещение администратора при сбое.

Запуск из клиента по кнопке оставляют для отладки; в проде — только сервер.


EnterpriseData и типовые правила

Для обмена между типовыми и смежными решениями 1С (Бухгалтерия, ЗУП, ERP) фирма «1С» поставляет формат EnterpriseData и правила Конвертация данных 2.0/3.0 — поверх тех же планов обмена и XML, но с готовой моделью объектов и картой соответствия реквизитов.

Свой универсальный обменEnterpriseData
КонтрактПроектируете выСтандарт 1С
КонвертацияBSL + XDTO вручнуюПравила конвертации
СтартЛюбая нетиповая схемаСвязка типовых продуктов

Детали формата — в документации ИТС и типовых обработках обмена; в энциклопедии достаточно знать, что это готовый слой над механизмом из 136.md.


Когда что выбирать

СценарийРешение
Два филиала, одна конфигурацияРИБ
УТ → БухгалтерияEnterpriseData или свой универсальный обмен
Сайт, JSON, RESTHTTP-сервисы / OData
Staging в PostgreSQLВнешний источник данных
Уникальный XML контрагентУниверсальный обмен (эта статья)

Типичные ошибки

  1. Нет ОбменДанными.Загрузка = Истина — срабатывают лишние проверки и повторная регистрация.
  2. Коллизии кодов в разных узлах — нужны префиксы номеров или GUID обмена.
  3. Огромный пакет в одной транзакции — блокировка пользователей.
  4. Смешение РИБ и «универсала» в одном плане без понимания протокола РИБ.

Связанные материалы


Проверка себя

  • Чем универсальный обмен отличается от РИБ по конфигурациям?
  • Когда вызовете УдалитьРегистрациюИзменений — до или после доставки?
  • В каком случае EnterpriseData предпочтительнее своего XML?

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").