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