Синхронизация данных между конфигурациями 1С:Управление нашей фирмой (УНФ) и 1С:Бухгалтерия предприятия (БП) на основе EnterpriseData (универсальный формат) — это мощный механизм, однако он строго ограничен схемами XDTO. Часто программисты сталкиваются с ситуацией: код в модуле менеджера обмена написан, данные в структуру добавлены, но в итоговом XML-файле обмена новый реквизит не появляется. Рассмотрим подробно, почему это происходит и какими способами можно передать дополнительные данные между базами.
Универсальный формат обмена работает на основе XDTO-пакетов. Когда платформа формирует файл выгрузки, она сверяет структуру создаваемого XML-документа с описанием, заложенным в пакете EnterpriseData_1_x_y. Если вы программно добавляете свойство, которого нет в описании типа этого объекта в XDTO-пакете, платформа просто игнорирует это поле при сериализации, чтобы не нарушить целостность формата. Разберем основные пути решения этой задачи.
Если нам необходимо, чтобы новый реквизит стал полноценной частью структуры документа, нам придется отредактировать состав пакета. Проанализируем, как это сделать правильно:
EnterpriseData_1_X_X. Важно понимать, что в конфигурации может быть несколько версий формата (например, 1.10, 1.13, 1.15). Выясним, какая версия используется в текущей настройке синхронизации, и выберем соответствующий пакет.Документ.РасходнаяНакладная.string из библиотеки типов XML-схемы).Важный нюанс: Чтобы обмен работал корректно, эти изменения необходимо внести в обе конфигурации — и в УНФ (отправитель), и в БП (получатель). Если одна база обновится и пакеты перестанут совпадать, поле может перестать передаваться.
Если база находится в облаке (например, 1С:Фреш) или вы не хотите снимать конфигурацию с поддержки ради одного реквизита, воспользуемся стандартной коллекцией ДополнительныеРеквизиты (или AdditionalInfo). Это предопределенная табличная часть в схеме почти любого документа EnterpriseData, предназначенная специально для расширения данных без правки XDTO.
Рассмотрим реализацию на стороне отправителя в общем модуле МенеджерОбменаЧерезУниверсальныйФормат. В процедуре ПКО_Документ_РасходнаяНакладная_Отправка_ПриОтправкеДанных пропишем следующий код:
// Пример добавления значения в коллекцию ДополнительныеСведения
НовоеСвойство = СтруктураСвойств.ДополнительныеСведения.Добавить();
НовоеСвойство.Наименование = "ИмяВашегоРеквизита";
НовоеСвойство.Значение = ДанныеИБ.ВашРеквизит;
На стороне приемника (в БП) в аналогичном модуле в процедуре ПослеЗагрузкиОбъекта или через перехват в ПКО_Документ_РасходнаяНакладная_Загрузка_ПриЗагрузкеДанных нужно будет найти это значение в коллекции и записать его в реквизит документа или использовать для логики печати.
Проанализируем ситуацию, когда данные нужны исключительно для вывода в печатную форму на стороне БП. В этом случае самым быстрым решением будет использование поля Комментарий. Рассмотрим, как программно модифицировать передаваемый комментарий, чтобы "спрятать" в нем наши данные.
Выясним, где заполняется комментарий. Обычно это происходит в процедуре ДобавитьПКО_Документ_РасходнаяНакладная_Отправка. Чтобы не менять типовую логику сопоставления полей, внесем изменения в обработчик ПриОтправкеДанных:
Процедура ПКО_Документ_РасходнаяНакладная_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, Стекирование)
// Получаем текущий комментарий
ТекущийКомментарий = ДанныеИБ.Комментарий;
// Добавляем к нему наши технические данные через разделитель
ДополнительнаяИнфо = "СпецДанные:" + ДанныеИБ.НашНовыйРеквизит;
ДанныеXDTO.Комментарий = ТекущийКомментарий + " | " + ДополнительнаяИнфо;
КонецПроцедуры
На стороне БП останется только "распарсить" строку комментария при формировании печатной формы или при записи документа.
Если работа ведется в облачной инфраструктуре, изменения основной конфигурации крайне нежелательны. Однако современные версии платформы позволяют добавлять собственные XDTO-пакеты через Расширения конфигурации. Рассмотрим этот путь:
МенеджерОбменаЧерезУниверсальныйФормат.&После или &Вместо для переопределения процедур отправки и загрузки.Этот способ позволяет сохранить типовую конфигурацию на поддержке и при этом реализовать полноценную передачу данных в строгом соответствии с типами.
Выясним, какой метод выбрать в вашем случае:
Помните, что при работе с EnterpriseData критически важно следить за версией формата. Если вы добавили поле в пакет версии 1.15, а в настройках синхронизации выбрана версия 1.10, данные не будут переданы. Всегда проверяйте номер версии в узле обмена данными.