Как правильно передать УИД в Конвертации данных 2.1 при программной выгрузке без ПКО?

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

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

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

Почему УникальныйИдентификатор() возвращает пустое значение?

Рассмотрим ситуацию, когда при попытке получить УИД ссылки в обработчике выгрузки мы получаем Неопределено или пустую строку. Разберем основные причины этого поведения:

  1. Несоответствие типов: Если переменная Номенклатура в вашей таблице значений получена не прямым обращением к ссылке справочника, а, например, через COM-соединение или из внешнего файла, метод УникальныйИдентификатор() может не работать напрямую.
  2. «Битая» ссылка: Если в базе данных ссылка существует, но сам объект был удален (осталась только ссылка на несуществующую запись), получение идентификатора может вести себя непредсказуемо в зависимости от контекста выполнения кода.
  3. Объект еще не записан: Если вы пытаетесь получить УИД для нового, еще не записанного в базу объекта, этот метод вернет пустую ссылку.

Для проверки типа данных перед получением УИД рекомендуется использовать следующий подход:


Если Справочники.Номенклатура.ТипВсеСсылки().СодержитТип(ТипЗнч(СтрокаТЗ.Номенклатура)) Тогда
    ТекущийУИД = СтрокаТЗ.Номенклатура.УникальныйИдентификатор();
    СтроковоеПредставлениеУИД = Строка(ТекущийУИД);
КонецЕсли;

Программный вызов выгрузки через ВыгрузитьПоПравилу

Когда мы передаем данные табличной части как параметр (через структуру Параметры или ВходящиеДанные), нам необходимо вручную инициировать выгрузку ссылочных полей. Для этого используется глобальная функция ВыгрузитьПоПравилу. Проанализируем её синтаксис, так как ошибка в порядке параметров — самая частая причина неудачи.

Согласно справке и коду обработки выгрузки, сигнатура функции выглядит так:


Функция ВыгрузитьПоПравилу(
    Источник = Неопределено, 
    Приемник = Неопределено, 
    ВходящиеДанные = Неопределено, 
    ИсходящиеДанные = Неопределено, 
    ИмяПКО = "", 
    УзелСсылки = Неопределено, 
    ТолькоПолучитьУзелСсылки = Ложь, 
    ПКО = Неопределено, 
    ВыгружатьСсылкиУПодчиненныхОбъектов = Истина, 
    ВыгрузкаСтрокиНабораЗаписейРегистра = Ложь, 
    УзелПредка = Неопределено, 
    ИмяКонстантыДляВыгрузки = "", 
    ЭтоВыгружаетсяОбъект = Неопределено, 
    ЭтоПравилоСГлобальнойВыгрузкойОбъектов = Ложь, 
    НеИспользоватьПравилоСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные = Ложь
)

Рассмотрим подробнее ключевые параметры:

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

Настройка ПКО для работы без прямого источника

Чтобы успешно передать УИД и найти объект в приемнике, когда Источник = Неопределено, выполним следующие шаги в конфигураторе «Конвертация данных»:

  1. Создадим ПКО (например, "усНоменклатура"). Поле «Объект источника» оставляем пустым. «Объект приемника» указываем как «СправочникСсылка.Номенклатура».
  2. В настройках ПКО установим флаг «Искать объект приемника по внутреннему идентификатору объекта источника».
  3. В ПКС (свойствах) этого ПКО для ключевых полей (например, «Наименование» или «Артикул») установим флаг «Получать из входящих данных».

Теперь в коде вызова мы можем передать саму ссылку в качестве источника, и тогда КД 2.1 автоматически извлечет её УИД:


// Правильный вызов, если есть ссылка
ВыгрузитьПоПравилу(СтрокаТЗ.Номенклатура, , , , "усНоменклатура");

Если же ссылки нет, а есть только строковый УИД, мы должны использовать ВходящиеДанные:


ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("УИД", СтрокаСУидом);
ВыгрузитьПоПравилу(Неопределено, , ВходящиеДанные, , "усНоменклатура");

Альтернативный метод: Использование ЗначениеВСтрокуВнутр

Разберем еще один «хитрый» способ передачи ссылочных данных, который выручает при обмене между идентичными конфигурациями. Метод ЗначениеВСтрокуВнутр() позволяет упаковать ссылку со всеми её внутренними идентификаторами в строку.

В базе источнике:


СтрокаДляПередачи = ЗначениеВСтрокуВнутр(СтрокаТЗ.Номенклатура);
// Далее передаем эту строку как обычный текстовый параметр

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

ВосстановленнаяСсылка = ЗначениеИзСтрокиВнутр(СтрокаИзПараметра);

Важно помнить: Этот метод работает надежно только в том случае, если метаданные объектов (GUID типов) совпадают в обеих базах. В противном случае 1С не сможет распознать тип объекта из внутренней строки.

Ручное манипулирование XML-узлами

Проанализируем ситуацию, когда нам нужно передать УИД максимально "низкоуровневым" способом. В КД 2.1 при выгрузке формируется XML-файл. УИД объекта обычно записывается в атрибут Ref. Если мы работаем в обработчике «При выгрузке», мы можем напрямую управлять узлом ссылки.

Если вы хотите, чтобы поиск по УИД сработал в приемнике, убедитесь, что в XML передается узел следующего вида:

<Ссылка НПП="...">{строка-уид}</Ссылка>

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

Подведем итоги

Для успешной передачи УИД при работе с табличными частями через параметры в КД 2.1 следует придерживаться следующих правил:

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

← На главную