Как отлаживать RLS в 1С: инструменты, методики и практические приемы

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Ограничение доступа на уровне записей (Record Level Security, или RLS) — один из самых мощных, но в то же время сложных для освоения механизмов платформы «1С:Предприятие». Из-за того, что ограничения накладываются неявно на уровне СУБД, разработчики часто сталкиваются с трудностями при поиске логических ошибок доступа и узких мест, влияющих на производительность. В этой статье мы подробно разберем, как укротить технологию RLS, какие инструменты использовать для ее отладки и как локализовать даже самые неочевидные проблемы доступа.

Метод 1. Отладка и оптимизация производительного RLS в БСП 3.x

В современных конфигурациях на базе Библиотеки стандартных подсистем (БСП) версии 3.0 и выше используется новый, так называемый производительный (или универсальный) режим RLS. В отличие от старого режима, где ограничения рассчитывались динамически «на лету» для каждого запроса с помощью сложных шаблонов, новый режим работает по принципу кэширования прав.

Разберем по шагам, как устроена эта архитектура и как ее отлаживать:

  1. Суть механизма: Права рассчитываются предварительно и сохраняются в специальных служебных регистрах сведений. К ним относятся такие регистры, как КлючиДоступаКОбъектам, КлючиДоступаПользователей, ТаблицыГруппДоступа и другие. Шаблон RLS в ролях конфигурации при этом становится максимально простым и статичным — он сводится к конструкции вида #ДляОбъекта.
  2. Где искать ошибку, если пользователь не видит объект: Если конкретный пользователь не видит нужный документ или, наоборот, имеет доступ к лишним данным, отлаживать текст запроса RLS бессмысленно. Проблема кроется в актуальности кэша прав. Нам необходимо проверить, правильно ли рассчитаны ключи доступа для конкретного объекта.
  3. Использование регламентных заданий: За расчет и обновление ключей отвечают регламентные задания БСП. Проверим, выполняются ли они в базе данных без ошибок.
  4. Применение программного интерфейса для точечной отладки: Для того чтобы локализовать проблему, мы можем запустить пошаговый отладчик платформы 1С и принудительно обновить ключи доступа для конкретного проблемного объекта. Для этого выполним в отладочной консоли или внешней обработке следующий код:

// Принудительное обновление ключей доступа для конкретного объекта
СсылкаНаОбъект = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7701020304");
УправлениеДоступомСлужебный.ОбновитьКлючиДоступа(СсылкаНаОбъект);

Поставив точку останова внутри процедуры ОбновитьКлючиДоступа модуля УправлениеДоступомСлужебный, мы сможем по шагам проследить, какие группы доступа и пользователи сопоставляются данному объекту и на каком этапе логика расчета дает сбой. Для точечной актуализации прав конкретного пользователя или группы пригодится инструмент для пересчета прав доступа.

Метод 2. Использование штатной обработки БСП «Управление доступом»

В составе БСП поставляется специализированная обработка УправлениеДоступом.epf (ее также можно найти в составе дистрибутива БСП или на ИТС). Этот инструмент является незаменимым помощником для любого разработчика, работающего с правами доступа.

Рассмотрим возможности этой обработки подробнее:

Метод 3. «Инструменты разработчика» Ивана Синельникова

Когда стандартных средств БСП недостаточно, на помощь приходит мощнейший сторонний комплекс — «Инструменты разработчика» (широко известный в сообществе 1С). В его составе есть специализированный Редактор ограничения доступа.

Этот инструмент позволяет:

Метод 4. Анализ запросов через Технологический журнал платформы

Часто при записи или чтении объекта пользователь получает лаконичное сообщение: «Недостаточно прав для исполнения операции над базой данных». Журнал регистрации при этом фиксирует только факт нарушения прав, но не дает понимания, какая именно таблица или условие вызвали ошибку. Для решения этой задачи настроим сбор Технологического журнала (ТЖ).

Создадим или отредактируем файл конфигурации ТЖ logcfg.xml, добавив в него отслеживание событий выполнения запросов к СУБД и исключительных ситуаций:


