В типовых конфигурациях на платформе 1С 7.7, таких как «Торговля и Склад» или «Комплексная автоматизация», механизм свойств номенклатуры реализован достаточно просто: есть справочник Номенклатура, которому подчинен справочник Свойства. Каждый элемент этого подчиненного справочника ссылается на ВидСвойства и содержит конкретное Значение. Однако при большом ассортименте товаров возникает потребность в «главенствующих свойствах» или категориях, которые бы ограничивали список доступных свойств для конкретной позиции (например, чтобы у «Кранов» нельзя было выбрать свойство «Объем», а у «Ванн» — «Диаметр»).
Разберем подробно, как можно реализовать такую задумку, сохранив при этом преемственность с типовыми механизмами и обеспечив удобство работы пользователей.
Проанализируем самый простой путь, требующий минимального вмешательства в программный код. Мы можем использовать штатную иерархию справочника ВидыСвойств.
ВидыСвойств создадим группы, которые будут соответствовать нашим «главным свойствам» или категориям номенклатуры (например, группа «Запорная арматура», группа «Санфаянс»).ОсновнаяКатегорияСвойств), который будет ссылаться на соответствующую группу справочника ВидыСвойств.При выборе вида свойства в подчиненном справочнике Свойства, нам останется лишь программно установить фильтр, чтобы пользователь видел только элементы из выбранной группы.
Если виды свойств могут пересекаться между разными категориями (например, свойство «Цвет» нужно и для ванн, и для смесителей), иерархическая структура групп нам не подойдет. В этом случае рассмотрим создание промежуточного механизма связи.
Создадим новый справочник — назовем его НаборыСвойств или Аналитика. В этом справочнике мы будем определять, какие виды свойств доступны для данного набора. Связь можно реализовать через подчиненный справочник или через строку с кодами видов свойств (для продвинутых разработчиков).
Алгоритм работы:
НаборыСвойств.НаборыСвойств содержит список разрешенных элементов из справочника ВидыСвойств.Выясним, как технически реализовать ограничение выбора в интерфейсе 1С 7.7. Для этого нам понадобится перехватить событие начала выбора значения в форме подчиненного справочника Свойства.
Рассмотрим пример кода, который необходимо разместить в модуле формы справочника Свойства (или в форме его редактирования). Мы будем использовать метод ИспользоватьСписокЭлементов(), который является наиболее гибким инструментом фильтрации в «семерке».
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандартнойОбработки)
Если ИдентЭлемДиалога = "ВидСвойства" Тогда
// Отключаем стандартный выбор, чтобы открыть форму программно
ФлагСтандартнойОбработки = 0;
// Получаем ссылку на текущую номенклатуру (владельца)
ТекНоменклатура = Владелец;
// Создаем список значений для фильтрации
СписокРазрешенныхВидов = СоздатьОбъект("СписокЗначений");
// Здесь должна быть логика заполнения списка.
// Например, выберем виды свойств, связанные с категорией номенклатуры
// В данном примере предположим, что у номенклатуры есть реквизит "Категория"
Если ТекНоменклатура.Категория.Выбран() = 1 Тогда
// Заполняем список из аналитического справочника или по условию
// СписокРазрешенныхВидов.ДобавитьЗначение(...);
КонецЕсли;
// Открываем форму выбора справочника "ВидыСвойств"
// Передаем список в качестве фильтра
КонтекстПодбора = СоздатьОбъект("СписокЗначений");
КонтекстПодбора.Установить("Фильтр", СписокРазрешенныхВидов);
ОткрытьФормуМодально("Справочник.ВидыСвойств.ФормаСписка", СписокРазрешенныхВидов);
КонецЕсли;
КонецПроцедуры
В самой форме списка справочника ВидыСвойств в процедуре ПриОткрытии необходимо принять этот список и применить его:
Процедура ПриОткрытии()
СписокФильтра = Форма.Параметр;
Если ТипЗначенияСтр(СписокФильтра) = "СписокЗначений" Тогда
ИспользоватьСписокЭлементов(СписокФильтра);
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию, когда свойство называется одинаково (например, «Диаметр»), но для разных товаров оно должно иметь разные наборы значений (для кранов 10–50 мм, для задвижек 40–150 мм). В 1С 7.7 значения свойств обычно хранятся в справочнике ЗначенияСвойств, который подчинен справочнику ВидыСвойств.
Чтобы реализовать такую логику «защиты от дурака», мы можем пойти двумя путями:
ВидыСвойств: «Диаметр (краны)» и «Диаметр (задвижки)». Это самый простой способ, исключающий программные ошибки, но плодящий сущности в справочнике.ПриНачалеВыбораЗначения для реквизита Значение проверять категорию товара и фильтровать уже справочник ЗначенияСвойств по диапазону кодов или по вхождению в определенную группу.Если ваша база данных работает на SQL-версии и количество свойств исчисляется тысячами, стандартные методы фильтрации могут начать подтормаживать. Рассмотрим возможность применения компоненты 1CPP.
С помощью прямых SQL-запросов через 1CPP можно мгновенно получать списки разрешенных свойств, даже если связи между товарами и их характеристиками очень сложные. Также это позволяет выводить свойства в виде удобной таблицы прямо в форме списка номенклатуры, имитируя поведение динамических списков из 1С 8.3.
Резюмируем: наиболее оптимальным путем для реализации задумки автора является создание справочника-связки между номенклатурой и видами свойств. Это позволит гибко управлять наборами характеристик, не перегружая дерево групп основного справочника ВидыСвойств. Программная реализация через перехват выбора и метод ИспользоватьСписокЭлементов обеспечит жесткий контроль за вводом данных пользователями.