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