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