При работе с типовыми конфигурациями на базе Библиотеки стандартных подсистем (БСП) часто возникает задача: перенести данные, которые в базе-источнике хранятся в табличной части ДополнительныеРеквизиты, в основной реквизит объекта в базе-приемнике. В инструменте «Конвертация данных 2.1» (КД 2.1) эта задача требует понимания работы обработчиков событий и механизмов поиска объектов. В этой статье мы подробно разберем, как реализовать такой перенос, настроить фильтрацию и избежать типичных ошибок, таких как подстановка «первого попавшегося» элемента из справочника.
Рассмотрим классическую ситуацию: в справочнике Номенклатура источника есть дополнительный реквизит «Производитель» (хранится в ТЧ), а в базе-приемнике это полноценный реквизит объекта с типом СправочникСсылка.Производители. Нам необходимо при выгрузке «вытащить» значение из табличной части и передать его в правило конвертации свойства (ПКС) основного реквизита.
Для начала проанализируем, как хранятся дополнительные реквизиты. Обычно это табличная часть, где есть колонки Свойство (план видов характеристик) и Значение. Наша цель — найти строку с нужным свойством и передать его значение в приемник.
Разберем по шагам создание правила для реквизита Производитель внутри ПКО (Правила конвертации объектов) Номенклатура:
Номенклатура.Производитель.Производители). Это необходимо, чтобы система знала, как искать или создавать объект в базе-приемнике.Для получения значения дополнительного реквизита воспользуемся обработчиком «Перед выгрузкой» в созданном ПКС. Рассмотрим два способа реализации.
Способ 1: Использование механизмов БСП
Если конфигурация-источник построена на БСП, мы можем вызвать стандартную функцию общего модуля. Это наиболее элегантный метод, однако он требует, чтобы объект был записан в базе данных.
// В обработчике ПКС "Перед выгрузкой"
// Нам нужно передать ссылку на объект и само свойство (ПВХ)
СвойствоПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Производитель (Номенклатура)");
Значение = УправлениеСвойствами.ЗначениеСвойства(Источник.Ссылка, СвойствоПВХ);
Обратите внимание: в первом параметре функции УправлениеСвойствами.ЗначениеСвойства крайне желательно передавать именно Источник.Ссылка. Использование просто переменной Источник (которая может содержать объект в памяти) часто приводит к ошибкам в запросах внутри БСП, особенно если объект еще не был зафиксирован в транзакции.
Способ 2: Прямой перебор табличной части (универсальный)
Если использование функций БСП вызывает ошибки или конфигурация сильно изменена, мы можем проанализировать табличную часть ДополнительныеРеквизиты напрямую. Этот способ надежнее, так как работает с данными объекта в памяти.
// В обработчике ПКС "Перед выгрузкой"
Для Каждого СтрокаДопРеквизитов Из Источник.ДополнительныеРеквизиты Цикл
Если СтрокаДопРеквизитов.Свойство.Наименование = "Производитель" Тогда
Значение = СтрокаДопРеквизитов.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
Проанализируем этот код: мы итерируем строки, ищем совпадение по наименованию свойства и, как только находим, присваиваем результат переменной Значение. КД 2.1 автоматически подхватит это содержимое и отправит его на обработку правилу конвертации объекта, указанному в ПКС.
Часто возникает проблема: данные выгружаются, но в приемнике реквизит заполняется «первым попавшимся» элементом справочника или вовсе остается пустым. Выясним причину: это происходит из-за некорректной настройки поиска в ПКО, которое отвечает за создание/сопоставление Производителя.
Рассмотрим правильную настройку ПКО Производители:
Значение (например, СправочникСсылка.ЗначенияСвойствОбъектов или просто Строка, если в доп. реквизитах хранится текст).Наименование) и установите галочку «Поиск».Если в источнике дополнительный реквизит имеет тип «Дополнительное значение» (специальный справочник БСП), то при передаче его в ПКО справочника Производители, система возьмет его строковое представление (наименование) и попытается найти производителя с таким же именем в базе-приемнике.
Если вам нужно перенести сразу 10-15 дополнительных реквизитов в разные основные поля объекта, постоянный перебор табличной части в каждом ПКС замедлит выгрузку. Рассмотрим способ оптимизации через ИсходящиеДанные.
В ПКО Номенклатура в обработчике «Перед выгрузкой» (самого объекта, а не свойства) один раз сформируем структуру данных:
СтруктураДопРеквизитов = Новый Структура;
Для Каждого СтрокаТЧ Из Источник.ДополнительныеРеквизиты Цикл
ИмяСвойства = СтрЗаменить(СтрокаТЧ.Свойство.Наименование, " ", ""); // Убираем пробелы для ключа структуры
СтруктураДопРеквизитов.Вставить(ИмяСвойства, СтрокаТЧ.Значение);
КонецЦикла;
ИсходящиеДанные = СтруктураДопРеквизитов;
Теперь в каждом ПКС (например, для производителя, цвета, веса) достаточно написать в обработчике «Перед выгрузкой» одну строку:
Значение = ВходящиеДанные.Производитель;
Таким образом, мы проходим по табличной части источника всего один раз, что значительно повышает производительность обмена при больших объемах данных.
Мы проанализировали процесс трансформации данных из гибкой модели дополнительных реквизитов в жесткую структуру основных реквизитов объекта. Ключевые моменты успеха — это правильное использование переменной Значение в обработчиках ПКС, грамотная настройка полей поиска в ПКО и, при необходимости, использование ВходящихДанных для оптимизации скорости работы выгрузки. Следуя этим инструкциям, вы сможете настроить надежный и быстрый обмен данными между любыми конфигурациями 1С.