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