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