Как перенести фильтры товаров из 1С 7.7 в дополнительные реквизиты номенклатуры 1С:УТ 11 через Конвертацию данных?

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

При миграции с платформы 1С 7.7 на 1С:Управление торговлей 11 (УТ 11) часто возникает задача переноса произвольных классификаторов и фильтров товаров. В старых конфигурациях 7.7 для хранения параметров часто использовались отдельные справочники (например, ФильтрыПоТоварам), а в УТ 11 для этого применяется стандартный механизм дополнительных реквизитов Библиотеки стандартных подсистем (БСП).

Рассмотрим, как правильно настроить правила конвертации данных (КД 2), сформировать табличную часть ДополнительныеРеквизиты для справочника Номенклатура и избежать распространенных ошибок платформы 1С 7.7 при выборке данных.

Архитектура хранения дополнительных реквизитов в 1С:УТ 11

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

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

Ошибка передачи коллекции через СписокЗначений

Попытка упаковать данные в СписокЗначений в обработчике ПриВыгрузке и обойти их в ПриЗагрузке через цикл Для каждого приводит к ошибке: «Итератор для значения не определен». Это связано с тем, что объект СписокЗначений платформы 7.7 сериализуется в XML в специфичный формат, который на стороне 8.x не является стандартной коллекцией с поддержкой прямого обхода по произвольным именованным ключам.

Штатный и правильный механизм переноса табличных частей в КД 2 — использование ПКГС (Правил конвертации группы свойств).

Решение: Настройка ПКГС «ДополнительныеРеквизиты» через КоллекцияОбъектов

Для корректного заполнения табличной части номенклатуры выполним следующие шаги:

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

Важное замечание: имена колонок в создаваемой таблице значений должны строго совпадать с именами свойств приемника (Свойство, Значение), а не с названиями полей источника.

Формирование выборки в 1С 7.7 без логических ошибок

В коде источника 7.7 частой ошибкой является вызов метода ВыбратьЭлементы() сразу после НайтиПоРеквизиту(). Метод ВыбратьЭлементы() сбрасывает текущее позиционирование и запускает полный обход справочника. Для фильтрации по номенклатуре следует использовать метод ВыбратьЭлементыПоРеквизиту() или объект Запрос.

Посмотрим на корректный пример кода в обработчике «ПередОбработкой» ПКГС ДополнительныеРеквизиты:


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

СпрФТ = СоздатьОбъект("Справочник.ФильтрыТовары");

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

После формирования переменной КоллекцияОбъектов Конвертация данных автоматически обойдет каждую строку таблицы значений и применит к колонкам соответствующие ПКС (Свойство и Значение).

Альтернативный вариант: перенос через ПараметрыОбъекта и обработчик «ПослеЗагрузки»

Если структура свойств требует сложного поиска или создания наборов реквизитов непосредственно в момент загрузки, данные можно передать через произвольные параметры:

  1. В ПКО Номенклатура на стороне 7.7 в обработчике ПриВыгрузке заполняем таблицу значений и помещаем ее в структуру ПараметрыОбъекта.
  2. На стороне 8.3 в обработчике ПослеЗагрузки считываем таблицу и программно заполняем табличную часть:

Если ПараметрыОбъекта <> Неопределено И ПараметрыОбъекта.Свойство("ТаблицаФильтров") Тогда
    ТЗФильтров = ПараметрыОбъекта.ТаблицаФильтров;
    
    Для Каждого СтрФильтра Из ТЗФильтров Цикл
        НоваяСтрока = Объект.ДополнительныеРеквизиты.Добавить();
        НоваяСтрока.Свойство = СтрФильтра.Свойство;
        НоваяСтрока.Значение = СтрФильтра.Значение;
    КонецЦикла;
КонецЕсли;

Использование штатного механизма ПКГС и переменной КоллекцияОбъектов является более надежным решением, так как сохраняет типизацию ссылок и позволяет платформе 1С автоматически отслеживать соответствия между объектами 7.7 и 8.3.

← На главную