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

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

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

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

Механика работы СКД с правами доступа: «Чтение» против «Просмотра»

Для понимания проблемы важно различать два базовых права платформы 1С:Предприятие:

  1. Право «Чтение» — разрешает получение данных на уровне СУБД. Если у пользователя есть право «Чтение», запрос вида ВЫБРАТЬ РАЗРЕШЕННЫЕ... в коде или консоли запросов вернет записи.
  2. Право «Просмотр» — интерфейсное право. Инструменты СКД (в частности, ИсточникДоступныхНастроекКомпоновкиДанных и дерево доступных полей в КомпоновщикНастроек) ориентируются именно на право «Просмотр».

Если у роли пользователя отсутствует право Просмотр на объект метаданных, реквизит или регистр, СКД полностью исключает соответствующее поле из структуры доступных настроек. В результате пользователь не видит поле в доступных колонках и группировках, а сохраненные варианты настроек просто теряют эти элементы при компоновке.

Каскадное отключение вычисляемых полей

Если в схеме компоновки создано вычисляемое поле (например, МесяцПоступления), рассчитываемое на основе дат документов из набора данных, платформа проверяет доступность всех исходных полей, входящих в формулу.

Как только одно из исходных полей становится недоступным (из-за отсутствия права «Просмотр» на реквизит или документ), СКД не может гарантировать корректность вычисления формулы и каскадно исключает вычисляемое поле из доступных настроек отчета.

Неявные соединения и составные типы данных

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


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    РазмещениеЗаказовПокупателейОстатки.ЗаказПокупателя,
    РазмещениеЗаказовПокупателейОстатки.ЗаказПоставщику.ДатаПоступления КАК ЗаказДатаПоступления,
    РазмещениеЗаказовПокупателейОстатки.ЗаказПоставщику.ДатаОтгрузки КАК ЗаказДатаОтгрузки
ИЗ
    РегистрНакопления.РазмещениеЗаказовПокупателей.Остатки КАК РазмещениеЗаказовПокупателейОстатки
ГДЕ
    РазмещениеЗаказовПокупателейОстатки.ЗаказПокупателя = &ЗаказПокупателя

Если измерение ЗаказПоставщику или связанное измерение ЗаказПокупателя имеет составной тип (например, может содержать ДокументСсылка.ЗаказПоставщику, ДокументСсылка.ВнутреннийЗаказ и др.), платформа при разыменовании полей через точку неявно соединяет все возможные таблицы объектов метаданных, входящих в составной тип.

Если в схеме есть несколько связанных наборов данных или составные типы, и у пользователя нет права на просмотр хотя бы одного из связанных типов метаданных (например, документа ВнутреннийЗаказ), СКД признает связанную ветку недоступной для интерфейса и вырезает результирующие поля.

Пошаговый алгоритм диагностики и решения проблемы

Разберем по шагам, как локализовать и устранить скрытое ограничение прав в отчете СКД.

  1. Проверка прав на все связанные объекты метаданных:

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

    Для быстрой проверки прав конкретного пользователя в коде можно использовать функцию платформы:

    ПравоДоступа("Просмотр", Метаданные.Документы.ВнутреннийЗаказ)
  2. Явное ограничение типа через ВЫРАЗИТЬ:

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

    
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
        ВЫРАЗИТЬ(РазмещениеЗаказовПокупателейОстатки.ЗаказПоставщику КАК Документ.ЗаказПоставщику).ДатаПоступления КАК ЗаказДатаПоступления,
        ВЫРАЗИТЬ(РазмещениеЗаказовПокупателейОстатки.ЗаказПоставщику КАК Документ.ЗаказПоставщику).ДатаОтгрузки КАК ЗаказДатаОтгрузки
    ИЗ
        РегистрНакопления.РазмещениеЗаказовПокупателей.Остатки КАК РазмещениеЗаказовПокупателейОстатки
    

    Это избавит платформу от проверки прав на сторонние документы (например, ВнутреннийЗаказ), не входящие в выражение.

  3. Проверка прав на просмотр реквизитов:

    Убедимся в конфигураторе через окно «Все роли», что у целевой роли установлены флаги «Просмотр» как на сам документ/регистр, так и на его реквизиты, используемые в схеме компоновки.

  4. Использование внешнего набора данных (Набор данных — объект):

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

    Выберем данные запросом в ТаблицуЗначений с примитивными типами колонок (число, строка, дата) и передадим её в СКД через внешний набор данных. В этом случае компоновщик настроек не будет связывать поля с закрытыми объектами метаданных, и они останутся полностью доступными в настройках отчета.

← На главную