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