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