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