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

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

Переход с конфигурации «Управление торговлей 10.3» (на обычных формах) на «Управление торговлей 11» (на управляемых формах) — это масштабная задача, требующая переосмысления архитектуры хранения многих данных. Одним из наиболее проблемных мест традиционно является перенос дополнительных свойств и характеристик номенклатуры.

В этой статье мы подробно разберем, как связать и перенести эти данные с помощью инструмента 1С:Конвертация данных 2.1 (КД 2), проанализируем архитектурные различия платформ и конфигураций, а также рассмотрим оптимизированные примеры кода для ускорения выгрузки.

Архитектурные различия: Свойства в УТ 10.3 vs Доп. реквизиты в УТ 11

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

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

Наша цель — «собрать» данные из внешнего регистра источника и записать их внутрь табличной части объекта в приемнике при помощи правил конвертации.

Способ 1. Создание ПКГС и выгрузка свойств через запрос (Базовый метод)

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

Разберем процесс настройки по шагам:

  1. Откройте ваши правила обмена в КД 2.
  2. Перейдите в ПКО Номенклатура на вкладку «Конвертация свойств».
  3. Создайте новую строку — ПКГС для табличной части ДополнительныеРеквизиты. Источник оставляем пустым, так как в источнике (УТ 10.3) такой табличной части нет. Приемником указываем табличную часть ДополнительныеРеквизиты.
  4. Внутри этой группы свойств создайте два ПКС (Правила конвертации свойств):
    • Свойство (приемник — Свойство, тип в приемнике — ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения).
    • Значение (приемник — Значение, тип в приемнике может быть составным, включая справочник значений свойств).
  5. Для созданного ПКГС ДополнительныеРеквизиты откройте обработчик события Перед обработкой («Перед обработкой выгрузки группы свойств») и пропишите следующий код:

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

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

// Выгружаем результат в Таблицу Значений и передаем ее в КоллекциюОбъектов
КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();

Как это работает: При выгрузке каждого элемента номенклатуры система КД выполняет данный обработчик. Переменная КоллекцияОбъектов инициализируется таблицей значений, содержащей колонки Свойство и Значение. КД автоматически сопоставляет имена колонок этой таблицы с именами ПКС, созданными внутри ПКГС, и выгружает их как строки табличной части.

Способ 2. Оптимизация производительности (Решение проблемы «N+1 запросов»)

Предыдущий способ отлично работает на небольших базах данных. Однако, если у вас в справочнике номенклатуры содержится более 10 000 позиций, выполнение отдельного SQL-запроса для каждого товара критически замедлит выгрузку. Процесс переноса может затянуться на долгие часы.

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

Для этого изменим код в обработчике Перед обработкой нашего ПКГС ДополнительныеРеквизиты:


// Инициализируем кэш свойств при первой выгрузке номенклатуры
Если Параметры.Свойство("КэшСвойствНоменклатуры") = Ложь Тогда
    
    ЗапросКэша = Новый Запрос;
    ЗапросКэша.Текст = 
    "ВЫБРАТЬ
    |    ЗначенияСвойствОбъектов.Объект КАК Объект,
    |    ЗначенияСвойствОбъектов.Свойство КАК Свойство,
    |    ЗначенияСвойствОбъектов.Значение КАК Значение
    |ИЗ
    |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |    ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура";
    
    ТаблицаВсехСвойств = ЗапросКэша.Perform().Выгрузить();
    
    // Структурируем данные в Соответствие для быстрого поиска по ссылке объекта
    СоответствиеКэша = Новый Соответствие;
    Для Каждого СтрокаСвойства Из ТаблицаВсехСвойств Цикл
        
        ТаблицаОбъекта = СоответствиеКэша[СтрокаСвойства.Объект];
        Если ТаблицаОбъекта = Неопределено Тогда
            ТаблицаОбъекта = Новый ТаблицаЗначений;
            ТаблицаОбъекта.Колонки.Добавить("Свойство");
            ТаблицаОбъекта.Колонки.Добавить("Значение");
            СоответствиеКэша.Вставить(СтрокаСвойства.Объект, ТаблицаОбъекта);
        КонецЕсли;
        
        НоваяСтрока = ТаблицаОбъекта.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаСвойства);
        
    КонецЦикла;
    
    // Сохраняем кэш в глобальных параметрах конвертации
    Параметры.Вставить("КэшСвойствНоменклатуры", СоответствиеКэша);
    
