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