Как в 1С:Конвертация данных 2.0 настроить выгрузку связанных справочников по ссылке и избежать появления «Объект не найден»?

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

При настройке регулярных обменов данными между конфигурациями 1С с использованием конфигурации «1С:Конвертация данных 2.0» (КД 2) разработчики часто сталкиваются с задачей выборочной выгрузки нормативно-справочной информации (НСИ). Типичный сценарий: необходимо переносить только определенные документы, а справочники (например, Контрагенты, Организации, Номенклатура) выгружать не целиком, а исключительно те элементы, которые фигурируют в передаваемых документах.

Однако при такой настройке в информационной базе-приемнике нередко возникает ситуация, когда вместо реквизита документа отображается битая ссылка «<Объект не найден>». Разберем детально механизм выгрузки по ссылкам в КД 2, проанализируем типичные ошибки разработчиков и рассмотрим правильные варианты архитектурного решения данной задачи.

При использовании планов обмена выгрузка данных разделяется на два принципиальных сценария:

  1. Объект зарегистрирован на узле плана обмена: выгружается полностью. В XML-пакет помещается как идентификационная секция <Ссылка>, так и секция со всеми реквизитами <Свойства>.
  2. Объект НЕ зарегистрирован на узле, но входит в состав реквизитов документа: выгружается «по ссылке». В выгрузку попадает только блок <Ссылка> с ключевыми полями поиска, а свойства объекта не выгружаются, чтобы избежать избыточной передачи данных.

Если элемент справочника никогда ранее не передавался в приемник и выгружается только «по ссылке», база-приемник пытается найти его по полям поиска. Если объект не найден, а данных для его создания в файле нет, в документе прописывается ссылка на несуществующий GUID, что и приводит к появлению «Объект не найден».

Причина 1. Ошибки в обработчике «Поля поиска» и отсутствие ПКС

Проанализируем практический пример. Очень часто в правиле конвертации объекта (ПКО) справочника разработчики переопределяют стандартный поиск через сопоставление по регистру сведений СоответствияОбъектовИнформационныхБаз, но допускают критические ошибки.

Посмотрим на ошибочный вариант кода в обработчике «Поля поиска» в ПКО:


мЗапрос = Новый Запрос(
"ВЫБРАТЬ
|    СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника
|ИЗ
|    РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
|ГДЕ
|    СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = &УникальныйИдентификаторПриемника
|    И СоответствияОбъектовИнформационныхБаз.ТипПриемника = &ТипПриемника
|    И СоответствияОбъектовИнформационныхБаз.ТипИсточника = &ТипИсточника");

мЗапрос.УстановитьПараметр("УникальныйИдентификаторПриемника", СвойстваПоиска["{УникальныйИдентификатор}"]);
мЗапрос.УстановитьПараметр("ТипПриемника", ПКО.Источник);
мЗапрос.УстановитьПараметр("ТипИсточника", ПКО.Приемник);

мВыборка = мЗапрос.Выполнить().Выбрать();
Если мВыборка.Следующий() Тогда
    // ОШИБКА: присваивается строка/идентификатор вместо реальной ссылки!
    СсылкаНаОбъект = мВыборка.УникальныйИдентификаторИсточника;
КонецЕсли;

В этом коде кроются сразу две проблемы:

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

Разберем, как исправить алгоритм поиска:


Если НомерВариантаПоиска = 1 Тогда
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК ИдентификаторИсточника
    |ИЗ
    |    РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
    |ГДЕ
    |    СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = &УникальныйИдентификаторПриемника
    |    И СоответствияОбъектовИнформационныхБаз.ТипПриемника = &ТипПриемника
    |    И СоответствияОбъектовИнформационныхБаз.ТипИсточника = &ТипИсточника";
    
    Запрос.УстановитьПараметр("УникальныйИдентификаторПриемника", СвойстваПоиска["{УникальныйИдентификатор}"]);
    Запрос.УстановитьПараметр("ТипПриемника", ПКО.Источник);
    Запрос.УстановитьПараметр("ТипИсточника", ПКО.Приемник);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        // Получаем реальную ссылку по GUID
        ГУИД = Новый УникальныйИдентификатор(Выборка.ИдентификаторИсточника);
        СсылкаНаОбъект = Справочники.Организации.ПолучитьСсылку(ГУИД);
        ПрекратитьПоиск = Истина;
    КонецЕсли;
ИначеЕсли НомерВариантаПоиска = 2 Тогда
    СтрокаИменСвойствПоиска = "ИНН, Наименование";
КонецЕсли;

Решение 1. Принудительная выгрузка объекта через параметр «ВыгрузитьОбъект»

Если вам требуется передавать документ и гарантировать создание связанных с ним элементов справочников без их предварительной регистрации на узле плана обмена, используем флаг ВыгрузитьОбъект.

Рассмотрим порядок действий:

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

ВыгрузитьОбъект = Истина;

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

Решение 2. Программный вызов «ВыгрузитьПоПравилу»

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

В обработчике «После выгрузки» свойства или самого документа прописываем:


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

В правиле Организации_Кратко настраиваем только минимально необходимые поля поиска и создания: Наименование, ИНН, КПП.

Решение 3. Автоматическая регистрация НСИ через Правила регистрации объектов (ПРО)

Наиболее правильным с точки зрения типовой архитектуры 1С является подход с использованием подсистемы Правил регистрации объектов (ПРО) в конфигурации «Конвертация данных».

Разберем логику настройки:

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

// Обработчик "При регистрации" для документа
Если Объект.Проведен Тогда
    ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Объект.Организация);
    ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Объект.Контрагент);
КонецЕсли;

При таком подходе в пакет выгрузки всегда будут попадать полные данные только тех элементов справочников, которые действительно задействованы в документообороте, а при последующих обменах повторно передаваться будут только их поля поиска.

Проверка настроек ПКО в «Конвертации данных»

Убедимся, что в самом ПКО справочника корректно выставлены управляющие флаги на вкладке «Настройки»:

  1. «Не создавать новый объект в приемнике, если он НЕ найден» — флаг должен быть обязательно снят. Если он установлен, то при отсутствии объекта в приемнике программа не станет его создавать, что приведет к появлению пустой или битой ссылки.
  2. «Не замещать существующие объекты при загрузке» — рекомендуется установить для справочников НСИ при обмене по ссылке. Это предотвратит случайную перезапись реквизитов справочника в базе-приемнике, если они были изменены там вручную.
  3. «Искать объект приемника по внутреннему идентификатору» — если базы не являются прямыми клонами и GUID объектов различаются, флаг следует снять и выполнять поиск исключительно по ключевым реквизитам (ИНН, Код, Наименование).
← На главную