При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда под полными правами отчет работает идеально, но стоит запустить его под пользователем с ограниченными правами, как некоторые вычисляемые поля просто исчезают из списка доступных. Это ставит в тупик, особенно когда тип поля указан явно, а функция в общем модуле кажется максимально простой. В этой статье мы подробно разберем причины такого поведения платформы 1С и найдем способы решения этой проблемы.
Проанализируем наиболее частую причину, с которой столкнулись участники обсуждения. Если ваше вычисляемое поле использует в своем выражении реквизит, который имеет составной тип данных (например, ДокументСсылка, включающий в себя десятки видов документов), СКД проверяет права пользователя на каждый из этих типов.
Если у пользователя нет прав на чтение хотя бы одного из типов, входящих в составное поле, и это поле передается в функцию общего модуля или используется в расчете, СКД может превентивно исключить вычисляемое поле из настроек. Это происходит еще на этапе инициализации схемы, до того как пользователь нажмет кнопку «Сформировать».
Рассмотрим, как исправить эту ситуацию. Для этого воспользуемся оператором ВЫРАЗИТЬ в тексте запроса. Это позволит жестко ограничить тип данных, который будет передаваться в СКД, и «успокоить» систему контроля прав.
Вместо простого выбора поля в запросе:
ВЫБРАТЬ
Продажи.ДокументОплаты КАК ДокументОплаты
ИЗ
РегистрНакопления.Продажи КАК Продажи
Используем явное приведение типов:
ВЫБРАТЬ
ВЫРАЗИТЬ(Продажи.ДокументОплаты КАК Документ.ОплатаОтПокупателя) КАК ДокументОплаты
ИЗ
РегистрНакопления.Продажи КАК Продажи
Как показывает практика (сообщение 2 и 15), конкретизация типа через ВЫРАЗИТЬ решает проблему в большинстве случаев, так как система перестает требовать права на все остальные типы документов, входящие в «составное» поле.
Выясним еще один важный нюанс работы платформы 1С. Для СКД недостаточно, чтобы у пользователя было просто право Чтение на объект метаданных. Чтобы поле отобразилось в визуальном интерфейсе настроек компоновки (в списке доступных полей), пользователю обязательно должно быть назначено право «Просмотр».
Если вы используете в вычисляемом поле данные из справочника или документа, на которые у пользователя есть право Чтение (через код или запросы он данные видит), но снята галочка Просмотр в роли, СКД скроет это поле из пользовательских настроек. Проверьте настройки ролей в конфигураторе для всех объектов, участвующих в формуле вычисляемого поля.
Если расчет в вычисляемом поле сложный и требует обращения к данным, к которым у рядового пользователя заведомо не должно быть доступа, нам необходимо перенести логику расчета в привилегированный общий модуль. Рассмотрим, как это работает:
Привилегированный.Сервер, Вызов сервера и Внешнее соединение (в зависимости от контекста использования).Важно помнить, что если вы передаете в эту функцию параметры, на которые у пользователя нет прав Просмотр, вы все равно можете столкнуться с проблемой исчезновения поля. Поэтому комбинируйте этот метод с первым решением (использованием ВЫРАЗИТЬ).
Иногда корень проблемы кроется не в правах, а в самой логике построения схемы компоновки данных. Разберем ситуацию, описанную в сообщении 16: использование исключительно временных таблиц.
Если ваш запрос в наборе данных СКД состоит только из создания временных таблиц и не содержит финального, итогового запроса ВЫБРАТЬ..., СКД может некорректно определять доступные поля для пользователя с ограниченными правами. Хотя инструменты разработчика могут показывать результат последней временной таблицы, сама СКД требует явного завершающего запроса.
Пример ошибочной структуры:
ВЫБРАТЬ Ссылка В ИЗ Справочник.Номенклатура ПОМЕСТИТЬ ВТ_Данные;
// И на этом запрос заканчивается
Пример правильной структуры:
ВЫБРАТЬ Ссылка ПОМЕСТИТЬ ВТ_Данные ИЗ Справочник.Номенклатура;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ * ИЗ ВТ_Данные; // Финальная выборка обязательна для стабильной работы СКД
Проанализируем еще несколько факторов, которые могут влиять на доступность полей:
Ограничение поля и Ограничение настройки. Иногда при копировании или автоматическом создании полей там могут оказаться лишние флаги.Подводя итог, можно сказать: если вы столкнулись с «невидимостью» вычисляемого поля, в первую очередь типизируйте все входящие параметры через ВЫРАЗИТЬ и проверьте наличие прав «Просмотр» на все задействованные объекты метаданных.