Как в обычных формах 1С ограничить выбор в стандартном окне «Отбор и сортировка»?

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

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

Когда мы пытаемся решить эту задачу стандартными методами, мы сразу натыкаемся на препятствие. Кнопка «Отбор и сортировка» на панели инструментов журналов документов открывает диалоговое окно. Попытки найти эту форму в дереве метаданных конфигуратора ни к чему не приводят. Выясним причину этого поведения и подробно разберем практические способы обхода этой проблемы без использования тяжеловесного механизма RLS (Record Level Security).

Почему форму «Отбор и сортировка» нельзя найти в конфигураторе?

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

Тем не менее существует несколько обходных путей, которые позволяют решить задачу ограничения выбора. Рассмотрим их подробно по шагам.

---

Способ 1. Фильтрация на стороне формы выбора справочника (Рекомендуемый метод)

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

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

Разберем по шагам реализацию этого механизма:

  1. Откроем в конфигураторе справочник Организации и перейдем к его формам.
  2. Найдем или создадим основную форму выбора (обычно это ФормаВыбора).
  3. В модуле этой формы найдем или создадим обработчик события ПередОткрытием.
  4. Пропишем программную установку отбора и заблокируем его изменение пользователем.

Посмотрим на пример реализации кода:


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

Метод ПолучитьДоступныеОрганизацииДляТекущегоПользователя() может быть вынесен в общий модуль с флагом "Клиент" и "Сервер". Он должен возвращать объект типа СписокЗначений, содержащий ссылки на разрешенные элементы справочника.

---

Способ 2. Программное управление доступностью полей в окне отбора

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

Каждое табличное поле списка (например, список документов в журнале) обладает свойством НастройкаОтбора. Через это свойство мы имеем доступ к управлению видимостью и доступностью колонок в платформенном окне «Отбор и сортировка».

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


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

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

---

Способ 3. Разработка собственного (кастомного) окна отборов

Если стандартный платформенный диалог категорически не удовлетворяет бизнес-требованиям (например, требуется сложная зависимая фильтрация, динамическое изменение заголовков или специфический дизайн), лучшим решением будет создание собственной формы отборов.

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

Разберем по шагам алгоритм создания кастомного окна отборов:

  1. В свойствах командной панели табличного поля списка снимите флаг «Автозаполнение».
  2. Создайте вручную кнопку «Отбор и сортировка» на командной панели.
  3. В обработчике нажатия этой кнопки пропишите открытие вашей собственной (вспомогательной) формы.
  4. На вспомогательной форме разместите табличное поле, связанное с отборами построителя отчетов.

Посмотрим, как инициализировать отборы во вспомогательной форме с помощью ПостроительОтчета:


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

Использование ПостроительОтчета позволяет обойти любые ограничения платформенного окна, предоставляя разработчику 100% контроля над поведением элементов интерфейса, составом доступных сравнений и логикой выбора значений.

---

Способ 4. Использование механизмов типовых конфигураций (УПП, КА, УТ 10.3)

Если ваша разработка ведется в рамках одной из классических типовых конфигураций на обычных формах (таких как Управление производственным предприятием, ред. 1.3, Комплексная автоматизация, ред. 1.1 или Управление торговлей, ред. 10.3), обратите внимание на встроенные механизмы этих систем.

В этих конфигурациях разработчики фирмы «1С» уже предусмотрели штатные механизмы ограничения прав без обязательного включения RLS на уровне базы данных:

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

← На главную