Разберем ситуацию, с которой часто сталкиваются разработчики при настройке бесшовной интеграции между 1С:Документооборот (ДО) и 1С:Бухгалтерия предприятия КОРП (БП). Допустим, на стороне ДО для внутреннего документа добавлены новые реквизиты через Конфигуратор (то есть это не типовые «Дополнительные реквизиты», созданные в режиме Предприятия). Возникает вопрос: что нужно доработать, чтобы на стороне БП можно было получить и обработать эти нетиповые реквизиты связанного внутреннего документа?
Проанализируем доступные варианты решения этой задачи, выясним причину ограничений типового механизма и рассмотрим по шагам способы реализации обмена.
Посмотрим на то, как устроена базовая интеграция. Бесшовная интеграция между ДО и БП КОРП работает через веб-сервис DMService (по аналогии с тем, как выполняется произвольный запрос во внешнюю базу 1С). В основе этого сервиса лежит XDTO-пакет DM, который жестко описывает структуру передаваемых данных (модель данных документооборота).
Если реквизит добавлен в конфигураторе, стандартные правила интеграции его просто не увидят. Система сериализует объекты строго по схеме XDTO. Поскольку вашего нового поля в пакете DM нет, оно игнорируется при выгрузке. Чтобы данные передавались, нам нужно либо изменить саму схему данных (XDTO), либо «спрятать» наши данные в уже существующие типовые поля схемы.
Рассмотрим первый путь — добавление новых полей непосредственно в XDTO-пакет. Это можно сделать через расширение конфигурации, однако здесь есть строгие правила, которые необходимо соблюдать:
DM, и расширяйте конкретный тип (например, DMDocument).После синхронизации пакетов потребуется программная доработка:
На стороне ДО: В расширении необходимо перехватить логику формирования ответа веб-сервиса DMService. В момент сборки объекта XDTO перед отправкой, программно заполните ваше новое поле значением из добавленного реквизита.
На стороне БП КОРП: Требуется доработать логику Библиотеки интеграции с Документооборотом (БИД). В момент чтения полученного XDTO-объекта нужно извлечь ваше свойство и присвоить его соответствующему реквизиту документа БП.
Разберем альтернативный путь, который на практике является самым популярным и наименее болезненным. Чтобы не ломать XDTO-схемы и не поддерживать их синхронизацию между базами при каждом обновлении конфигураций, можно программно упаковать данные в уже существующие коллекции, например, в additionalProperties.
Вместо изменения структуры пакета мы делаем следующее:
DM.Пример логики упаковки данных (псевдокод для общего понимания механики на стороне ДО):
// Формируем структуру с нашими нетиповыми реквизитами
ДанныеРеквизитов = Новый Структура;
ДанныеРеквизитов.Вставить("МойНетиповойРеквизит", ОбъектДО.МойНетиповойРеквизит);
// Сериализуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеРеквизитов);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Помещаем в доступное свойство типового XDTO объекта (например, additionalProperties)
// XDTOОбъект - это формируемый пакет для отправки
XDTOОбъект.additionalProperties = СтрокаJSON;
Пример логики распаковки данных на стороне БП:
Если ЗначениеЗаполнено(XDTOОбъект.additionalProperties) Тогда
// Пытаемся прочитать JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(XDTOОбъект.additionalProperties);
Попытка
ДанныеРеквизитов = ПрочитатьJSON(ЧтениеJSON);
// Заполняем реквизиты документа в БП
Если ДанныеРеквизитов.Свойство("МойНетиповойРеквизит") Тогда
ОбъектБП.МойНетиповойРеквизит = ДанныеРеквизитов.МойНетиповойРеквизит;
КонецЕсли;
Исключение
// Обработка ошибок парсинга, если в поле пришло что-то другое
КонецПопытки;
КонецЕсли;
Такой подход позволяет сохранить в неприкосновенности типовые XDTO-пакеты. Вы избежите конфликтов при обновлении типовых конфигураций и ошибок десериализации, так как структура XDTO остается неизменной, а все манипуляции с данными происходят исключительно на программном уровне внутри модулей обмена.