<?xml version="1.0" encoding="UTF-8"?>
<logconfig xmlns="http://v8.1c.ru/v8/tech-log">
    <log location="C:\v8\logs\rls_debug" keep="24">
        <event>
            <eq property="Name" value="DBMSSQL"/>
            <like property="Sql" value="%SDBL_DUMMY%"/>
        </event>
        <event>
            <eq property="Name" value="DBPOSTGRS"/>
            <like property="Sql" value="%SDBL_DUMMY%"/>
        </event>
        <event>
            <eq property="Name" value="EXCP"/>
        </event>
        <property name="all"/>
    </log>
</logconfig>

Проанализируем структуру этого файла конфигурации. Мы фильтруем события выполнения SQL-запросов (DBMSSQL для MS SQL Server или DBPOSTGRS для PostgreSQL) по наличию ключевого маркера SDBL_DUMMY (или SDBL_DUAL). Платформа «1С:Предприятие» при трансляции запросов с ограничениями RLS на уровень СУБД всегда внедряет эти специфические конструкции. Это позволяет нам выделить «чистый» RLS-запрос из огромного потока других СУБД-событий.

При анализе логов ТЖ обратим внимание на цепочку событий перед отменой транзакции (ROLLBACK). Непосредственно перед событием отката будет идти тяжелый SQL-запрос, содержащий проверку прав, а следом за ним — событие EXCP (исключение), указывающее на конкретную таблицу метаданных, к которой у пользователя не хватило прав доступа.

Метод 5. Ручная отладка методом секционирования (деления) запроса

Если ошибка синтаксическая или логическая, а специализированных инструментов под рукой нет, применим классический метод ручной отладки. Разработчики называют его «методом деления до размеров ума».

Выясним причину ошибки по шагам:

  1. Откроем шаблон RLS в конфигураторе. Зачастую шаблоны БСП содержат ветвления по условиям препроцессора (например, #Если &ДоступноОграничениеПоОрганизациям #Тогда).
  2. Скопируем текст запроса из шаблона ограничения роли в обычную Консоль запросов.
  3. Поскольку в консоли под полными правами RLS игнорируется, нам нужно вручную заменить параметры сеанса (такие как параметры групп доступа) на конкретные литералы или массивы значений.
  4. Начнем комментировать (последовательно отключать с помощью символов комментирования СУБД --) отдельные блоки условий ГДЕ или соединения (JOIN) с таблицами прав.
  5. Как только запрос в консоли начинает выполняться без ошибок или возвращает ожидаемый результат, мы локализуем конкретную ветку условий, которая вызывала отказ в доступе или неверную выборку данных.

Рассмотрим простейший пример секционирования шаблона:


// Исходный шаблон RLS:
ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица
ГДЕ ТекущаяТаблица.Организация В (&РазрешенныеОрганизации)
  И ТекущаяТаблица.Подразделение В (&РазрешенныеПодразделения)

// Для отладки в консоли проверяем части по отдельности:
// Шаг 1: Проверяем только организации
ВЫБРАТЬ * ИЗ Справочник.Организации КАК ТекущаяТаблица 
ГДЕ ТекущаяТаблица.Ссылка В (&МассивТестовыхОрганизаций)

// Шаг 2: Проверяем только подразделения
ВЫБРАТЬ * ИЗ Справочник.ПодразделенияОрганизаций КАК ТекущаяТаблица 
ГДЕ ТекущаяТаблица.Ссылка В (&МассивТестовыхПодразделений)

Метод 6. Использование консолей запросов с функцией «Выполнить от имени»

Проверить работу запроса с ключевым словом РАЗРЕШЕННЫЕ под административными правами невозможно, так как платформа игнорирует ограничения RLS для пользователей с полными правами. Чтобы не тратить время на постоянный перезапуск сеансов под разными пользователями, используем продвинутые консоли запросов.

Такие консоли инициализируют выполнение запроса через COM-соединение или фоновое задание от имени выбранного пользователя с ограниченными правами. Это позволяет оперативно вносить изменения в RLS-шаблоны в конфигураторе, обновлять конфигурацию базы данных и сразу же в один клик перевыполнять запрос в консоли, наблюдая за изменением состава результирующей выборки. Для проверки работы запросов под учетной записью с ограниченными правами можно использовать расширение для отладки запросов под пользователем.

← На главную