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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке на платформе 1С:Предприятие 8.3 часто возникает задача ограничить видимость данных в списках справочников по определенному условию — например, отображать только те элементы, код которых начинается с префикса текущей информационной базы. Стандартный подход с редактированием модуля каждой конкретной формы трудозатратен и неудобен при обновлении конфигурации. Рассмотрим, как можно реализовать эту задачу более элегантными способами, не затрагивая основной код форм.

Почему нельзя использовать подписку на событие?

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

Способ 1. Использование расширения конфигурации

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

Рассмотрим создание общего модуля в расширении или использование аннотации &После в модуле конкретной формы внутри расширения. Если нам нужно применить логику ко многим справочникам сразу, мы можем использовать механизм расширения для формы, которая является базовой, или для нескольких форм по отдельности.

Пример кода в расширении для формы списка:


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

Способ 2. Модуль менеджера и событие ОбработкаПолученияФормы

Выясним, как использовать модуль менеджера справочника. В нем существует событие ОбработкаПолученияФормы. Этот метод вызывается платформой перед тем, как форма будет создана и открыта. Здесь мы можем модифицировать параметры, которые будут переданы в форму.

Важный момент: через обычные параметры отбора (структуру Параметры.Отбор) можно передать только условие «Равно». Чтобы использовать условие «Начинается с», необходимо работать с фиксированными настройками динамического списка.

Разберем алгоритм действий в модуле менеджера справочника:

  1. Перехватываем событие ОбработкаПолученияФормы.
  2. Проверяем, что запрашивается именно форма списка или форма выбора.
  3. Создаем объект НастройкиКомпоновкиДанных.
  4. Добавляем в него нужные элементы отбора.
  5. Помещаем эти настройки в Параметры.ФиксированныеНастройки.

Пример реализации в модуле менеджера:


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

Способ 3. Глобальные механизмы БСП (для конфигураций на базе БСП)

Если вы работаете в современных конфигурациях (ERP, УТ 11, КА, БП 3.0), то в них внедрена Библиотека стандартных подсистем (БСП). В БСП предусмотрены специальные переопределяемые модули, которые позволяют внедрять логику во все формы системы сразу.

Проанализируем работу модуля ОбщегоНазначенияПереопределяемый. В нем часто присутствует процедура ПриСозданииНаСервере. Она вызывается для каждой открываемой формы в системе. Внутри этой процедуры можно выполнить проверку:


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

Этот способ позволяет централизованно управлять правилами отображения данных во всей информационной базе из одной точки.

Способ 4. Ограничение на уровне RLS (Row Level Security)

Если задача заключается в строгом разграничении прав доступа (чтобы пользователь физически не мог увидеть данные другого префикса), то правильнее всего использовать механизм Ограничения доступа на уровне записей (RLS).

Посмотрим на преимущества этого подхода:

Для реализации в конфигураторе в настройках роли для справочника на право "Чтение" добавляется условие:

ГДЕ Код ПОДОБНО &Префикс + "%"

Резюме

Мы рассмотрели несколько вариантов решения задачи. Выбор конкретного метода зависит от архитектуры вашей системы:

  1. Расширение — идеально для точечной настройки конкретных форм без изменения типовой конфигурации.
  2. ОбработкаПолученияФормы — хороший способ, если логика привязана к конкретному объекту метаданных.
  3. Переопределяемые модули БСП — лучший выбор для глобальных правил, действующих на всю систему.
  4. RLS — самый правильный метод с точки зрения безопасности и архитектуры 1С, если отбор должен быть обязательным.

Использование ФиксированныеНастройки в параметрах формы позволяет обойти ограничение по видам сравнения и наложить сложные фильтры (например, "Начинается с" или "В списке"), обеспечивая гибкость интерфейса без вмешательства в структуру основной конфигурации.

← На главную