Почему в отчете 1С не отображается дата регистратора у пользователей с ограниченными правами и как это исправить?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе регистров накопления или сведений разработчики часто сталкиваются с ситуацией, когда у пользователей с полными правами данные колонки Регистратор.Дата выводятся корректно, а у пользователей с ограниченными правами (например, менеджеров) эта колонка оказывается пустой или вовсе скрывается. Разберем причину этого поведения и проанализируем способы решения проблемы.

Выясним причину проблемы

Поле Регистратор в виртуальных и реальных таблицах регистров 1С имеет составной тип данных. В него входят ссылки на абсолютно все документы, которые назначены регистраторами данного регистра. Когда в тексте запроса мы обращаемся к реквизиту через точку (например, Продажа.Регистратор.Дата), платформа 1С выполняет разыменование составного поля. На уровне СУБД это приводит к неявному левому соединению (LEFT JOIN) со всеми таблицами документов-регистраторов.

Если у текущего пользователя отсутствуют права Чтение или Просмотр хотя бы на один из документов, входящих в составной тип реквизита Регистратор, платформа в целях безопасности возвращает значение NULL при обращении к реквизитам этих типов. В результате Система компоновки данных (СКД) не может получить значение даты и скрывает колонку или выводит в ней пустые значения.

Способ 1. Предоставление прав на все документы-регистраторы

Самое прямое решение — проверить права ролей, назначенных пользователю, и убедиться, что ему доступны все документы, которые могут выступать регистраторами регистра.

  1. Откроем конфигуратор и найдем регистр накопления, по которому строится отчет (например, РегистрНакопления.РасчетыСПокупателями).
  2. Откроем список регистраторов данного регистра на вкладке Документы.
  3. Для роли ограниченного пользователя (например, «Менеджер») установим права Чтение и Просмотр для всех документов из этого списка.

После предоставления прав на все типы документов-регистраторов неявное соединение при запросе Регистратор.Дата начнет отрабатывать корректно для всех записей.

Способ 2. Явное приведение типа в запросе через ВЫРАЗИТЬ()

Предоставление прав на все документы базы не всегда допустимо из соображений безопасности. Кроме того, обращения через точку к составным полям снижают производительность запросов. Оптимальным решением является явное приведение типа поля Регистратор с помощью функции ВЫРАЗИТЬ().

Рассмотрим пример запроса, где выборка ограничена конкретным типом документа:


ВЫБРАТЬ
	Продажа.Контрагент КАК Контрагент,
	Продажа.СуммаВалКонечныйОстаток КАК СуммаВалКонечныйОстаток,
	Продажа.Регистратор КАК Регистратор,
	ВЫРАЗИТЬ(Продажа.Регистратор КАК Документ.РасходнаяНакладная).Дата КАК РегистраторДата
ИЗ
	РегистрНакопления.РасчетыСПокупателями.ОстаткиИОбороты(, , Регистратор, , ) КАК Продажа
ГДЕ
	ТИПЗНАЧЕНИЯ(Продажа.Регистратор) = ТИП(Документ.РасходнаяНакладная)

При использовании ВЫРАЗИТЬ(Продажа.Регистратор КАК Документ.РасходнаяНакладная) платформа выполняет соединение только с одной таблицей Документ.РасходнаяНакладная. В этом случае пользователю достаточно иметь права только на данный документ, а права на остальные регистраторы системы не потребуются.

Способ 3. Использование привилегированного режима

Если отчет должен формироваться по служебным данным, к которым у пользователя нет прямого доступа, мы можем запустить выборку данных в привилегированном режиме.

  1. В модуле объекта отчета или формы вызовем метод УстановитьПривилегированныйРежим(Истина) перед выполнением запроса или формированием отчета.
  2. Если отчет выполнен на базе СКД, укажем флаг Привилегированный режим в настройках набора данных или запустим формирование программно в привилегированном модуле.

Таким образом, мы изучили причины скрытия колонки с датой регистратора и разобрали три способа устранения этой проблемы в зависимости от требований к безопасности и архитектуре решения.

← На главную