КонецЕсли;

// Извлекаем таблицу свойств для конкретной выгружаемой позиции
КэшСвойств = Параметры.КэшСвойствНоменклатуры;
КоллекцияОбъектов = КэшСвойств[Источник.Ссылка];

// Если у номенклатуры нет свойств, инициализируем пустую таблицу во избежание ошибок КД
Если КоллекцияОбъектов = Неопределено Тогда
    КоллекцияОбъектов = Новый ТаблицаЗначений;
    КоллекцияОбъектов.Колонки.Добавить("Свойство");
    КоллекцияОбъектов.Колонки.Добавить("Значение");
КонецЕсли;

Важно: Такой подход снижает нагрузку на СУБД в сотни раз, повышая общую скорость выгрузки данных практически до максимума возможностей платформы.

Важные архитектурные нюансы БСП в базе-приемнике (УТ 11)

Даже если вы успешно перенесете строки в табличную часть ДополнительныеРеквизиты, вы можете столкнуться со следующей проблемой: в интерфейсе УТ 11 перенесенные свойства будут отображаться как перечеркнутые, либо вообще не будут видны пользователю в карточке товара.

Рассмотрим причины этого поведения и способы их устранения:

  1. Связь с Видами номенклатуры: Отображение реквизитов в карточке товара УТ 11 жестко привязано к механизму категорий — справочнику НаборыДополнительныхРеквизитовИСведений. Каждому Виду номенклатуры соответствует свой предопределенный набор. Выгружаемые свойства (элементы ПВХ) должны быть обязательно добавлены в табличную часть соответствующего набора свойств в приемнике.
  2. Подчинение значений свойств: Если свойство имеет тип значения «Дополнительное значение» (выбор из списка), то сами элементы этого списка в УТ 11 хранятся в подчиненном справочнике ЗначенияСвойствОбъектов. При настройке ПКО для этого справочника обязательно укажите ПКС для реквизита Владелец (им должно выступать само свойство — ПВХ), иначе значения не будут привязаны к контексту своего родительского свойства.

Альтернативный вариант: Использование программного API БСП на стороне загрузки

Чтобы избежать ручного сопоставления структуры метаданных и гарантировать корректное обновление внутренних кэшей БСП на стороне УТ 11, мы можем передать таблицу свойств через параметры объекта и применить встроенное API конфигурации-приемника.

Посмотрим на пример реализации этой схемы:

1. В источнике (УТ 10.3) в ПКО Номенклатуры создаем ПКС без источника и приемника, взводим флаг «Передавать данные в параметр объекта» и называем его, например, ТаблицаСвойствДляБСП. Заполняем его таблицей значений свойств в обработчике Перед выгрузкой.

2. В приемнике (УТ 11) в ПКО Номенклатуры в обработчике После загрузки пишем следующий код:


Если ПараметрыОбъекта <> Неопределено Тогда
    
    ВходящиеСвойства = ПараметрыОбъекта.Получить("ТаблицаСвойствДляБСП");
    
    Если ВходящиеСвойства <> Неопределено И ВходящиеСвойства.Количество() > 0 Тогда
        
        // Создаем ТЗ совместимого с БСП формата
        ТаблицаСвойствБСП = Новый ТаблицаЗначений;
        ТаблицаСвойствБСП.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
        ТаблицаСвойствБСП.Колонки.Добавить("Значение");
        
        Для Каждого Строка Из ВходящиеСвойства Цикл
            НоваяСтрока = ТаблицаСвойствБСП.Добавить();
            НоваяСтрока.Свойство = Строка.Свойство;
            НоваяСтрока.Значение = Строка.Значение;
        КонецЦикла;
        
        // Используем штатный метод БСП для безопасной записи свойств объекта
        УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Объект.Ссылка, ТаблицаСвойствБСП);
        
    КонецЕсли;
    
КонецЕсли;

Этот метод гарантирует, что система автоматически пропишет все необходимые связи с наборами свойств и корректно зарегистрирует изменения для последующих обменов (например, с интернет-магазином).

Полезный лайфхак: Использование типовых правил перехода

Если вы хотите сэкономить время, воспользуйтесь стандартным решением от фирмы 1С. В дистрибутив УТ 11 входит обработка перехода Выгрузка данных.epf (для запуска на стороне УТ 10.3). Внутри этого файла макетом вшиты готовые правила конвертации.

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

← На главную