При работе с инструментом «1С:Конвертация данных 2.1» (КД 2.1) разработчики часто сталкиваются с ситуациями, когда стандартного сопоставления полей через правила конвертации свойств (ПКС) недостаточно. Особенно это актуально при выгрузке сложных табличных частей, состав которых формируется динамически или требует предварительной обработки в виде таблицы значений (ТЗ). В таких случаях возникает вопрос: как передать уникальный идентификатор (УИД) ссылочного объекта, чтобы в базе-приемнике объект был найден или создан корректно, если мы не используем прямое ПКО для всей таблицы?
В данной статье мы подробно разберем, почему возникают сложности с получением УИД, как правильно использовать программный вызов выгрузки и какие настройки ПКО необходимы для успешной синхронизации объектов.
Рассмотрим ситуацию, когда при попытке получить УИД ссылки в обработчике выгрузки мы получаем Неопределено или пустую строку. Разберем основные причины этого поведения:
Номенклатура в вашей таблице значений получена не прямым обращением к ссылке справочника, а, например, через COM-соединение или из внешнего файла, метод УникальныйИдентификатор() может не работать напрямую.Для проверки типа данных перед получением УИД рекомендуется использовать следующий подход:
Если Справочники.Номенклатура.ТипВсеСсылки().СодержитТип(ТипЗнч(СтрокаТЗ.Номенклатура)) Тогда
ТекущийУИД = СтрокаТЗ.Номенклатура.УникальныйИдентификатор();
СтроковоеПредставлениеУИД = Строка(ТекущийУИД);
КонецЕсли;
Когда мы передаем данные табличной части как параметр (через структуру Параметры или ВходящиеДанные), нам необходимо вручную инициировать выгрузку ссылочных полей. Для этого используется глобальная функция ВыгрузитьПоПравилу. Проанализируем её синтаксис, так как ошибка в порядке параметров — самая частая причина неудачи.
Согласно справке и коду обработки выгрузки, сигнатура функции выглядит так:
Функция ВыгрузитьПоПравилу(
Источник = Неопределено,
Приемник = Неопределено,
ВходящиеДанные = Неопределено,
ИсходящиеДанные = Неопределено,
ИмяПКО = "",
УзелСсылки = Неопределено,
ТолькоПолучитьУзелСсылки = Ложь,
ПКО = Неопределено,
ВыгружатьСсылкиУПодчиненныхОбъектов = Истина,
ВыгрузкаСтрокиНабораЗаписейРегистра = Ложь,
УзелПредка = Неопределено,
ИмяКонстантыДляВыгрузки = "",
ЭтоВыгружаетсяОбъект = Неопределено,
ЭтоПравилоСГлобальнойВыгрузкойОбъектов = Ложь,
НеИспользоватьПравилоСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные = Ложь
)
Рассмотрим подробнее ключевые параметры:
ВходящиеДанные, этот параметр может быть Неопределено.Важный нюанс: Если вы вызываете функцию как ВыгрузитьПоПравилу(,,ВходящиеДанные,,"ИмяПКО"), то первым параметром (Источником) передается Неопределено. В этом случае в самом ПКО "ИмяПКО" поле "Объект источника" также должно быть пустым, либо логика ПКО должна быть перенастроена на работу с ВходящиеДанные.
Чтобы успешно передать УИД и найти объект в приемнике, когда Источник = Неопределено, выполним следующие шаги в конфигураторе «Конвертация данных»:
Теперь в коде вызова мы можем передать саму ссылку в качестве источника, и тогда КД 2.1 автоматически извлечет её УИД:
// Правильный вызов, если есть ссылка
ВыгрузитьПоПравилу(СтрокаТЗ.Номенклатура, , , , "усНоменклатура");
Если же ссылки нет, а есть только строковый УИД, мы должны использовать ВходящиеДанные:
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("УИД", СтрокаСУидом);
ВыгрузитьПоПравилу(Неопределено, , ВходящиеДанные, , "усНоменклатура");
Разберем еще один «хитрый» способ передачи ссылочных данных, который выручает при обмене между идентичными конфигурациями. Метод ЗначениеВСтрокуВнутр() позволяет упаковать ссылку со всеми её внутренними идентификаторами в строку.
В базе источнике:
СтрокаДляПередачи = ЗначениеВСтрокуВнутр(СтрокаТЗ.Номенклатура);
// Далее передаем эту строку как обычный текстовый параметр
В базе приемнике в обработчике «После загрузки» или «Перед загрузкой»:
ВосстановленнаяСсылка = ЗначениеИзСтрокиВнутр(СтрокаИзПараметра);
Важно помнить: Этот метод работает надежно только в том случае, если метаданные объектов (GUID типов) совпадают в обеих базах. В противном случае 1С не сможет распознать тип объекта из внутренней строки.
Проанализируем ситуацию, когда нам нужно передать УИД максимально "низкоуровневым" способом. В КД 2.1 при выгрузке формируется XML-файл. УИД объекта обычно записывается в атрибут Ref. Если мы работаем в обработчике «При выгрузке», мы можем напрямую управлять узлом ссылки.
Если вы хотите, чтобы поиск по УИД сработал в приемнике, убедитесь, что в XML передается узел следующего вида:
<Ссылка НПП="...">{строка-уид}</Ссылка>
Для того чтобы система при загрузке поняла, что это именно УИД, в ПКО приемника обязательно должен стоять флаг поиска по идентификатору. Если этот флаг снят, загрузчик проигнорирует внутренний идентификатор и будет искать объект по полям поиска (например, Код + Наименование), которые вы определили в ПКС.
Для успешной передачи УИД при работе с табличными частями через параметры в КД 2.1 следует придерживаться следующих правил:
ВыгрузитьПоПравилу. Источник — это первый параметр.ВходящиеДанные, не забудьте проставить соответствующие флаги в ПКС внутри «Конвертации данных».Источник в ПКО равен Неопределено, убедитесь, что вы предоставили достаточно данных во ВходящихДанных для идентификации или создания объекта.Используя эти методики, вы сможете гибко настраивать конвертацию даже самых сложных структур данных, сохраняя целостность ссылочных связей между информационными базами.