Как конвертировать УИД из строки в ссылку на документ при использовании КД 2.0

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

При настройке обмена данными между конфигурациями часто возникает ситуация, когда в одной базе идентификатор объекта (УИД) хранится в виде строки (например, в регистре сведений), а в другой базе он должен стать полноценной ссылкой на документ. Проблема усложняется, если обмен идет через планы обмена, где данные передаются не отдельными записями, а целыми наборами записей (RecordSet). Разберем подробно, как решить эту задачу несколькими способами, используя возможности конфигурации "Конвертация данных 2.0".

Метод 1. Использование специализированного ПКО с поиском по идентификатору

Это самый «чистый» и правильный с точки зрения архитектуры КД 2.0 способ. Мы создадим правило, которое будет объяснять системе, что входящую строку нужно трактовать как уникальный идентификатор конкретного типа документа.

Рассмотрим пошаговую настройку:

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

Проанализируем ситуацию: теперь при загрузке, когда система встретит значение в этом поле, она не просто запишет строку, а обратится к ПКО документа. Поскольку там включен поиск по УИД, движок КД выполнит операцию ПолучитьСсылку(Новый УникальныйИдентификатор(Значение)). Если документ с таким УИД существует в базе-приемнике, ссылка будет успешно установлена.

Метод 2. Работа с набором записей в обработчике «После загрузки»

Часто программисты допускают ошибку, пытаясь обратиться к полям объекта напрямую в обработчиках загрузки регистра. Нужно помнить, что если обмен идет через планы обмена, переменная Объект в обработчике представляет собой РегистрСведенийНаборЗаписей, а не одну запись.

Разберем, как правильно модифицировать данные в этом случае:

В ПКО регистра сведений выберем обработчик «После загрузки». Нам необходимо обойти все записи, которые попали в текущий набор, и программно установить ссылку на документ на основании переданного УИД. Чтобы УИД был доступен, его можно передать как дополнительное свойство или «вспомогательное» измерение.


// В обработчике "После загрузки" ПКО регистра
Для Каждого Запись Из Объект Цикл
    // Предположим, УИД документа пришел в измерение, которое в приемнике 
    // временно имеет строковый тип или передано через ПараметрыОбъекта
    Если ЗначениеЗаполнено(Запись.ДокументУИД) Тогда
        Попытка
            Идентификатор = Новый УникальныйИдентификатор(Запись.ДокументУИД);
            // Формируем ссылку нужного типа
            Запись.Документ = Документы.Наряды.ПолучитьСсылку(Идентификатор);
        Исключение
            // Обработка случая некорректного УИД
            Запись.Документ = Документы.Наряды.ПустаяСсылка();
        КонецПопытки;
    КонецЕсли;
КонецЦикла;

Важный момент: если вы используете такой подход, убедитесь, что в базе-приемнике у регистра действительно есть поле, куда вы временно записываете строку УИД, либо используйте ПараметрыОбъекта, но помните, что для набора записей параметры передаются на весь набор сразу.

Метод 3. Использование внутреннего свойства {Ref}

В КД 2.0 существует зарезервированное имя свойства {Ref}. Если мы хотим принудительно заставить систему считать передаваемое значение идентификатором объекта, мы можем использовать это в обработчиках выгрузки.

Посмотрим на пример кода в ПКС измерения (где Источник — строка УИД, а Приемник — ссылка на документ):


// В обработчике "Перед выгрузкой" ПКС
Значение = СтрокаСУИД; // Ваша переменная со строковым УИД

Если при этом для данного ПКС указано ПКО документа с включенным поиском по УИД (как в Методе 1), система автоматически сформирует в XML-файле узел ссылки. При загрузке это позволит платформе корректно сопоставить строковое представление с типом UUID и найти соответствующий документ.

Почему не работает «Отказ = Истина» и ручная запись?

Многие пытаются решить проблему, отменив стандартную загрузку набора через Отказ = Истина и создав МенеджерЗаписи вручную. В контексте КД 2.0 и планов обмена это часто приводит к ошибкам, так как загрузка набора происходит внутри транзакции. Установка флага Отказ может привести к откату всей транзакции или к тому, что в базе останутся пустые записи (так как набор уже очистил старые данные, но новые не записал).

Правильная стратегия — не отменять загрузку, а модифицировать содержимое переменной Объект до того, как система вызовет метод Записать(). Это гарантирует, что ваши изменения попадут в базу в рамках стандартного цикла обмена.

Резюме и рекомендации

Подведем итог: наиболее эффективным способом является сочетание ПКС и ПКО с включенным поиском по идентификатору. Это минимизирует количество рукописного кода и использует стандартные механизмы платформы 1С. Если же структура данных заставляет вас работать с кодом, всегда помните о цикле Для Каждого Запись Из Объект, так как регистры почти всегда выгружаются наборами.

Ключевые объекты и методы, которые мы использовали:

← На главную