Как динамически управлять видимостью колонок в списке номенклатуры в зависимости от выбранной папки

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При работе с крупными справочниками, такими как Номенклатура в конфигурации Управление производственным предприятием 1.3, разработчики часто сталкиваются с необходимостью адаптации интерфейса под конкретные категории товаров. Если вы добавили специфические реквизиты (например, «Толщина» для мембран или «Диаметр» для штуцеров), показывать их все одновременно в общем списке — плохое решение. Это перегружает форму и запутывает пользователя.

В этой статье мы разберем, как реализовать механизм, который будет автоматически скрывать или показывать нужные колонки при переходе из одной папки справочника в другую. Мы рассмотрим как быстрые программные решения, так и более архитектурно правильные подходы, принятые в профессиональной среде разработки 1С.

Способ 1. Программное управление видимостью в событии ПриАктивизацииСтроки

Самый прямой путь решения задачи — это использование обработчика события ПриАктивизацииСтроки для элемента формы СправочникСписок. Этот метод позволяет оперативно реагировать на действия пользователя, когда он перемещается по дереву групп или заходит внутрь папки.

Разберем основной алгоритм действий. Нам необходимо определить текущего родителя (папку) и, исходя из его наименования или ссылки, изменить свойство Видимость у соответствующих колонок таблицы.

Рассмотрим пример кода, который можно разместить в модуле формы списка или формы подбора:


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

Важное замечание: Сравнение по наименованию (ИмяПапки = "Мембраны") — это «хрупкий» код. Если пользователь переименует папку, механизм перестанет работать. Профессиональнее использовать поиск по коду или проверку на вхождение в массив предопределенных ссылок.

Оптимизация: Избавляемся от «мерцания» интерфейса

Если выполнять код управления видимостью при каждом клике на строку (даже внутри одной и той же папки), форма может начать «подтормаживать» или неприятно мерцать. Выясним причину: свойство Видимость заставляет платформу перерисовывать всю таблицу. Чтобы этого избежать, добавим проверку на изменение родителя.

Создадим переменную модуля формы мТекущийОтображаемыйРодитель и будем менять колонки только тогда, когда пользователь действительно перешел в другую группу:


Перем мТекущийОтображаемыйРодитель;

Процедура СписокПриАктивизацииСтроки(Элемент)
    НовыйРодитель = ЭлементыФормы.Список.ТекущийРодитель;
    
    // Если родитель не изменился, ничего не делаем
    Если НовыйРодитель = мТекущийОтображаемыйРодитель Тогда
        Возврат;
    КонецЕсли;
    
    // Запоминаем нового родителя
    мТекущийОтображаемыйРодитель = НовыйРодитель;
    
    // Далее следует логика управления видимостью...
    ЛогикаУправленияКолонками(НовыйРодитель);
КонецПроцедуры

Способ 2. Использование дополнительных свойств (правильный подход для УПП)

Проанализируем ситуацию с точки зрения архитектуры 1С. Добавление новых реквизитов непосредственно в объект Справочник.Номенклатура для каждого специфического параметра — это путь к «раздуванию» базы данных и усложнению обновлений. В УПП 1.3 для этих целей предусмотрен механизм Дополнительных свойств объектов.

Вместо создания колонок для реквизитов Толщина и Давление, выполним следующие шаги:

  1. Зарегистрируем свойства в плане видов характеристик СвойстваОбъектов.
  2. Назначим эти свойства для определенных групп номенклатуры.
  3. На форме списка выведем эти данные через механизм ПриПолученииДанных.

Такой подход позволит добавлять неограниченное количество характеристик без изменения структуры таблиц БД. Для вывода этих свойств в список можно использовать динамическое добавление колонок в коде формы ПриОткрытии, а их заполнение реализовать через запрос в событии ПриПолученииДанных, что обеспечит высокую производительность списка.

Способ 3. Создание специализированной формы подбора

Если типовой функционал СправочникСписок не позволяет реализовать нужную «косметику», рассмотрим вариант создания отдельной формы. Часто в задачах подбора удобнее разделить экран на две части:

  1. Слева — Дерево (только группы номенклатуры).
  2. Справа — ТаблицаЗначений (состав выбранной группы).

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

Рекомендации по реализации

Подведем итог и выделим ключевые правила работы с динамической видимостью в 1С:

Выбор конкретного метода зависит от того, насколько глубоко вы готовы менять конфигурацию. Для быстрой правки «на коленке» подойдет событие ПриАктивизацииСтроки, но для долгосрочного развития системы лучше использовать штатные механизмы дополнительных свойств и характеристик.

← На главную