Как добавить выгрузку и загрузку нового реквизита при синхронизации между 1С:УНФ и 1С:БП через универсальный формат?

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

Синхронизация данных между конфигурациями 1С:Управление нашей фирмой (УНФ) и 1С:Бухгалтерия предприятия (БП) на основе EnterpriseData (универсальный формат) — это мощный механизм, однако он строго ограничен схемами XDTO. Часто программисты сталкиваются с ситуацией: код в модуле менеджера обмена написан, данные в структуру добавлены, но в итоговом XML-файле обмена новый реквизит не появляется. Рассмотрим подробно, почему это происходит и какими способами можно передать дополнительные данные между базами.

Причина проблемы: жесткая структура XDTO

Универсальный формат обмена работает на основе XDTO-пакетов. Когда платформа формирует файл выгрузки, она сверяет структуру создаваемого XML-документа с описанием, заложенным в пакете EnterpriseData_1_x_y. Если вы программно добавляете свойство, которого нет в описании типа этого объекта в XDTO-пакете, платформа просто игнорирует это поле при сериализации, чтобы не нарушить целостность формата. Разберем основные пути решения этой задачи.

Вариант 1. Изменение XDTO-пакета (Классический способ)

Если нам необходимо, чтобы новый реквизит стал полноценной частью структуры документа, нам придется отредактировать состав пакета. Проанализируем, как это сделать правильно:

  1. Откроем конфигуратор и найдем ветку Общие -> XDTO-пакеты.
  2. Найдем пакеты с именами EnterpriseData_1_X_X. Важно понимать, что в конфигурации может быть несколько версий формата (например, 1.10, 1.13, 1.15). Выясним, какая версия используется в текущей настройке синхронизации, и выберем соответствующий пакет.
  3. Внутри пакета найдем нужный тип объекта, например, Документ.РасходнаяНакладная.
  4. Добавим в список свойств (Properties) новое поле. Укажем его имя и тип данных (например, string из библиотеки типов XML-схемы).

Важный нюанс: Чтобы обмен работал корректно, эти изменения необходимо внести в обе конфигурации — и в УНФ (отправитель), и в БП (получатель). Если одна база обновится и пакеты перестанут совпадать, поле может перестать передаваться.

Вариант 2. Использование механизма Дополнительные сведения (AdditionalInfo)

Если база находится в облаке (например, 1С:Фреш) или вы не хотите снимать конфигурацию с поддержки ради одного реквизита, воспользуемся стандартной коллекцией ДополнительныеРеквизиты (или AdditionalInfo). Это предопределенная табличная часть в схеме почти любого документа EnterpriseData, предназначенная специально для расширения данных без правки XDTO.

Рассмотрим реализацию на стороне отправителя в общем модуле МенеджерОбменаЧерезУниверсальныйФормат. В процедуре ПКО_Документ_РасходнаяНакладная_Отправка_ПриОтправкеДанных пропишем следующий код:


// Пример добавления значения в коллекцию ДополнительныеСведения
НовоеСвойство = СтруктураСвойств.ДополнительныеСведения.Добавить();
НовоеСвойство.Наименование = "ИмяВашегоРеквизита";
НовоеСвойство.Значение = ДанныеИБ.ВашРеквизит;

На стороне приемника (в БП) в аналогичном модуле в процедуре ПослеЗагрузкиОбъекта или через перехват в ПКО_Документ_РасходнаяНакладная_Загрузка_ПриЗагрузкеДанных нужно будет найти это значение в коллекции и записать его в реквизит документа или использовать для логики печати.

Вариант 3. Использование типового поля Комментарий

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

Выясним, где заполняется комментарий. Обычно это происходит в процедуре ДобавитьПКО_Документ_РасходнаяНакладная_Отправка. Чтобы не менять типовую логику сопоставления полей, внесем изменения в обработчик ПриОтправкеДанных:


Процедура ПКО_Документ_РасходнаяНакладная_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, Стекирование)
    
    // Получаем текущий комментарий
    ТекущийКомментарий = ДанныеИБ.Комментарий;
    
    // Добавляем к нему наши технические данные через разделитель
    ДополнительнаяИнфо = "СпецДанные:" + ДанныеИБ.НашНовыйРеквизит;
    ДанныеXDTO.Комментарий = ТекущийКомментарий + " | " + ДополнительнаяИнфо;
    
КонецПроцедуры

На стороне БП останется только "распарсить" строку комментария при формировании печатной формы или при записи документа.

Вариант 4. Использование расширений для облачных решений

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

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

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

Резюме и рекомендации

Выясним, какой метод выбрать в вашем случае:

Помните, что при работе с EnterpriseData критически важно следить за версией формата. Если вы добавили поле в пакет версии 1.15, а в настройках синхронизации выбрана версия 1.10, данные не будут переданы. Всегда проверяйте номер версии в узле обмена данными.

← На главную