Часто перед разработчиком встает задача: предоставить пользователю доступ исключительно к одному или двум отчетам. На первый взгляд заказчику кажется, что это «дело пяти минут», но на практике мы сталкиваемся с тем, что для формирования отчета системе требуется доступ на чтение к огромному количеству таблиц, метаданных и объектов интерфейса. Без этих прав система либо выдает ошибку доступа, либо отчет просто не выводит данные из-за ограничений RLS (Row Level Security).
В этой статье мы подробно разберем, как технически реализовать такой узкий доступ, какие инструменты использовать для отладки прав и как аргументированно объяснить сложность этой задачи заказчику. Мы проанализируем несколько стратегий: от простых организационных решений до сложных архитектурных изменений.
Прежде чем приступать к программированию, рассмотрим самый простой вариант, который часто игнорируется. Если пользователю не требуется интерактивная работа с отборами в режиме реального времени, лучшим решением будет настройка рассылки отчетов.
В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) существует встроенный механизм «Рассылки отчетов». Мы можем настроить регламентное задание, которое будет формировать нужные отчеты по расписанию и отправлять их пользователю на электронную почту в формате PDF или Excel. Это полностью снимает проблему прав доступа, так как отчет формируется под учетной записью с широкими правами, а пользователь получает только готовый результат.
Если пользователю все же необходимо заходить в 1С, мы можем пойти по пути создания специализированного АРМ (Автоматизированного рабочего места). Разберем этот процесс по шагам:
ТолькоОтчетПродажи.Проанализируем ситуацию: чтобы предотвратить попытки пользователя «уйти» в другие разделы системы, нам придется использовать подписки на события в расширении, которые будут блокировать открытие стандартных форм или командного интерфейса. Это надежный, но трудоемкий метод.
Одна из главных проблем при ограничении прав — это RLS. Даже если мы дадим право на чтение справочника Номенклатура, настройки прав доступа могут скрывать часть данных. Чтобы отчет гарантированно показывал нужные цифры без предоставления пользователю прав на все первичные документы, мы можем использовать привилегированный режим.
Рассмотрим пример кода, который позволяет программно сформировать отчет, игнорируя проверку прав доступа текущего пользователя:
// В модуле объекта отчета или внешней обработки
Процедура СформироватьОтчетНаСервере()
УстановитьПривилегированныйРежим(Истина);
// Здесь располагается логика формирования отчета
// Например, вызов компоновщика макета и вывод в табличный документ
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Использование УстановитьПривилегированныйРежим(Истина) позволяет системе обращаться к данным напрямую в обход механизма прав. Однако будьте осторожны: это накладывает на разработчика ответственность за то, чтобы пользователь случайно не увидел данные, которые ему действительно запрещены по политике безопасности компании.
Выясним причину, почему отчеты работают медленно при жестких ограничениях прав. Это происходит из-за того, что СУБД приходится на лету проверять права для каждой строки в десятках таблиц. Чтобы избежать этого и упростить настройку прав, мы можем создать «Витрину данных».
Создадим отдельный Регистр сведений, который будет иметь плоскую структуру (все необходимые колонки отчета). Настроим регламентное задание, которое раз в час (или в день) в привилегированном режиме собирает данные из сложных документов и регистров и записывает их в наш новый регистр. Теперь нам достаточно дать пользователю права только на чтение этого одного регистра. Отчет будет строиться мгновенно, а безопасность будет на высшем уровне.
Современный подход подразумевает, что пользователю вообще не обязательно заходить в интерфейс 1С для просмотра отчетов. Мы можем опубликовать базу 1С на веб-сервере и включить интерфейс OData.
Это позволит подключить к 1С внешние инструменты, такие как Excel, Power BI или Grafana. В этом случае мы настраиваем доступ только к конкретным сущностям через стандартный механизм 1С, и пользователь видит актуальные данные в привычном ему интерфейсе таблиц или графиков, не нагружая саму информационную базу сеансами работы.
Часто разработчики тратят часы, анализируя Журнал регистрации, чтобы понять, какого именно права не хватает. Разберем более эффективный метод — использование Технологического журнала (ТЖ).
Настройте лог ТЖ на событие EXCP. Это позволит вам моментально увидеть в логах ошибку вида «Нарушение прав доступа» с указанием конкретной таблицы и даже поля, к которому пыталась обратиться система. Также рекомендуется использовать консоль анализа прав (из состава «Инструментов разработчика»), которая позволяет имитировать права пользователя без перезахода в систему.
Чтобы диалог с заказчиком был конструктивным, используйте метафору «Айсберга» или «Безопасного коридора». Объясните, что отчет — это лишь вершина. Чтобы он корректно отобразил одну итоговую цифру, системе нужно «пробежать» по сотням внутренних связей.
Аргументация может звучать так: «Дать доступ к отчету — это не просто нажать кнопку. Это как построить в охраняемом банке изолированный коридор, который ведет только в одну комнату, при этом сделать так, чтобы по пути посетитель не смог заглянуть ни в одну другую дверь. Нам нужно проверить и настроить права доступа к 50-70 типам различных объектов, из которых этот отчет собирает информацию».
Подводя итог, отметим, что выбор метода зависит от конкретной ситуации. Для простых задач идеально подойдет рассылка, для интерактивной работы — АРМ в расширении с привилегированным режимом, а для высоконагруженных систем — витрины данных или внешние BI-системы.