Почему в отчете СКД для одной роли не видна группировка и как это исправить?

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

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

1. Анализ ситуации и выявление скрытой причины

Рассмотрим структуру исходного запроса, представленного в теме. Проблема возникает в поле Продавец, которое формируется следующим образом:

ЕСТЬNULL(нал.Автор, БН.Автор) КАК Продавец

В свою очередь, поля нал.Автор и БН.Автор получаются из временных таблиц, где они выбираются "через точку" от регистратора:


БезналОплатыОбороты.Регистратор.Автор КАК Автор
КассаОбороты.Регистратор.Автор КАК Автор

Поле Регистратор в регистрах накопления всегда имеет составной тип данных. В него входят все документы, которые могут делать движения по данному регистру. Когда мы обращаемся к реквизиту составного поля "через точку" (в нашем случае — Регистратор.Автор), платформа 1С на уровне СУБД генерирует неявные левые соединения (LEFT JOIN) со всеми таблицами документов, входящих в этот составной тип.

Связь с правами доступа: Если у роли пользователя (например, "Продавец") отсутствует право "Просмотр" или "Чтение" хотя бы на один из документов, являющихся регистратором для данного регистра, система компоновки данных (СКД) на уровне метаданных блокирует доступ ко всему дочернему полю Регистратор.Автор. Для этой роли поле группировки Продавец помечается системой как недоступное и полностью скрывается из настроек отчета.

Дополнительно стоит отметить, что использование ключевого слова РАЗРЕШЕННЫЕ в запросе здесь не помогает. Инструкция РАЗРЕШЕННЫЕ работает на уровне выборки самих записей (строк данных) из СУБД, отсекая те, на которые у пользователя нет прав (например, по механизму RLS). Однако она никак не влияет на доступность самих полей (колонок) на уровне метаданных СКД. Если колонка заблокирована из-за ограничений прав на составной тип, СКД исключит её из схемы целиком.

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

---

Решение 1. Кардинальное и наиболее правильное — изменение архитектуры данных

Обращение к реквизитам через Регистратор в реальных базах данных считается грубой ошибкой проектирования и нарушением стандартов разработки "1С". Помимо проблем с правами доступа, это приводит к созданию крайне неоптимальных SQL-запросов со множеством тяжелых соединений, что сильно снижает производительность системы при росте базы данных.

Для реализации лучшей практики выполним следующие шаги:

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

БезналОплатыОбороты.Продавец КАК Продавец

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

---

Решение 2. Обходной путь без изменения структуры метаданных — использование конструкции ВЫРАЗИТЬ

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

Вместо прямого обращения Регистратор.Автор напишем конструкцию, которая будет выполнять разыменование только для тех документов, к которым у роли "Продавец" гарантированно есть доступ:


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

При таком подходе СКД построит неявные связи только с теми таблицами документов, которые явно указаны в секции ВЫРАЗИТЬ. Документы, на которые у пользователя нет прав, не будут участвовать в запросе, благодаря чему поле группировки останется видимым для пользователя.

---

Решение 3. Обновление платформы и отключение режима совместимости

Поведение системы компоновки данных при работе с правами доступа на составные типы зависит от версии платформы "1С:Предприятие" и установленного режима совместимости конфигурации.

Если технические условия позволяют, рекомендуется обновить платформу и отключить режим совместимости конфигурации (перевести в режим "Не использовать" или установить значение не ниже 8.3.13).

---

Решение 4. Использование привилегированного режима

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

Привилегированный режим временно отключает проверку прав доступа (включая RLS) на время выполнения кода. Чтобы реализовать это в отчете СКД:

  1. Перенесем код формирования и вывода отчета в общий модуль с установленным флагом Привилегированный.
  2. В процедуре вызова отчета будем использовать программную компоновку результата, инициализируя процессор компоновки на сервере в привилегированном контексте.

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

← На главную