Настройка прав доступа в крупных конфигурациях, таких как 1С:Управление торговлей 11.5, — это сложный процесс, требующий внимательности. Часто возникает ситуация, когда при выполнении какого-либо действия (например, когда требуется замена прав в РМК УТ 11.5) пользователь получает лаконичное сообщение: «Нарушение прав доступа». При этом система не всегда прямо указывает, на какой именно объект метаданных не хватает разрешений. В этой статье мы разберем пошагово, как локализовать проблему и определить конкретную роль или объект, вызывающий ошибку.
Это самый быстрый и доступный способ диагностики. Журнал регистрации фиксирует большинство событий отказа в доступе на уровне сервера и клиента (существуют решения для автоматического создания профилей доступа на основе журнала регистрации). Разберем алгоритм действий:
В большинстве случаев в колонке «Данные» или «Комментарий» будет указан конкретный объект метаданных. Например, вы можете увидеть запись вида: РегистрСведений.ПлановыеНачисления.Чтение или Документ.ЗаказКлиента.Изменение. Это прямое указание на то, какого именно права не хватает в профиле пользователя.
Если Журнал регистрации не внес ясности (что бывает при возникновении ошибки внутри программного кода), нам необходимо прибегнуть к помощи Конфигуратора. Проанализируем ситуацию в режиме отладки:
В момент возникновения окна о нарушении прав конфигуратор «замрет» на той строке кода, где происходит обращение к запрещенному объекту. Здесь мы можем увидеть выполнение запроса или обращение к менеджеру объекта. Выясним причину, проверив стек вызовов. Если ошибка происходит в запросе, обратите внимание на текст запроса — в нем будет фигурировать таблица, к которой нет доступа.
В современных версиях БСП, на которых построена УТ 11.5, существует мощный встроенный инструмент — отчет «Анализ прав доступа» (также может быть полезна внешняя обработка для анализа прав доступа к объекту). Он позволяет взглянуть на проблему «от обратного».
Рассмотрим, как им пользоваться:
Также существует внешняя обработка АнализРолей, которая часто встречается в инструментах разработчика. Она позволяет быстро найти, в какие типовые роли включен конкретный объект. Это полезно, если вы определили недостающий объект (например, РегистрСведений.ЦеныНоменклатуры) и хотите понять, какую стандартную роль нужно добавить в профиль, чтобы не создавать новую.
Иногда ситуация выглядит иначе: у пользователя есть права на документ, он его видит, но при попытке проведения или открытия определенных записей получает ошибку. Это работа механизма RLS (Record Level Security). В УТ 11.5 используется производительный режим RLS, который накладывает дополнительные условия ГДЕ на каждый SQL-запрос.
Для диагностики RLS проанализируем следующие моменты:
Обновление прав доступа зависло, изменения в профилях не вступят в силу.Если проблема носит массовый характер или возникает в фоновом задании, где обычная отладка затруднена, мы можем настроить сбор Технологического журнала. Нам потребуется событие EXCP (Exception). В файле logcfg.xml это будет выглядеть примерно так:
<event property="Name" target="EXCP">
<eq property="Name" value="EXCP" />
</event>
В логах ТЖ при возникновении ошибки будет зафиксирован текст «Нарушение прав доступа» и полный стек вызова на языке 1С. Это позволяет увидеть даже те ошибки, которые «проглатываются» конструкцией Попытка...Исключение в коде, но все равно мешают работе пользователя.
Если вы являетесь разработчиком и хотите проверить права программно в конкретном месте кода, используйте функцию ПравоДоступа(). Рассмотрим пример проверки права на чтение справочника:
Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.Номенклатура, ПользовательСсылка) Тогда
Сообщить("У пользователя недостаточно прав на справочник Номенклатура");
КонецЕсли;
Также полезно использовать метод ПараметрыДоступа(), который возвращает структуру доступных полей и условий для текущего сеанса. Это поможет выяснить, не ограничено ли право на уровне отдельных реквизитов объекта.
Важное замечание: При работе с расширениями помните, что роли в расширениях суммируются с ролями основной конфигурации. Если объект добавлен в расширение, права на него должны быть явно прописаны в роли именно этого расширения, иначе основная конфигурация о них «не узнает».