Как передать отсутствующий в EnterpriseData документ в 1С:ERP без снятия конфигурации с поддержки?

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

При настройке интеграции между системами 1С на базе универсального формата обмена EnterpriseData разработчики часто сталкиваются с ситуацией, когда в типовом XDTO-пакете формата отсутствует нужный вид документа (например, ЗаказНаПроизводство). При этом конфигурация-приемник 1С:ERP находится на официальной поддержке, и вносить изменения в основную конфигурацию крайне нежелательно.

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

Особенности архитектуры EnterpriseData и Конвертации данных 3.0

Формат EnterpriseData основан на строгих XDTO-пакетах, а логика сериализации и десериализации описывается в рамках технологии КД 3.0. В типовых решениях алгоритмы конвертации вынесены в общий модуль МенеджерОбменаЧерезУниверсальныйФормат (или версионные модули, например МенеджерОбменаЧерезУниверсальныйФормат_1_11).

Если произвольно отправить XML-элемент, не описанный в XDTO-схеме пакета, платформа 1С выбросит исключение еще на этапе проверки схемы до вызова программных обработчиков загрузки. Поэтому передача нестандартных объектов требует одного из корректных путей реализации.

Способ 1. Использование расширения конфигурации (рекомендуемый подход)

Платформа 1С:Предприятие 8.3 позволяет дорабатывать механизмы обмена через расширения конфигурации без модификации основной конфигурации.

Рассмотрим по шагам реализацию данного варианта:

  1. Расширение XDTO-пакета: В расширение конфигурации добавляется собственный XDTO-пакет со структурой нужного документа или расширяется существующий пакет формата.
  2. Подключение общего модуля: В расширение заимствуется общий модуль МенеджерОбменаЧерезУниверсальныйФормат.
  3. Переопределение обработчиков: С помощью аннотаций &Вместо, &После или &ИзменениеИКонтроль переопределяются правила обработки данных (ПОД) и правила конвертации объектов (ПКО).

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


&После("ПриКонвертацииДанныхXDTO")
Процедура Расш1_ПриКонвертацииДанныхXDTO(КомпонентыОбмена, ДанныеXDTO, ПолученныеДанные)
    
    Если ДанныеXDTO.Тип().Имя = "Документ.ЗаказНаПроизводство" Тогда
        // Формируем целевой объект в базе-приемнике
        ДокументОбъект = Документы.ЗаказНаПроизводство.СоздатьДокумент();
        ДокументОбъект.Дата = ДанныеXDTO.Дата;
        ДокументОбъект.Номер = ДанныеXDTO.Номер;
        ДокументОбъект.Организация = ПолученныеДанные.Организация;
        
        // Заполняем табличную часть и реквизиты
        ПолученныеДанные = ДокументОбъект;
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Использование внешних правил конвертации данных

В Библиотеке стандартных подсистем (БСП) предусмотрен штатный механизм переопределения правил конвертации данных без внесения изменений в метаданные. В форме настройки синхронизации данных доступна загрузка внешних правил из файла.

Разберем логику работы этого метода:

  1. В конфигурации «Конвертация данных 3.0» настраиваются правила конвертации для формата EnterpriseData с учетом новых или сопоставленных объектов.
  2. Из КД 3.0 выгружается внешняя обработка правил конвертации (файл с расширением .epf).
  3. В 1С:ERP в настройках соответствующего узла обмена загружается полученная внешняя обработка через команду «Загрузить правила конвертации данных».

При этом весь код модуля менеджера обмена подменяется алгоритмами из подключенной внешней обработки. Основная конфигурация остается типовой.

Способ 3. Передача сериализованных данных внутри типового контейнера

Если нет возможности дорабатывать XDTO-пакет, передачу произвольных структур данных можно организовать через типовые строковые контейнеры формата EnterpriseData, например узел AdditionalInfo (дополнительная информация) или строковые дополнительные реквизиты.

Проанализируем шаги реализации:

  1. На стороне источника: Нестандартный документ ЗаказНаПроизводство сериализуется в формат JSON или XML-строку и помещается в узел AdditionalInfo типового документа (или фиктивного объекта обмена, максимально близкого по смыслу).
  2. На стороне приемника: В обработчиках конвертации (ПриКонвертацииДанныхXDTO или ПослеЗагрузкиВсехДанных) строка извлекается и десериализуется встроенными объектами платформы ЧтениеJSON или ЧтениеXML.

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


Если Не ПустаяСтрока(ДанныеXDTO.AdditionalInfo) Тогда
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ДанныеXDTO.AdditionalInfo);
    
    СтруктураЗаказа = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
    
    Если СтруктураЗаказа.Свойство("ТипОбъекта") И СтруктураЗаказа.ТипОбъекта = "ЗаказНаПроизводство" Тогда
        НовыйЗаказ = Документы.ЗаказНаПроизводство.СоздатьДокумент();
        НовыйЗаказ.Дата = ТекущаяДатаСеанса();
        НовыйЗаказ.Комментарий = "Загружено из EnterpriseData: " + СтруктураЗаказа.НомерИсходный;
        // Заполнение остальных реквизитов из структуры
        НовыйЗаказ.Записать(РежимЗаписиДокумента.Запись);
    КонецЕсли;
КонецЕсли;

Важные ограничения и рекомендации

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

  1. Обновление конфигурации: При переходе на новую версию 1С:ERP версия формата EnterpriseData может измениться. Внешние правила (.epf) могут потребовать повторной адаптации, тогда как модуль расширения легче поддерживать при помощи директивы &После.
  2. Безопасный режим: В облачных сервисах (например, 1С:Фреш) использование внешних обработок часто заблокировано политиками безопасности. В таком случае единственным корректным решением является разработка расширения конфигурации.
← На главную