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