Ошибка «Нарушение прав доступа» при формировании отчета в 1С — одна из самых коварных. Часто она не оставляет информативных следов в обычном журнале регистрации, особенно если ограничение срабатывает на уровне системы компоновки данных (СКД) или механизма RLS (Record Level Security). Ситуация осложняется в комплексных конфигурациях, таких как БИТ.ФИНАНС, или при использовании расширений. Рассмотрим подробно, как «вычислить» объект-нарушитель и исправить проблему.
Первым делом проанализируем разницу между правами доступа. В системе компоновки данных недостаточно иметь право Чтение на объект. Для того чтобы поле отобразилось в отчете или было доступно для выбора в настройках, пользователю обязательно требуется право Просмотр.
Разберем, почему это важно:
Чтение, но нет права Просмотр, запрос к базе данных может выполниться успешно, но при попытке СКД вывести данные в макет возникнет исключение.Контрагент.ОсновнойМенеджер.Подразделение). Проверьте, есть ли у пользователя права на просмотр всех промежуточных объектов в этой цепочке.Проанализируем текст запроса отчета. По умолчанию запрос может пытаться выбрать все записи. Если в конфигурации включен RLS, запрос без указания ограничений может завершиться ошибкой, если он обращается к записям, которые пользователю запрещены. Чтобы система автоматически отсекала недоступные данные, необходимо использовать ключевое слово РАЗРЕШЕННЫЕ.
Пример корректного начала запроса:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.СуммаОборот КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК ПродажиОбороты
Важное замечание: даже с этим словом СКД может выдать ошибку прав, если в настройках (компоновщике настроек) жестко выбрано поле, на которое нет права Просмотр. Система воспримет это как попытку прямого обращения к запрещенному ресурсу.
Если визуальный анализ запроса не помогает, применим «высокотехнологичный» метод ручного перебора, который опытные разработчики называют методом змейки. Суть заключается в последовательном выполнении частей запроса от лица проблемного пользователя.
Выполним следующие шаги:
Открытие внешних обработок.Рассмотрим пример. Если запрос состоит из трех временных таблиц и одного итогового выбора, мы сначала выполняем только первый пакет:
// Пакет №1
ВЫБРАТЬ РАЗРЕШЕННЫЕ ... ИЗ Справочник.Контрагенты
Если первый пакет выполнился без ошибок, добавляем второй. На том этапе, где консоль выдаст «Нарушение прав доступа», и находится проблемный объект (регистр, справочник или таблица части запроса).
Когда «глаза и мозги» не справляются, на помощь приходит самый мощный инструмент платформы — Технологический журнал. Он позволяет увидеть ошибку в момент ее возникновения в недрах сервера 1С.
Для настройки создадим файл logcfg.xml в каталоге conf на сервере 1С и пропишем в нем сбор событий исключений EXCP. Это позволит нам зафиксировать точное имя метаданных, к которым идет обращение.
Пример настройки logcfg.xml:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\LOGS\ACCESS_ERRORS" history="24">
<event>
<eq property="Name" value="EXCP"/>
<like property="Descr" value="*Нарушение прав доступа*"/>
</event>
<property name="all"/>
</log>
</config>
После возникновения ошибки в логах появится запись, где в поле Descr будет указан текст ошибки, а часто и контекст исполнения, включая имя таблицы или объекта метаданных.
Поскольку отчет добавлен через расширение в связке с БИТ.ФИНАНС, выясним специфические причины сбоя:
би_ПраваДоступаНаОбъекты), а у пользователя нет на них прав Чтение, отчет упадет с ошибкой.Обычная консоль запросов не учитывает специфику СКД. Рекомендуем использовать Консоль СКД. Она позволяет выгрузить «Исполняемый запрос». Это тот самый запрос, который платформа формирует после наложения всех RLS-фильтров и пользовательских настроек. Зачастую именно в этом трансформированном запросе видно обращение к таблицам, на которые у пользователя нет прав, хотя в исходном тексте запроса всё выглядело чисто.
Подведем итог: для решения проблемы мы должны последовательно проверить права Просмотр, применить РАЗРЕШЕННЫЕ, выполнить запрос по частям через консоль (метод змейки) и, в крайнем случае, проанализировать технологический журнал сервера. Такой комплексный подход гарантирует нахождение «объекта-преткновения» даже в самых сложных иерархических отчетах.