При настройке обмена данными между конфигурациями часто возникает ситуация, когда в одной базе идентификатор объекта (УИД) хранится в виде строки (например, в регистре сведений), а в другой базе он должен стать полноценной ссылкой на документ. Проблема усложняется, если обмен идет через планы обмена, где данные передаются не отдельными записями, а целыми наборами записей (RecordSet). Разберем подробно, как решить эту задачу несколькими способами, используя возможности конфигурации "Конвертация данных 2.0".
Это самый «чистый» и правильный с точки зрения архитектуры КД 2.0 способ. Мы создадим правило, которое будет объяснять системе, что входящую строку нужно трактовать как уникальный идентификатор конкретного типа документа.
Рассмотрим пошаговую настройку:
ПКО_Документ_По_УИД.ДокументСсылка.Наряды).Проанализируем ситуацию: теперь при загрузке, когда система встретит значение в этом поле, она не просто запишет строку, а обратится к ПКО документа. Поскольку там включен поиск по УИД, движок КД выполнит операцию ПолучитьСсылку(Новый УникальныйИдентификатор(Значение)). Если документ с таким УИД существует в базе-приемнике, ссылка будет успешно установлена.
Часто программисты допускают ошибку, пытаясь обратиться к полям объекта напрямую в обработчиках загрузки регистра. Нужно помнить, что если обмен идет через планы обмена, переменная Объект в обработчике представляет собой РегистрСведенийНаборЗаписей, а не одну запись.
Разберем, как правильно модифицировать данные в этом случае:
В ПКО регистра сведений выберем обработчик «После загрузки». Нам необходимо обойти все записи, которые попали в текущий набор, и программно установить ссылку на документ на основании переданного УИД. Чтобы УИД был доступен, его можно передать как дополнительное свойство или «вспомогательное» измерение.
// В обработчике "После загрузки" ПКО регистра
Для Каждого Запись Из Объект Цикл
// Предположим, УИД документа пришел в измерение, которое в приемнике
// временно имеет строковый тип или передано через ПараметрыОбъекта
Если ЗначениеЗаполнено(Запись.ДокументУИД) Тогда
Попытка
Идентификатор = Новый УникальныйИдентификатор(Запись.ДокументУИД);
// Формируем ссылку нужного типа
Запись.Документ = Документы.Наряды.ПолучитьСсылку(Идентификатор);
Исключение
// Обработка случая некорректного УИД
Запись.Документ = Документы.Наряды.ПустаяСсылка();
КонецПопытки;
КонецЕсли;
КонецЦикла;
Важный момент: если вы используете такой подход, убедитесь, что в базе-приемнике у регистра действительно есть поле, куда вы временно записываете строку УИД, либо используйте ПараметрыОбъекта, но помните, что для набора записей параметры передаются на весь набор сразу.
В КД 2.0 существует зарезервированное имя свойства {Ref}. Если мы хотим принудительно заставить систему считать передаваемое значение идентификатором объекта, мы можем использовать это в обработчиках выгрузки.
Посмотрим на пример кода в ПКС измерения (где Источник — строка УИД, а Приемник — ссылка на документ):
// В обработчике "Перед выгрузкой" ПКС
Значение = СтрокаСУИД; // Ваша переменная со строковым УИД
Если при этом для данного ПКС указано ПКО документа с включенным поиском по УИД (как в Методе 1), система автоматически сформирует в XML-файле узел ссылки. При загрузке это позволит платформе корректно сопоставить строковое представление с типом UUID и найти соответствующий документ.
Многие пытаются решить проблему, отменив стандартную загрузку набора через Отказ = Истина и создав МенеджерЗаписи вручную. В контексте КД 2.0 и планов обмена это часто приводит к ошибкам, так как загрузка набора происходит внутри транзакции. Установка флага Отказ может привести к откату всей транзакции или к тому, что в базе останутся пустые записи (так как набор уже очистил старые данные, но новые не записал).
Правильная стратегия — не отменять загрузку, а модифицировать содержимое переменной Объект до того, как система вызовет метод Записать(). Это гарантирует, что ваши изменения попадут в базу в рамках стандартного цикла обмена.
Подведем итог: наиболее эффективным способом является сочетание ПКС и ПКО с включенным поиском по идентификатору. Это минимизирует количество рукописного кода и использует стандартные механизмы платформы 1С. Если же структура данных заставляет вас работать с кодом, всегда помните о цикле Для Каждого Запись Из Объект, так как регистры почти всегда выгружаются наборами.
Ключевые объекты и методы, которые мы использовали:
Новый УникальныйИдентификатор(Строка) — конвертация строки в тип УИД.Документы[ИмяДокумента].ПолучитьСсылку(УИД) — получение ссылки по идентификатору без обращения к базе данных (быстрая операция).РегистрСведенийНаборЗаписей — коллекция, с которой мы работаем в обработчиках загрузки регистров.