При разработке отчетов на базе регистров накопления или сведений разработчики часто сталкиваются с ситуацией, когда у пользователей с полными правами данные колонки Регистратор.Дата выводятся корректно, а у пользователей с ограниченными правами (например, менеджеров) эта колонка оказывается пустой или вовсе скрывается. Разберем причину этого поведения и проанализируем способы решения проблемы.
Поле Регистратор в виртуальных и реальных таблицах регистров 1С имеет составной тип данных. В него входят ссылки на абсолютно все документы, которые назначены регистраторами данного регистра. Когда в тексте запроса мы обращаемся к реквизиту через точку (например, Продажа.Регистратор.Дата), платформа 1С выполняет разыменование составного поля. На уровне СУБД это приводит к неявному левому соединению (LEFT JOIN) со всеми таблицами документов-регистраторов.
Если у текущего пользователя отсутствуют права Чтение или Просмотр хотя бы на один из документов, входящих в составной тип реквизита Регистратор, платформа в целях безопасности возвращает значение NULL при обращении к реквизитам этих типов. В результате Система компоновки данных (СКД) не может получить значение даты и скрывает колонку или выводит в ней пустые значения.
Самое прямое решение — проверить права ролей, назначенных пользователю, и убедиться, что ему доступны все документы, которые могут выступать регистраторами регистра.
РегистрНакопления.РасчетыСПокупателями).После предоставления прав на все типы документов-регистраторов неявное соединение при запросе Регистратор.Дата начнет отрабатывать корректно для всех записей.
Предоставление прав на все документы базы не всегда допустимо из соображений безопасности. Кроме того, обращения через точку к составным полям снижают производительность запросов. Оптимальным решением является явное приведение типа поля Регистратор с помощью функции ВЫРАЗИТЬ().
Рассмотрим пример запроса, где выборка ограничена конкретным типом документа:
ВЫБРАТЬ
Продажа.Контрагент КАК Контрагент,
Продажа.СуммаВалКонечныйОстаток КАК СуммаВалКонечныйОстаток,
Продажа.Регистратор КАК Регистратор,
ВЫРАЗИТЬ(Продажа.Регистратор КАК Документ.РасходнаяНакладная).Дата КАК РегистраторДата
ИЗ
РегистрНакопления.РасчетыСПокупателями.ОстаткиИОбороты(, , Регистратор, , ) КАК Продажа
ГДЕ
ТИПЗНАЧЕНИЯ(Продажа.Регистратор) = ТИП(Документ.РасходнаяНакладная)
При использовании ВЫРАЗИТЬ(Продажа.Регистратор КАК Документ.РасходнаяНакладная) платформа выполняет соединение только с одной таблицей Документ.РасходнаяНакладная. В этом случае пользователю достаточно иметь права только на данный документ, а права на остальные регистраторы системы не потребуются.
Если отчет должен формироваться по служебным данным, к которым у пользователя нет прямого доступа, мы можем запустить выборку данных в привилегированном режиме.
УстановитьПривилегированныйРежим(Истина) перед выполнением запроса или формированием отчета.Таким образом, мы изучили причины скрытия колонки с датой регистратора и разобрали три способа устранения этой проблемы в зависимости от требований к безопасности и архитектуре решения.