Как дать права на чтение всем видам субконто и исправить ошибки доступа в отчетах СКД

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет
← На главную

При разработке внешних отчетов в конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0) программисты часто сталкиваются с проблемой: отчет прекрасно работает под полными правами, но у пользователя с ограниченными правами (например, только на чтение отчетов) возникает ошибка доступа или колонки просто не выводятся. Особенно остро эта проблема проявляется при работе с регистром бухгалтерии Хозрасчетный и его виртуальными таблицами остатков и оборотов.

Причина кроется в механизме работы составных типов данных (которыми являются субконто) и системе компоновки данных (СКД). Разберем пошагово, почему это происходит и как правильно настроить запрос, чтобы отчет работал у любого пользователя без необходимости изменять роли в конфигурации.

Почему возникают ошибки доступа к субконто?

Поля Субконто1, Субконто2 и Субконто3 в регистре бухгалтерии имеют составной тип, который может включать сотни справочников и документов. Когда в запросе мы обращаемся к реквизиту субконто через точку (например, Субконто1.Код или Субконто3.Дата), платформа 1С на уровне SQL-запроса пытается выполнить соединение со всеми возможными таблицами, входящими в этот тип.

Если у пользователя нет прав хотя бы на один из этих объектов (даже если он физически не используется на выбранном счете), система может:</1>

  1. Выдать ошибку "Нарушение прав доступа".
  2. Тихо исключить поле из выборки СКД (колонка просто исчезнет).
  3. Вернуть NULL в значении поля.

Рассмотрим способы решения этой задачи, начиная от простых исправлений в запросе и заканчивая архитектурными подходами.

Способ 1. Использование функции ВЫРАЗИТЬ (CAST)

Проанализируем ситуацию: если мы точно знаем, что на определенном счете в качестве субконто выступает конкретный справочник (например, Номенклатура), нам не нужно, чтобы система проверяла права на все остальные типы. Для этого используется оператор ВЫРАЗИТЬ.

Вместо прямого обращения ХозрасчетныйОстатки.Субконто1.Код, мы должны явно указать тип объекта:


ВЫБРАТЬ
    ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.Номенклатура) КАК Номенклатура,
    ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.Номенклатура).Код КАК КодНоменклатуры
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки

Важный момент: если в поле Субконто1 окажется объект другого типа (не Номенклатура), функция ВЫРАЗИТЬ вернет NULL. Поэтому данный способ идеально подходит для отчетов с жестко заданными фильтрами по счетам.

Способ 2. Левое соединение с конкретными таблицами

Если поле субконто может содержать несколько разных типов документов (например, "Документ-основание" в партиях), использование ВЫРАЗИТЬ может стать громоздким. В этом случае эффективнее использовать ЛЕВОЕ СОЕДИНЕНИЕ с нужными таблицами документов. Это позволяет получить данные (например, Дату или Номер) только из тех объектов, к которым у пользователя есть доступ.

Посмотрим на пример реализации такого запроса:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ХозрасчетныйОстатки.Счет КАК Счет,
    ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.Номенклатура) КАК Номенклатура,
    ВЫБОР
        КОГДА НЕ ПоступлениеТоваровУслуг.Ссылка ЕСТЬ NULL
            ТОГДА ПоступлениеТоваровУслуг.Дата
        КОГДА НЕ АвансовыйОтчет.Ссылка ЕСТЬ NULL
            ТОГДА АвансовыйОтчет.Дата
        ИНАЧЕ NULL
    КОНЕЦ КАК ДатаДокумента
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, , &ВидыСубконто, Организация = &Организация) КАК ХозрасчетныйОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
        ПО ХозрасчетныйОстатки.Субконто2 = ПоступлениеТоваровУслуг.Ссылка
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет КАК АвансовыйОтчет
        ПО ХозрасчетныйОстатки.Субконто2 = АвансовыйОтчет.Ссылка

Обратите внимание на использование слова РАЗРЕШЕННЫЕ. Оно критически важно: если у пользователя нет прав на чтение одного из видов документов, указанных в ЛЕВОЕ СОЕДИНЕНИЕ, запрос не упадет с ошибкой, а просто проигнорирует эти записи.

Способ 3. Ограничение типов через ТИПЗНАЧЕНИЯ

Для оптимизации работы запроса и исключения лишних проверок прав, мы можем добавить условие на типы данных прямо в секцию ГДЕ. Это подскажет платформе, какие именно таблицы нужно анализировать.


ГДЕ
    ТИПЗНАЧЕНИЯ(ХозрасчетныйОстатки.Субконто2) В (
        ТИП(Документ.ПоступлениеТоваровУслуг), 
        ТИП(Документ.Партия), 
        ТИП(Документ.ОприходованиеТоваров)
    )

Это ограничение не только решает проблему с правами, но и ускоряет выполнение запроса, так как СУБД будет просматривать меньше таблиц.

Способ 4. Передача параметров в виртуальную таблицу

Выясним еще одну важную деталь: параметры виртуальной таблицы. В запросах к регистру бухгалтерии важно передавать параметр ВидыСубконто. Если оставить этот параметр пустым, платформа будет пытаться подготовить универсальный план запроса для всех возможных субконто системы.

Рассмотрим правильное заполнение параметров в СКД:

  1. В схеме компоновки данных создайте параметр с типом ПланВидовХарактеристикСсылка.ВидыСубконтоХозрасчетные (доступен список значений).
  2. В настройках виртуальной таблицы укажите этот параметр во втором поле.
  3. Это сузит область метаданных, к которым обращается отчет, и решит многие проблемы с правами доступа "на взлете".

Способ 5. Привилегированный режим (для внешних отчетов)

Если отчет должен показывать данные документов, к которым у пользователя категорически не может быть прямого доступа по правилам безопасности компании, единственным выходом будет использование привилегированного режима.

В БП 3.0 внешние отчеты подключаются через механизм "Дополнительные отчеты и обработки". Чтобы отчет работал в привилегированном режиме, необходимо:

  1. Вынести логику получения данных в модуль объекта отчета.
  2. В процедуре формирования использовать УстановитьПривилегированныйРежим(Истина).
  3. Сформировать таблицу значений и передать её в СКД как "Внешний набор данных".

В этом случае платформа проигнорирует ограничения RLS (Record Level Security) и покажет пользователю результат запроса, при этом сам пользователь по-прежнему не сможет открыть формы этих документов из отчета, если у него нет на них прав.

Резюме и рекомендации

Проанализировав все способы, можно составить оптимальный алгоритм действий для программиста:

Использование этих техник позволит вам создавать стабильные отчеты, которые не потребуют от системного администратора ручного добавления сотен прав в роли пользователей при каждом обновлении конфигурации.

← На главную