Как объединить дублирующиеся свойства Цвет и Размер в характеристиках товаров в 1С:УНФ 1.6?

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

В процессе ведения базы 1С:Управление нашей фирмой (УНФ) версии 1.6 пользователи часто сталкиваются с ситуацией, когда для разных категорий товаров создаются однотипные свойства, например, «Цвет» или «Размер». Со временем это приводит к появлению множества дублей в справочнике Дополнительные реквизиты и сведения, что затрудняет аналитику, выгрузку на сайт и работу с фильтрами. Рассмотрим подробно, как программно объединить эти свойства и навести порядок в характеристиках.

Архитектурная связь категорий и свойств

Прежде чем приступать к написанию кода, разберем, как связаны данные в системе. В 1С:УНФ 1.6 связь между справочником Категории номенклатуры и свойствами (план видов характеристик Дополнительные реквизиты и сведения) реализована через справочник Наборы дополнительных реквизитов и сведения.

Для каждой категории номенклатуры (или для номенклатуры в целом) существует соответствующий элемент в справочнике Наборы дополнительных реквизитов и сведений. Именно в этом наборе определяется список доступных свойств. Если свойство «Цвет» было создано внутри конкретной категории, оно часто становится «индивидуальным», что и порождает дубли при создании новых категорий. Наша задача — перевести все характеристики на использование одного «общего» свойства, которое мы назовем «Цвет_Основной».

Поиск и идентификация дублей

Для начала проанализируем ситуацию в базе. Нам нужно найти основное свойство, которое станет эталоном, и собрать все ошибочные свойства-дубли. Проще всего это сделать через консоль запросов или программный поиск по имени реквизита. Выясним внутреннее имя (идентификатор) основного свойства, например, Цвет_Основной.

Рассмотрим пример кода для поиска основной ссылки на свойство:


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

Алгоритм замены свойств в характеристиках

Основная сложность заключается в том, что значения свойств характеристик хранятся в табличной части ДополнительныеРеквизиты справочника ХарактеристикиНоменклатуры. Чтобы заменить одно свойство на другое, нам необходимо перебрать все характеристики, найти в их табличной части строку со «старым» свойством и заменить его на «новое», сохранив при этом само значение (например, «Красный»).

Разберем по шагам реализацию этой задачи:

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

Рассмотрим детальный пример кода для обработки характеристик:


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

    Пока Выборка.Следующий() Цикл
        
        // Пропускаем те свойства, которые мы решили оставить (например, специфические)
        Если СтрНайти(Выборка.СвойствоИмя, "Цвет_Спец") <> 0 Тогда
            Продолжить;
        КонецЕсли;

        // Получаем объект характеристики для изменения
        ХарактеристикаОбъект = Выборка.Характеристика.ПолучитьОбъект();
        Изменено = Ложь;

        Для Каждого СтрДопР Из ХарактеристикаОбъект.ДополнительныеРеквизиты Цикл
            Если СтрДопР.Свойство = Выборка.СтароеСвойство Тогда
                СтрДопР.Sвойство = НужноеСвойствоЦвет;
                Изменено = Истина;
            КонецЕсли;
        КонецЦикла;

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

КонецПроцедуры

Важные нюансы при обновлении данных

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

1. Наименование характеристик. В 1С:УНФ наименование характеристики часто генерируется автоматически на основе выбранных значений свойств (например, «Красный, 42»). Если вы программно меняете Свойство в табличной части, текстовое Наименование самой характеристики не изменится автоматически. Чтобы обновить его, после записи объекта рекомендуется вызвать метод переформирования наименования, если он предусмотрен в логике вашей конфигурации, или обновить его вручную по шаблону.

2. Значения свойств. Убедитесь, что типы значений у старого и нового свойства совпадают (например, оба являются справочником Значения свойств объектов). Если типы разные, простая подмена ссылки на свойство приведет к тому, что значение в колонке Значение станет невалидным или очистится.

3. Наборы свойств в категориях. Как упоминалось ранее, после исправления характеристик необходимо зайти в Категории номенклатуры и убедиться, что в их наборах дополнительных реквизитов теперь выбрано правильное свойство «Цвет_Основной». В противном случае при создании новой характеристики пользователь снова увидит старое поле ввода или не увидит его вовсе.

Использование стандартных средств (Поиск и замена дублей)

Если вы не хотите писать программный код, проанализируем стандартный инструмент — обработку «Поиск и замена дублей» (доступна в разделе Администрирование — Обслуживание).

Этот инструмент позволяет:

Преимущество этого метода: Система автоматически найдет все ссылки на дубли во всех таблицах (включая наборы свойств категорий, характеристики и регистры сведений) и заменит их на эталон. Это значительно безопаснее ручного написания кода, так как минимизирует риск оставить «битые» ссылки в наборах свойств.

Заключение

Мы рассмотрели механизм программного объединения свойств в 1С:УНФ 1.6. Помните, что любые манипуляции с данными в табличных частях ХарактеристикиНоменклатуры требуют предварительного создания резервной копии базы. После выполнения объединения обязательно запустите тестирование и исправление базы, а также проверьте корректность отображения характеристик в отчетах и карточках товаров.

← На главную