Как решить проблему создания пустых ссылок контрагентов при обмене через Конвертацию данных

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

При настройке обменов данными между конфигурациями 1С на платформе 8.3 (например, между «Управление производственным предприятием» и «PDM Управление инженерными данными») с помощью технологии «1С:Конвертация данных 2.1» специалисты часто сталкиваются со следующей проблемой: при переносе основного объекта (например, номенклатуры) связанный с ним объект (контрагент) создается в базе-приемнике абсолютно пустым. В справочнике появляется строка без наименования, кода и других реквизитов, хотя уникальный идентификатор (GUID) у нее заполнен и соответствует источнику. Рассмотрим подробно, почему возникает эта ошибка и как ее исправить несколькими способами.

Почему в базе-приемнике создаются пустые элементы?

Давайте проанализируем внутренние механизмы работы обработок выгрузки и загрузки данных. В Конвертации данных существует четкое разделение между выгрузкой самого объекта (со всеми его реквизитами и табличными частями) и выгрузкой ссылки на этот объект.

Когда в правилах конвертации свойств (ПКС) для номенклатуры указано свойство Контрагент, система пытается обработать эту ссылку. Если для справочника Контрагенты отключено правило выгрузки данных (ПВД) или в ПКС установлен признак «Выгружать объект только по ссылке», обработка обмена ведет себя следующим образом:

  1. В файл выгрузки XML записывается только узел ссылки, содержащий уникальный идентификатор (GUID) контрагента, его тип и поля поиска (если они настроены). Полный набор свойств контрагента в XML-файл не попадает.
  2. При чтении файла в базе-приемнике обработка загрузки считывает узел ссылки и выполняет поиск объекта по GUID.
  3. Если контрагент с таким идентификатором в приемнике отсутствует, обработка автоматически создает новый элемент справочника, присваивает ему этот GUID и записывает его. Но так как в XML-файле не было данных о наименовании, ИНН и других реквизитах, созданный элемент остается абсолютно пустым.

Выясним, какие настройки правил обмена и конфигурации КД позволяют исправить это поведение.

Способ 1. Отключение флага «Выгружать объект только по ссылке» в ПКС

Это самый простой и рекомендуемый способ, не требующий написания программного кода. Нам необходимо заставить систему выгружать связанные объекты целиком в тот момент, когда на них ссылается основной выгружаемый объект.

Выполним следующие шаги в конфигурации «Конвертация данных»:

  1. Откроем правила обмена и перейдем в дерево правил конвертации объектов (ПКО).
  2. Найдем правило конвертации для нашего основного объекта, в котором возникает проблема (в нашем примере это ПКО Номенклатура).
  3. Перейдем на вкладку «Конвертация свойств» и найдем строку реквизита, которая ссылается на проблемный справочник (свойство Контрагент).
  4. Двойным кликом откроем настройки этого правила конвертации свойства (ПКС).
  5. Обратим внимание на флаг «Выгружать объект только по ссылке» (в некоторых версиях КД он называется «Выгружать только ссылку»). Убедимся, что этот флаг снят.
  6. Сохраним настройки ПКС и заново сформируем файл правил обмена.

Как это работает: Теперь при выгрузке номенклатуры обработка обмена, дойдя до свойства Контрагент, не просто запишет его GUID, а обратится к ПКО Контрагенты и выгрузит всю структуру его реквизитов непосредственно внутрь узла номенклатуры. При загрузке в приемнике создастся полностью заполненный контрагент.

Способ 2. Использование программной выгрузки через ВыгрузитьПоПравилу

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

Для этого выполним настройку в обработчиках событий Конвертации данных:

  1. Откроем ПКО основного объекта (Номенклатура).
  2. Перейдем к обработчику события «После выгрузки».
  3. Напишем следующий код, который будет проверять заполнение реквизита и принудительно инициировать его выгрузку по соответствующему правилу:

Если ЗначениеЗаполнено(Источник.Контрагент) Тогда
    ВыгрузитьПоПравилу(Источник.Contragent, , , , "Контрагенты");
КонецЕсли;

Разберем этот код подробнее. Метод ВыгрузитьПоПравилу() принимает в качестве первого параметра объект-источник (ссылку на контрагента), а в качестве последнего — строковое имя правила конвертации (ПКО), по которому этот объект должен быть выгружен в XML-файл. Принудительный вызов этой функции гарантирует, что в XML-документ запишется полная структура полей контрагента, даже если в ПКС стояли ограничивающие флаги.

Способ 3. Проверка настроек ПКО связанного справочника

Иногда пустые ссылки создаются из-за некорректных настроек в самом ПКО подчиненного справочника. Давайте проанализируем параметры ПКО Контрагенты в «Конвертации данных»:

  1. Откроем ПКО Контрагенты.
  2. Проверим состояние флага «Не создавать новый объект в приемнике, если он не найден». Если этот флаг будет включен, а объект в приемнике не найдется, система вообще не создаст элемент, и в реквизите номенклатуры запишется «битая» ссылка с текстом «Объект не найден...». Если же этот флаг выключен, но выгружается только ссылка, элемент запишется пустым.
  3. Проверим флаг «Не замещать существующие объекты в приемнике при загрузке, а только создавать новые и заполнять незаполненные». Этот флаг влияет на перезапись данных. Убедимся, что его использование соответствует бизнес-логике обмена.
  4. Также обратим внимание на настройки полей поиска на вкладке «Настройки поиска». Для правильной идентификации объектов при загрузке должны быть корректно сопоставлены ключевые поля (например, УникальныйИдентификатор или сочетание ИНН + КПП).

Способ 4. Оптимизация планов обмена при регистрации изменений

Часто путаница возникает из-за того, что разработчики пытаются управлять выгрузкой объектов исключительно через регистрацию на узлах планов обмена. Если в плане обмена зарегистрирована только Номенклатура, а связанные Контрагенты не регистрируются (так как их авторегистрация отключена, либо они исключены из состава плана обмена), то при стандартном обмене они не выгрузятся, если настройки ПКС настроены на выгрузку только по ссылке.

Рекомендуется придерживаться следующего правила: если объект Б (контрагент) является неотъемлемым реквизитом объекта А (номенклатура) и без него объект А не имеет смысла в базе-приемнике, то в правилах конвертации свойств обязательно должно быть разрешено создание и заполнение объекта Б при переносе по ссылке (то есть ПКС должно выгружать объект полностью, как описано в Способе 1).

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


Если об.Метаданные = Метаданные.Справочники.СтатьиЗатрат Тогда 
    Продолжить;
КонецЕсли;
// ... аналогичные проверки для других справочников
ПланыОбмена.УдалитьРегистрациюИзменений(Уз, об.Метаданные);

Если из регистрации изменений принудительно удаляются контрагенты, но при этом правила ПКС для номенклатуры настроены неверно (ограничены только ссылками), база-приемник гарантированно получит пустые элементы. Применение Способа 1 или Способа 2 полностью решает эту проблему, обеспечивая целостность и полноту переносимых данных независимо от ручного управления регистрацией на узлах планов обмена.

← На главную