В практике разработчика 1С часто возникают ситуации, когда необходимо реализовать интеграцию с внешней системой, но основная конфигурация находится на строгой поддержке («замок»), и вносить изменения в её структуру запрещено корпоративными правилами или требованиями поставщика. В таких случаях на помощь приходят расширения. Рассмотрим подробнее, как реализовать механизм обмена данными, используя ПланОбмена, созданный непосредственно в расширении.
Проанализируем типичную ситуацию: вам нужно настроить выгрузку данных из 1С в стороннюю систему (например, в «Галактику» или другую ERP-систему). Для этого необходимо отслеживать изменения объектов (справочников, документов, регистров), используя генератор структуры метаданных объекта. Если типовые планы обмена не содержат нужных объектов или типов XDTO, а менять основную конфигурацию нельзя, создание собственного плана обмена в расширении становится единственным легитимным выходом.
Разберем по шагам, какие возможности это открывает и с какими подводными камнями нам придется столкнуться.
Прежде чем приступать к разработке, выясним возможности платформы. Работа с планами обмена в расширениях была существенно доработана в последних версиях. Мы рекомендуем использовать платформу не ниже 8.3.14, так как в более ранних версиях (начиная с 8.3.11) могли возникать сложности с корректным хранением таблиц регистрации изменений при обновлении или переподключении расширения.
Важное ограничение: создание Распределенной Информационной Базы (РИБ) через расширение невозможно. Флаг Распределенная информационная база в свойствах плана обмена внутри расширения будет недоступен. План обмена в расширении предназначен только для «обычного» обмена (универсальный механизм обмена данными) — есть универсальный обмен данными между конфигурациями 1С.
Рассмотрим процесс создания объекта. В дереве объектов расширения добавим новый ПланОбмена. Назовем его, например, _ДопОбменСВнешнейСистемой. Также может быть полезна регистрация или удаление объектов из плана обмена с формы — для этого подойдёт инструмент управления регистрацией объектов для планов обмена.
Посмотрим на вкладку Состав. Здесь мы можем указать объекты, изменения которых будут фиксироваться. Важный момент: мы можем добавлять в состав как объекты, созданные в самом расширении, так и объекты основной конфигурации (предварительно добавив их в расширение). При этом свойство Авторегистрация будет работать штатно, позволяя платформе автоматически фиксировать изменения в таблице регистрации при записи объекта.
Проанализируем настройку Авторегистрации. Если вы используете режим совместимости ниже 8.3.11, механизм может работать нестабильно. Убедитесь, что в свойствах расширения установлен актуальный режим совместимости, соответствующий версии платформы.
Часто обмен требует специфических форматов данных. Если в основной конфигурации нет нужных пакетов XDTO, мы можем создать их прямо в расширении. Однако здесь возникает программная сложность. Типовые обработки (например, «Универсальный обмен данными в формате XML») могут не увидеть типы из расширения автоматически. В таких случаях пригодится универсальная выгрузка документов и их движений в формат JSON.
Разберем, как обойти эту проблему. Нам потребуется использовать СериализаторXDTO, инициализированный с учетом контекста расширения. Посмотрим на пример кода, который позволяет выгрузить объект, используя типы из нашего расширения или адаптивную выгрузку и загрузку данных XML:
// Пример получения сериализатора с учетом пакетов расширения
МойПакет = ФабрикаXDTO.Пакеты.Получить("http://www.example.org/my-ext-exchange");
ОбъектXDTO = СериализаторXDTO.ЗаписатьДанные(СсылкаНаОбъект);
// Далее выполняем запись в файл или отправку через API
Если же мы используем механизмы БСП (Библиотеки стандартных подсистем), нам придется программно внедряться в модули, отвечающие за инициализацию обмена, чтобы «подсунуть» наш новый план обмена в общую структуру настроек.
В некоторых случаях автоматической регистрации недостаточно. Например, когда нужно регистрировать изменения только при выполнении определенных условий. В этом случае мы будем использовать программный метод ЗарегистрироватьИзменения().
Выясним, как это реализовать через подписки на события. Подписки также лучше создавать в расширении, чтобы сохранить чистоту основной конфигурации. Рассмотрим пример кода подписки на событие ПриЗаписи справочника Номенклатура:
Процедура _ПриЗаписиНоменклатурыДляОбмена(Источник, Отказ) Экспорт
// Получаем узел, для которого нужно зарегистрировать изменения
УзелОбмена = ПланыОбмена._ДопОбменСВнешнейСистемой.НайтиПоКоду("EXT_SYSTEM");
Если ЗначениеЗаполнено(УзелОбмена) Тогда
// Регистрируем только изменения для нашего узла
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Источник.Ссылка);
КонецЕсли;
КонецПроцедуры
Как отмечалось в обсуждении, интеграция с системами типа «Галактика» часто носит односторонний характер. План обмена в данном случае выступает в роли «очереди сообщений». Мы просто копим изменения, а внешний коннектор или регламентное задание 1С забирает их по расписанию — для этого есть модуль настройки обмена данными и регистрации изменений.
Проанализируем ситуацию с удалением данных. Если объект в основной конфигурации удаляется, запись об удалении все равно попадет в таблицу регистрации плана обмена в расширении, что позволит корректно синхронизировать удаление во внешней базе. Это критически важно для поддержания целостности данных между системами.
Разберем один из самых опасных моментов при работе с планами обмена в расширениях. При удалении или отключении расширения все таблицы регистрации изменений удаляются безвозвратно.
Если ваше расширение будет случайно отключено администратором, вы потеряете информацию о том, какие данные еще не были выгружены. Поэтому при использовании такого подхода рекомендуется:
Мы выяснили, что создание плана обмена в расширении — это мощный инструмент для разработчика, действующего в условиях ограничений на изменение типовой конфигурации. Рассмотрим итоги нашего анализа:
XDTO и программно обрабатывать выгрузку.Таким образом, если перед вами стоит задача «подружиться» с внешним космосом в виде сторонних ERP-систем, не снимая 1С с поддержки — используйте планы обмена в расширениях, следуя приведенным выше рекомендациям.