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