В процессе разработки или кастомизации конфигурации «1С:Управление торговлей 11» программисты часто сталкиваются с ситуацией, когда стандартный метод БСП ОбщегоНазначения.ЗначениеРеквизитаОбъекта выбрасывает исключение «Нарушение прав доступа». При этом визуальный анализ прав в конфигураторе показывает, что у пользователя есть все необходимые роли на чтение справочника и его реквизитов. Рассмотрим подробнее, почему так происходит и как найти «скрытую» причину отказа в доступе.
Первым делом проанализируем ситуацию на примере вызова из модуля СПАРКРиски. Ошибка часто возникает при открытии формы документа (например, Заказа клиента), когда система пытается получить значение реквизита ЮрФизЛицо справочника Контрагенты. Стек ошибки указывает на то, что сбой происходит в момент выполнения запроса внутри функции БСП:
Ошибка при вызове метода контекста (Выполнить)
{ОбщийМодуль.ОбщегоНазначения.Модуль(617)}: Выборка = Запрос.Выполнить.Выбрать;
{ОбщийМодуль.ОбщегоНазначения.Модуль(306)}: ЗначенияРеквизитовОбъекта = ЗначенияРеквизитовОбъектов(...);
Разберем, почему это происходит. Метод ЗначениеРеквизитаОбъекта по умолчанию выполняет запрос к базе данных без использования конструкции РАЗРЕШЕННЫЕ. Если на справочник наложены ограничения RLS (Record Level Security), и конкретная запись, на которую ссылается переменная, не проходит по условиям ограничения, платформа 1С выдает критическую ошибку доступа вместо возврата пустого значения.
Выясним причину, по которой RLS может блокировать доступ, даже если в конфигураторе на справочнике Контрагенты не задано явных ограничений. В УТ 11 реализована тесная интеграция между партнерами и контрагентами. Посмотрим на логику работы прав доступа в этой системе:
Партнер).ЮрФизЛицо имеет значение ФизЛицо, система может дополнительно проверять права на чтение справочника ФизическиеЛица. Проанализируем, есть ли у пользователя права на этот справочник, так как отсутствие прав на связанный объект часто приводит к «падению» запроса при чтении реквизитов.Одним из быстрых способов избежать аварийного завершения работы является использование расширенного набора параметров метода ЗначениеРеквизитаОбъекта. Рассмотрим пример кода:
// Вместо стандартного вызова:
// Результат = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ЮрФизЛицо");
// Используем вызов с флагом ВыбратьРазрешенные:
Результат = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ЮрФизЛицо", Истина);
При передаче параметра ВыбратьРазрешенные = Истина, запрос внутри общего модуля будет выполнен с ключевым словом РАЗРЕШЕННЫЕ. В этом случае, если RLS запрещает доступ к объекту, система не выдаст ошибку, а просто вернет Неопределено. Это позволит коду продолжить работу, хотя проблему с отсутствием доступа к данным это не решит.
В современных версиях платформы 8.3 и конфигурации УТ 11.5 используется механизм производительного ограничения доступа. В этом режиме условия RLS не вычисляются «на лету» при каждом запросе, а хранятся в виде готовых ключей в специальных регистрах сведений (например, КлючиДоступаКОбъектам).
Проанализируем ситуацию: если права пользователя были изменены недавно, или контрагент был создан программно в обход стандартных процедур, ключи доступа могли не успеть обновиться. В итоге:
Решение: необходимо запустить регламентное задание «Обновление ключей доступа» или воспользоваться обработкой «Управление доступом» в разделе Администрирование, чтобы принудительно обновить данные в регистрах доступа.
Если вышеперечисленные методы не помогают, перейдем к глубокой диагностике. Посмотрим на инструменты, которые помогут локализовать «виновника» ограничения:
Контрагенты. Он покажет не только роли, но и действующие ограничения RLS.DBMSSQL (или DBORACLE/DBPOSTGRS) с фильтром по тексту Нарушение прав доступа. В логах ТЖ вы увидите реальный SQL-запрос, который отправляет платформа. Проанализируйте секцию WHERE — там будет четко видно, к какой именно таблице (партнеры, группы доступа, физические лица) добавляется ограничение, вызывающее отказ.Поскольку в сообщении ошибка возникает в контексте СПАРКРиски.ПриСозданииНаСервере, важно учитывать особенности этого модуля. Данный механизм обращается к собственным регистрам. Если у пользователя есть права на справочник Контрагенты, но отсутствуют права на чтение регистров сведений ИндексыСПАРКРиски или СобытияМониторингаСПАРКРиски, запрос может завершиться ошибкой доступа, если эти данные соединяются в одном запросе с основными реквизитами контрагента.
Проверьте наличие ролей, связанных с использованием сервиса 1С:СПАРК Риски, и добавьте их пользователю для тестирования.
Для исправления ошибки доступа при чтении реквизитов в УТ 11 выполните следующие шаги:
Партнеры и Физические лица.ОбщегоНазначения.ЗначениеРеквизитаОбъекта(..., ..., Истина) для безопасного получения данных.