В дополнение к статической системе разделения прав доступа (на основании ролей) в системе 1С действует вторая система прав доступа — динамическая (RLS). В этой системе права доступа высчитываются динамических способом, в зависимости от заданных параметров, в процессе работы.
Правила распределения прав доступа в системе RLS описываются в шаблонах, которые описываются на языке запросов 1С с использованием специального расширенного синтаксиса. При этом текст шаблона может быть весьма сложным для понимания и отладки.
Мы столкнулись с необходимостью добиться правильной работы шаблона ограничений прав в конфигурации "Бухгалтерия предприятия, редакция 3.0". Проблема заключалась в том, что разделение прав по организациям для штатных ролей конфигурации работало правильно, а для тех ролей, которые добавили мы - не работало вовсе.
Мы попробовали воспользоваться обработкой //infostart.ru/public/264989/ , однако с нашим шаблоном она не справилась - некоторые синтаксические конструкции не поддерживались. В исследуемом шаблоне было:
- 52 параметра;
- встроенные предопределённые шаблоны;
- параметры сеанса;
- функциональные опции;
- многочисленные инструкции препроцессора, в том числе вложенные;
- просто около 3000 строк.
В результате ограничение прав доступа было абсолютно нечитабельно, понять, что именно на рабочей базе было настроено не так, как настроено на тестовой, где всё работало, не удавалось.
Возникла идея написать обработку, которая организует препроцессинг ограничения прав доступа, показывая запрос, который в конце концов применяет 1С. В ограничениях прав доступа могут быть:
- подстрока ## - для вставки в текст одного символа #;
- подстрока #ТекущаяТаблица - для вставки в текст псевдонима текущей таблицы;
- подстрока #ИмяТекущейТаблицы, #CurrentTableName - для вставки в текст полного имени таблицы;
- подстрока #ИмяТекущегоПраваДоступа, #CurrentAccessRightName - для вставки в текст имени права доступа;
- подстроки #ЕСЛИ #ИНАЧЕЕСЛИ #ИНАЧЕ #ТОГДА #КОНЕЦЕСЛИ #IF #ELSIF #ELSE #ENDIF - для использования препроцессора;
- использование сложных условных выражений с операциями И, ИЛИ, НЕ, <, >, <=, >=, =, <> и функции СтрСодержит для использования препроцессора;
- использование значений параметров сеанса и функциональных опций через синтаксис &Параметр;
- вызов шаблонов ограничений с передачей неограниченного числа параметров. При этом тексты шаблонов ограничений могут содержать всё от пункта 1) до 7), плюс вызов вложенных шаблонов ограничений и подстрок #Параметр(номер параметра).
Для использования реализованной обработки необходимо:
- Выгрузить файлы конфигурации. (Конфигуратор -> Главное меню -> Конфигурация -> Выгрузить файлы конфигурации...)
- Запустить обработку в режиме предприятия.
- Последовательно указать: Файл прав (Файл сохранённой роли), Объект прав (Полное имя таблицы или реквизита), Имя права (Обычно чтение).
- Проверить настройки: Имя текущей таблицы, имя текущего права доступа, текущая таблицы. Они должны заполниться автоматически.
- Нажать кнопку "Выполнить".
- После выполнения пункта 5) должна заполниться таблица параметров. Если в ограничении прав доступа использовались подстроки &Параметр, то они должны появиться в таблице Параметры.
- В теории 1С допускает наличие отдельного ограничения доступа для каждого реквизита (поля). Поэтому результат будет показан в виде списка полей. При активации элемента списка автоматически заполняется текстовый документ - результатируещей строкой запроса.
- Обработка позволяет менять значения параметров и настроек. После этого можно снова нажимать кнопку "Выполнить".
В результате получаем гораздо более читабельный текст, который можно использовать в конструкторе запросов ограничения доступа или, с минимальными довольно очевидными изменениями, его можно выполнить в консоли запросов.