В процессе ведения базы 1С:Управление нашей фирмой (УНФ) версии 1.6 пользователи часто сталкиваются с ситуацией, когда для разных категорий товаров создаются однотипные свойства, например, «Цвет» или «Размер». Со временем это приводит к появлению множества дублей в справочнике Дополнительные реквизиты и сведения, что затрудняет аналитику, выгрузку на сайт и работу с фильтрами. Рассмотрим подробно, как программно объединить эти свойства и навести порядок в характеристиках.
Прежде чем приступать к написанию кода, разберем, как связаны данные в системе. В 1С:УНФ 1.6 связь между справочником Категории номенклатуры и свойствами (план видов характеристик Дополнительные реквизиты и сведения) реализована через справочник Наборы дополнительных реквизитов и сведения.
Для каждой категории номенклатуры (или для номенклатуры в целом) существует соответствующий элемент в справочнике Наборы дополнительных реквизитов и сведений. Именно в этом наборе определяется список доступных свойств. Если свойство «Цвет» было создано внутри конкретной категории, оно часто становится «индивидуальным», что и порождает дубли при создании новых категорий. Наша задача — перевести все характеристики на использование одного «общего» свойства, которое мы назовем «Цвет_Основной».
Для начала проанализируем ситуацию в базе. Нам нужно найти основное свойство, которое станет эталоном, и собрать все ошибочные свойства-дубли. Проще всего это сделать через консоль запросов или программный поиск по имени реквизита. Выясним внутреннее имя (идентификатор) основного свойства, например, Цвет_Основной.
Рассмотрим пример кода для поиска основной ссылки на свойство:
НужноеСвойствоЦвет = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Цвет_Основной");
Если НужноеСвойствоЦвет.Пустая() Тогда
Сообщить("Основное свойство не найдено! Проверьте правильность заполнения имени.");
Возврат;
КонецЕсли;
Основная сложность заключается в том, что значения свойств характеристик хранятся в табличной части ДополнительныеРеквизиты справочника ХарактеристикиНоменклатуры. Чтобы заменить одно свойство на другое, нам необходимо перебрать все характеристики, найти в их табличной части строку со «старым» свойством и заменить его на «новое», сохранив при этом само значение (например, «Красный»).
Разберем по шагам реализацию этой задачи:
ДополнительныеРеквизиты. Если ссылка на свойство совпадает с дублем, заменяем её на правильную ссылку.Рассмотрим детальный пример кода для обработки характеристик:
&НаСервере
Процедура ОбъединитьСвойстваЦвета()
// Находим эталонное свойство
НужноеСвойствоЦвет = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Цвет_Основной");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЧ.Ссылка КАК Характеристика,
| ТЧ.Свойство КАК СтароеСвойство,
| ТЧ.Свойство.Имя КАК СвойствоИмя
|ИЗ
| Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ТЧ
|ГДЕ
| ТЧ.Свойство.Заголовок = ""Цвет""
| И ТЧ.Свойство <> &НужноеСвойство";
Запрос.УстановитьПараметр("НужноеСвойство", НужноеСвойствоЦвет);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Пропускаем те свойства, которые мы решили оставить (например, специфические)
Если СтрНайти(Выборка.СвойствоИмя, "Цвет_Спец") <> 0 Тогда
Продолжить;
КонецЕсли;
// Получаем объект характеристики для изменения
ХарактеристикаОбъект = Выборка.Характеристика.ПолучитьОбъект();
Изменено = Ложь;
Для Каждого СтрДопР Из ХарактеристикаОбъект.ДополнительныеРеквизиты Цикл
Если СтрДопР.Свойство = Выборка.СтароеСвойство Тогда
СтрДопР.Sвойство = НужноеСвойствоЦвет;
Изменено = Истина;
КонецЕсли;
КонецЦикла;
Если Изменено Тогда
ХарактеристикаОбъект.Записать();
Сообщить("У характеристики " + ХарактеристикаОбъект.Наименование + " заменено свойство.");
// Дополнительно: пометим старое свойство на удаление, если оно больше не нужно
СтароеСвойствоОбъект = Выборка.СтароеСвойство.ПолучитьОбъект();
Если Не СтароеСвойствоОбъект.ПометкаУдаления Тогда
СтароеСвойствоОбъект.УстановитьПометкуУдаления(Истина);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проанализируем несколько критических моментов, которые могут возникнуть при выполнении подобной корректировки:
1. Наименование характеристик. В 1С:УНФ наименование характеристики часто генерируется автоматически на основе выбранных значений свойств (например, «Красный, 42»). Если вы программно меняете Свойство в табличной части, текстовое Наименование самой характеристики не изменится автоматически. Чтобы обновить его, после записи объекта рекомендуется вызвать метод переформирования наименования, если он предусмотрен в логике вашей конфигурации, или обновить его вручную по шаблону.
2. Значения свойств. Убедитесь, что типы значений у старого и нового свойства совпадают (например, оба являются справочником Значения свойств объектов). Если типы разные, простая подмена ссылки на свойство приведет к тому, что значение в колонке Значение станет невалидным или очистится.
3. Наборы свойств в категориях. Как упоминалось ранее, после исправления характеристик необходимо зайти в Категории номенклатуры и убедиться, что в их наборах дополнительных реквизитов теперь выбрано правильное свойство «Цвет_Основной». В противном случае при создании новой характеристики пользователь снова увидит старое поле ввода или не увидит его вовсе.
Если вы не хотите писать программный код, проанализируем стандартный инструмент — обработку «Поиск и замена дублей» (доступна в разделе Администрирование — Обслуживание).
Этот инструмент позволяет:
Дополнительные реквизиты и сведения (ПВХ).Преимущество этого метода: Система автоматически найдет все ссылки на дубли во всех таблицах (включая наборы свойств категорий, характеристики и регистры сведений) и заменит их на эталон. Это значительно безопаснее ручного написания кода, так как минимизирует риск оставить «битые» ссылки в наборах свойств.
Мы рассмотрели механизм программного объединения свойств в 1С:УНФ 1.6. Помните, что любые манипуляции с данными в табличных частях ХарактеристикиНоменклатуры требуют предварительного создания резервной копии базы. После выполнения объединения обязательно запустите тестирование и исправление базы, а также проверьте корректность отображения характеристик в отчетах и карточках товаров.