Как перенести дополнительные свойства из УТ 10.3 в дополнительные реквизиты УНФ при помощи Конвертации данных 2.1

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

При миграции данных из старых конфигураций, таких как Управление торговлей 10.3, в современные решения на базе БСП (например, Управление нашей фирмой 1.6/3.0), разработчики часто сталкиваются с проблемой переноса дополнительных свойств. В старых системах эти данные хранятся в регистре сведений ЗначенияСвойствОбъектов, тогда как в новых они располагаются в табличных частях самих объектов или в специальных наборах.

Рассмотрим подробнее, как правильно организовать этот процесс, избегая типичных ошибок обращения к метаданным, и разберем по шагам наиболее надежные методы реализации в правилах конвертации данных (КД 2.1).

Анализ архитектурных различий

Прежде чем приступать к написанию кода, проанализируем ситуацию. В УТ 10.3 дополнительные свойства хранятся в регистре сведений. В УНФ (или УТ 11) используется механизм дополнительных реквизитов и сведений. Основная сложность заключается в том, что в базе-приемнике каждый дополнительный реквизит является элементом плана видов характеристик (ПВХ) ДополнительныеРеквизитыИСведения, а сами значения записываются в табличную часть ДополнительныеРеквизиты объекта (например, справочника Номенклатура).

Попытка обратиться напрямую к ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения в обработчике выгрузки базы-источника (УТ 10.3) приведет к ошибке, так как в метаданных источника такого объекта просто не существует. Программа выдаст исключение, так как код выгрузки исполняется в контексте старой базы.

Решение 1: Использование ПКО с поиском по наименованию

Это самый простой и правильный путь в рамках парадигмы Конвертации данных. Вместо того чтобы пытаться найти ссылку на свойство программно в источнике, мы делегируем поиск механизму загрузки в приемнике.

Выполним следующие шаги:

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

Рассмотрим пример кода в обработчике ПередВыгрузкой для табличной части (ПКГС):


// Создаем структуру для передачи данных в ТЧ ДополнительныеРеквизиты
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ЗначенияСвойствОбъектов.Значение КАК Значение,
    |   ЗначенияСвойствОбъектов.Свойство.Наименование КАК СвойствоНаименование
    |ИЗ
    |   РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |   ЗначенияСвойствОбъектов.Объект = &Объект";

Запрос.УстановитьПараметр("Объект", Источник.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();

КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Свойство");
КоллекцияОбъектов.Колонки.Добавить("Значение");

Пока Выборка.Следующий() Цикл
    НоваяСтрока = КоллекцияОбъектов.Добавить();
    // Передаем наименование свойства для поиска в базе-приемнике
    НоваяСтрока.Свойство = Выборка.СвойствоНаименование; 
    НоваяСтрока.Значение = Выборка.Значение;
КонецЦикла;

Решение 2: Перенос данных через ВходящиеДанные (IncomingData)

Если структура данных сложная, удобно использовать механизм ВходящиеДанные. Это позволяет подготовить всю таблицу свойств еще на этапе выгрузки владельца (например, самой Номенклатуры) и передать её целиком в правило конвертации табличной части.

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

В обработчике "Перед выгрузкой" ПКО Номенклатура:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ЗначенияСвойствОбъектов.Свойство.Наименование КАК Свойство,
    |   ЗначенияСвойствОбъектов.Значение КАК Значение
    |ИЗ
    |   РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |   ЗначенияСвойствОбъектов.Объект = &Объект";
Запрос.УстановитьПараметр("Объект", Источник.Ссылка);

ТЗ_ДопРеквизиты = Запрос.Выполнить().Выгрузить();

// Помещаем таблицу в структуру ВходящиеДанные
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("ДополнительныеРеквизиты", ТЗ_ДопРеквизиты);

Затем в настройках ПКГС (Правила конвертации группы свойств) для табличной части ДополнительныеРеквизиты необходимо установить галочку "Получать из входящих данных". В этом случае система автоматически сопоставит колонки таблицы значений с реквизитами табличной части приемника.

Нюанс с типами значений (Дополнительные значения)

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

Для корректной загрузки таких значений:

Наборы дополнительных реквизитов

Рассмотрим ситуацию: вы успешно выгрузили данные, они записались в табличную часть объекта в УНФ, но в интерфейсе (в карточке товара) они не видны. Это происходит потому, что в базе-приемнике не настроены Наборы дополнительных реквизитов и сведений.

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

Совет: После массовой загрузки данных рекомендуется выполнить в базе-приемнике обработку, которая проверит наличие всех перенесенных ПВХ в соответствующих наборах, или создать отдельное ПКО для заполнения справочника НаборыДополнительныхРеквизитовИСведений (табличная часть ДополнительныеРеквизиты).

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

← На главную