Переход с конфигурации «Управление торговлей 10.3» (на обычных формах) на «Управление торговлей 11» (на управляемых формах) — это масштабная задача, требующая переосмысления архитектуры хранения многих данных. Одним из наиболее проблемных мест традиционно является перенос дополнительных свойств и характеристик номенклатуры.
В этой статье мы подробно разберем, как связать и перенести эти данные с помощью инструмента 1С:Конвертация данных 2.1 (КД 2), проанализируем архитектурные различия платформ и конфигураций, а также рассмотрим оптимизированные примеры кода для ускорения выгрузки.
Прежде чем приступать к написанию правил конвертации, важно понять, как именно устроено хранение этих данных в обеих конфигурациях:
ЗначенияСвойствОбъектов. В нем содержатся измерения Объект (ссылка на номенклатуру), Свойство (ссылка на план видов характеристик) и ресурс Значение.ДополнительныеРеквизиты внутри самой карточки справочника Номенклатура (и других объектов).Наша цель — «собрать» данные из внешнего регистра источника и записать их внутрь табличной части объекта в приемнике при помощи правил конвертации.
Рассмотрим стандартный и наиболее понятный способ решения этой задачи в Конвертации данных. Для этого нам понадобится настроить ПКГС (Правило конвертации группы свойств) для табличной части ДополнительныеРеквизиты внутри ПКО (Правила конвертации объектов) номенклатуры.
Разберем процесс настройки по шагам:
Номенклатура на вкладку «Конвертация свойств».ДополнительныеРеквизиты. Источник оставляем пустым, так как в источнике (УТ 10.3) такой табличной части нет. Приемником указываем табличную часть ДополнительныеРеквизиты.Свойство (приемник — Свойство, тип в приемнике — ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения).Значение (приемник — Значение, тип в приемнике может быть составным, включая справочник значений свойств).ДополнительныеРеквизиты откройте обработчик события Перед обработкой («Перед обработкой выгрузки группы свойств») и пропишите следующий код:
// Создаем запрос для получения свойств текущего объекта номенклатуры
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗначенияСвойствОбъектов.Свойство КАК Свойство,
| ЗначенияСвойствОбъектов.Значение КАК Значение
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
| ЗначенияСвойствОбъектов.Объект = &Объект";
Запрос.УстановитьПараметр("Объект", Источник.Ссылка);
// Выгружаем результат в Таблицу Значений и передаем ее в КоллекциюОбъектов
КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();
Как это работает: При выгрузке каждого элемента номенклатуры система КД выполняет данный обработчик. Переменная КоллекцияОбъектов инициализируется таблицей значений, содержащей колонки Свойство и Значение. КД автоматически сопоставляет имена колонок этой таблицы с именами ПКС, созданными внутри ПКГС, и выгружает их как строки табличной части.
Предыдущий способ отлично работает на небольших базах данных. Однако, если у вас в справочнике номенклатуры содержится более 10 000 позиций, выполнение отдельного SQL-запроса для каждого товара критически замедлит выгрузку. Процесс переноса может затянуться на долгие часы.
Выясним, как оптимизировать этот алгоритм с помощью кэширования данных в глобальном параметре обмена. Мы выполним всего один запрос к базе данных, сохраним результаты во временной таблице в оперативной памяти и будем моментально получать свойства по ключу ссылки.
Для этого изменим код в обработчике Перед обработкой нашего ПКГС ДополнительныеРеквизиты:
// Инициализируем кэш свойств при первой выгрузке номенклатуры
Если Параметры.Свойство("КэшСвойствНоменклатуры") = Ложь Тогда
ЗапросКэша = Новый Запрос;
ЗапросКэша.Текст =
"ВЫБРАТЬ
| ЗначенияСвойствОбъектов.Объект КАК Объект,
| ЗначенияСвойствОбъектов.Свойство КАК Свойство,
| ЗначенияСвойствОбъектов.Значение КАК Значение
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
| ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура";
ТаблицаВсехСвойств = ЗапросКэша.Perform().Выгрузить();
// Структурируем данные в Соответствие для быстрого поиска по ссылке объекта
СоответствиеКэша = Новый Соответствие;
Для Каждого СтрокаСвойства Из ТаблицаВсехСвойств Цикл
ТаблицаОбъекта = СоответствиеКэша[СтрокаСвойства.Объект];
Если ТаблицаОбъекта = Неопределено Тогда
ТаблицаОбъекта = Новый ТаблицаЗначений;
ТаблицаОбъекта.Колонки.Добавить("Свойство");
ТаблицаОбъекта.Колонки.Добавить("Значение");
СоответствиеКэша.Вставить(СтрокаСвойства.Объект, ТаблицаОбъекта);
КонецЕсли;
НоваяСтрока = ТаблицаОбъекта.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаСвойства);
КонецЦикла;
// Сохраняем кэш в глобальных параметрах конвертации
Параметры.Вставить("КэшСвойствНоменклатуры", СоответствиеКэша);
КонецЕсли;
// Извлекаем таблицу свойств для конкретной выгружаемой позиции
КэшСвойств = Параметры.КэшСвойствНоменклатуры;
КоллекцияОбъектов = КэшСвойств[Источник.Ссылка];
// Если у номенклатуры нет свойств, инициализируем пустую таблицу во избежание ошибок КД
Если КоллекцияОбъектов = Неопределено Тогда
КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Свойство");
КоллекцияОбъектов.Колонки.Добавить("Значение");
КонецЕсли;
Важно: Такой подход снижает нагрузку на СУБД в сотни раз, повышая общую скорость выгрузки данных практически до максимума возможностей платформы.
Даже если вы успешно перенесете строки в табличную часть ДополнительныеРеквизиты, вы можете столкнуться со следующей проблемой: в интерфейсе УТ 11 перенесенные свойства будут отображаться как перечеркнутые, либо вообще не будут видны пользователю в карточке товара.
Рассмотрим причины этого поведения и способы их устранения:
НаборыДополнительныхРеквизитовИСведений. Каждому Виду номенклатуры соответствует свой предопределенный набор. Выгружаемые свойства (элементы ПВХ) должны быть обязательно добавлены в табличную часть соответствующего набора свойств в приемнике.ЗначенияСвойствОбъектов. При настройке ПКО для этого справочника обязательно укажите ПКС для реквизита Владелец (им должно выступать само свойство — ПВХ), иначе значения не будут привязаны к контексту своего родительского свойства.Чтобы избежать ручного сопоставления структуры метаданных и гарантировать корректное обновление внутренних кэшей БСП на стороне УТ 11, мы можем передать таблицу свойств через параметры объекта и применить встроенное API конфигурации-приемника.
Посмотрим на пример реализации этой схемы:
1. В источнике (УТ 10.3) в ПКО Номенклатуры создаем ПКС без источника и приемника, взводим флаг «Передавать данные в параметр объекта» и называем его, например, ТаблицаСвойствДляБСП. Заполняем его таблицей значений свойств в обработчике Перед выгрузкой.
2. В приемнике (УТ 11) в ПКО Номенклатуры в обработчике После загрузки пишем следующий код:
Если ПараметрыОбъекта <> Неопределено Тогда
ВходящиеСвойства = ПараметрыОбъекта.Получить("ТаблицаСвойствДляБСП");
Если ВходящиеСвойства <> Неопределено И ВходящиеСвойства.Количество() > 0 Тогда
// Создаем ТЗ совместимого с БСП формата
ТаблицаСвойствБСП = Новый ТаблицаЗначений;
ТаблицаСвойствБСП.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаСвойствБСП.Колонки.Добавить("Значение");
Для Каждого Строка Из ВходящиеСвойства Цикл
НоваяСтрока = ТаблицаСвойствБСП.Добавить();
НоваяСтрока.Свойство = Строка.Свойство;
НоваяСтрока.Значение = Строка.Значение;
КонецЦикла;
// Используем штатный метод БСП для безопасной записи свойств объекта
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Объект.Ссылка, ТаблицаСвойствБСП);
КонецЕсли;
КонецЕсли;
Этот метод гарантирует, что система автоматически пропишет все необходимые связи с наборами свойств и корректно зарегистрирует изменения для последующих обменов (например, с интернет-магазином).
Если вы хотите сэкономить время, воспользуйтесь стандартным решением от фирмы 1С. В дистрибутив УТ 11 входит обработка перехода Выгрузка данных.epf (для запуска на стороне УТ 10.3). Внутри этого файла макетом вшиты готовые правила конвертации.
Вы можете извлечь данный макет правил обмена XML и загрузить его в свою базу Конвертации данных 2.1. Проанализировав эти правила, вы увидите готовые примеры сопоставления планов видов характеристик, настройки ПКО для значений свойств и автоматического распределения реквизитов по видам номенклатуры.