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