При разработке отчетов на базе Системы компоновки данных (СКД) разработчики часто сталкиваются с ситуацией: у администратора отчет формируется корректно, а у пользователей с ограниченными ролями пропадают колонки, группировки или перестают отображаться вычисляемые поля в пользовательских настройках. При этом прямой запрос в консоли под этим же пользователем может успешно возвращать данные.
Разберем детально механизм работы СКД с правами доступа, выясним причину такого поведения и рассмотрим практические способы решения проблемы.
Для понимания проблемы важно различать два базовых права платформы 1С:Предприятие:
ВЫБРАТЬ РАЗРЕШЕННЫЕ... в коде или консоли запросов вернет записи.ИсточникДоступныхНастроекКомпоновкиДанных и дерево доступных полей в КомпоновщикНастроек) ориентируются именно на право «Просмотр».Если у роли пользователя отсутствует право Просмотр на объект метаданных, реквизит или регистр, СКД полностью исключает соответствующее поле из структуры доступных настроек. В результате пользователь не видит поле в доступных колонках и группировках, а сохраненные варианты настроек просто теряют эти элементы при компоновке.
Если в схеме компоновки создано вычисляемое поле (например, МесяцПоступления), рассчитываемое на основе дат документов из набора данных, платформа проверяет доступность всех исходных полей, входящих в формулу.
Как только одно из исходных полей становится недоступным (из-за отсутствия права «Просмотр» на реквизит или документ), СКД не может гарантировать корректность вычисления формулы и каскадно исключает вычисляемое поле из доступных настроек отчета.
Проанализируем частую скрытую причину: обращение к полям через точку в запросе набора данных. Рассмотрим пример запроса:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
РазмещениеЗаказовПокупателейОстатки.ЗаказПокупателя,
РазмещениеЗаказовПокупателейОстатки.ЗаказПоставщику.ДатаПоступления КАК ЗаказДатаПоступления,
РазмещениеЗаказовПокупателейОстатки.ЗаказПоставщику.ДатаОтгрузки КАК ЗаказДатаОтгрузки
ИЗ
РегистрНакопления.РазмещениеЗаказовПокупателей.Остатки КАК РазмещениеЗаказовПокупателейОстатки
ГДЕ
РазмещениеЗаказовПокупателейОстатки.ЗаказПокупателя = &ЗаказПокупателя
Если измерение ЗаказПоставщику или связанное измерение ЗаказПокупателя имеет составной тип (например, может содержать ДокументСсылка.ЗаказПоставщику, ДокументСсылка.ВнутреннийЗаказ и др.), платформа при разыменовании полей через точку неявно соединяет все возможные таблицы объектов метаданных, входящих в составной тип.
Если в схеме есть несколько связанных наборов данных или составные типы, и у пользователя нет права на просмотр хотя бы одного из связанных типов метаданных (например, документа ВнутреннийЗаказ), СКД признает связанную ветку недоступной для интерфейса и вырезает результирующие поля.
Разберем по шагам, как локализовать и устранить скрытое ограничение прав в отчете СКД.
Проанализируем все наборы данных отчета и связи между ними. Проверим наличие прав «Просмотр» не только на основной регистр и документ, но и на все вспомогательные таблицы, участвующие в связях наборов данных и составных типах.
Для быстрой проверки прав конкретного пользователя в коде можно использовать функцию платформы:
ПравоДоступа("Просмотр", Метаданные.Документы.ВнутреннийЗаказ)Если реквизит имеет составной тип, а данные требуются только по конкретному документу, исключим неявные соединения со всеми остальными типами с помощью конструкции ВЫРАЗИТЬ:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ВЫРАЗИТЬ(РазмещениеЗаказовПокупателейОстатки.ЗаказПоставщику КАК Документ.ЗаказПоставщику).ДатаПоступления КАК ЗаказДатаПоступления,
ВЫРАЗИТЬ(РазмещениеЗаказовПокупателейОстатки.ЗаказПоставщику КАК Документ.ЗаказПоставщику).ДатаОтгрузки КАК ЗаказДатаОтгрузки
ИЗ
РегистрНакопления.РазмещениеЗаказовПокупателей.Остатки КАК РазмещениеЗаказовПокупателейОстатки
Это избавит платформу от проверки прав на сторонние документы (например, ВнутреннийЗаказ), не входящие в выражение.
Убедимся в конфигураторе через окно «Все роли», что у целевой роли установлены флаги «Просмотр» как на сам документ/регистр, так и на его реквизиты, используемые в схеме компоновки.
Если бизнес-логика требует отображения данных в отчете без выдачи пользователю прав на просмотр исходных документов, перенесем выборку в привилегированный общий модуль.
Выберем данные запросом в ТаблицуЗначений с примитивными типами колонок (число, строка, дата) и передадим её в СКД через внешний набор данных. В этом случае компоновщик настроек не будет связывать поля с закрытыми объектами метаданных, и они останутся полностью доступными в настройках отчета.