Как запретить выгрузку ссылок и создание пустых документов при обмене через универсальный формат?

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

При настройке обмена данными между типовыми конфигурациями (например, между 1С:Комплексная автоматизация и 1С:Бухгалтерия 3.0) через универсальный формат (EnterpriseData/Конвертация 3.0) разработчики часто сталкиваются со специфической проблемой. Рассмотрим типичную ситуацию: вы намеренно заблокировали выгрузку определенного вида документов (например, заказов клиентов) через правила регистрации объектов, чтобы они не создавались в базе-приемнике. Однако при выгрузке других документов, в реквизитах которых есть ссылки на эти заказы, в приемнике все равно появляются пустые документы (так называемые «битые» ссылки) без заполненных реквизитов. Разберем по шагам, почему это происходит и как правильно решить данную задачу.

Выясним причину: особенности формата EnterpriseData

В обменах через универсальный формат концепция передачи данных существенно отличается от классической логики, к которой многие привыкли в «Конвертации данных 2.0». Проанализируем, как формируется пакет обмена:

  1. Когда выгружается документ, у которого в реквизитах указана ссылка на другой объект (например, ссылка на ЗаказКлиента), платформа формирует XDTO-пакет.
  2. В этот пакет помещается легковесное представление связанного объекта — обычно это только его тип и уникальный идентификатор (GUID).
  3. Когда база-приемник считывает этот пакет, она обязана разрешить ссылку для обеспечения ссылочной целостности загружаемого документа.
  4. Если полный объект ранее не выгружался и в базе-приемнике отсутствует, система автоматически генерирует «пустой» объект (stub-объект) с этим GUID.

Именно поэтому простое отключение регистрации объекта отменяет лишь его инициативную выгрузку как самостоятельного объекта, но никак не запрещает его сериализацию «по ссылке» из реквизитов других документов. Чтобы избавиться от пустых документов, нам необходимо предотвратить выгрузку самой ссылки в XDTO-пакет.

Решение 1: Настройка через «Конвертация данных 3.0»

Методологически наиболее правильный подход — использовать конфигурацию «Конвертация данных 3.0» (КД 3.0). Рассмотрим подробнее алгоритм действий:

  1. Откройте базу КД 3.0 и найдите Правило конвертации объекта (ПКО) для того документа, который ссылается на исключенный объект (например, ПКО для документа реализации).
  2. Перейдите в Правила конвертации свойств (ПКС) и найдите проблемный реквизит (ссылку на заказ).
  3. В обработчике события ПриОтправкеДанных или ПриКонвертацииДанныхXDTO пропишите условие, при котором значение свойства будет очищаться.
  4. Задайте алгоритм, который вернет Неопределено вместо ссылки на объект.

После этого необходимо выгрузить обновленный код модуля МенеджерОбменаЧерезУниверсальныйФормат из КД 3.0 и перенести его в вашу рабочую конфигурацию. Таким образом, XDTO-пакет изначально будет формироваться без ненужной ссылки, и база-приемник не будет пытаться создать пустой документ.

Решение 2: Использование расширений конфигурации

Общий модуль МенеджерОбменаЧерезУниверсальныйФормат имеет огромный объем и регулярно обновляется фирмой «1С» при выходе новых версий формата. Если нет возможности или желания разворачивать КД 3.0 и править правила обмена там, мы можем использовать расширения. Этот вариант позволяет оставить основную конфигурацию на полной поддержке.

Посмотрим на пример того, как можно перехватить заполнение структуры XDTO. В расширении необходимо использовать аннотации &Вместо или &После для нужных процедур заполнения данных. Проанализируем пример кода:


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

КонецПроцедуры

Важно: При таком подходе мы напрямую модифицируем уже сформированную структуру ДанныеXDTO, удаляя из неё ссылку перед тем, как она будет сериализована в XML.

Как найти источник "битой" ссылки?

Если в базе-приемнике массово появляются пустые документы, и сложно сразу определить, из какого именно объекта приходят ссылки, рассмотрим эффективный метод отладки:

  1. Временно настройте синхронизацию данных через файловый каталог (выгрузка в файл).
  2. Скопируйте GUID пустого документа из базы-приемника (это можно сделать через стандартную обработку поиска ссылок или консоль запросов).
  3. Откройте полученный при выгрузке файл XML формата обмена в любом текстовом редакторе (например, Notepad++).
  4. Выполните поиск по скопированному GUID.

Вы увидите, внутри структуры какого именно выгружаемого документа или справочника находится эта ссылка. Это существенно ускорит локализацию проблемы и покажет, для какого конкретно объекта нужно корректировать правила конвертации (ПКО) или перехватывать код в расширении.

← На главную