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