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

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

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

Выясняем причину: Различие между правами «Чтение» и «Просмотр»

Первое, что мы должны проверить — это права доступа в метаданных. В системе 1С существует критическое различие между правом «Чтение» и правом «Просмотр». Рассмотрим их подробнее:

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

Если у пользователя есть право на чтение регистра, но нет права на просмотр объектов, которые входят в составное поле (например, справочники Контрагенты или Организации, входящие в КорСубконто1), платформа может превентивно скрыть это поле из доступных настроек, чтобы не нарушать целостность отображения. Таким образом, отсутствие галочки «Просмотр» в роли пользователя — самая частая причина проблемы.

Ограничение типов через функцию ВЫРАЗИТЬ

Если предоставление прав на просмотр всех возможных объектов не помогает или нежелательно по соображениям безопасности, мы можем применить механизм жесткого ограничения типов в запросе СКД. Это наиболее эффективный метод решения проблемы с «пропадающими» субконто.

Разберем ситуацию: поле КорСубконто1 имеет составной тип. Платформа проверяет права пользователя на все типы, которые могут там оказаться. Если хотя бы на один тип прав нет — поле может исчезнуть. Чтобы «успокоить» систему прав, мы используем функцию ВЫРАЗИТЬ. Посмотрим на пример кода в тексте запроса:


ВЫБРАТЬ
    ХозрасчетныйОбороты.Счет КАК Счет,
    ВЫРАЗИТЬ(ХозрасчетныйОбороты.КорСубконто1 КАК Справочник.Контрагенты) КАК ПолучательПлательщик,
    ХозрасчетныйОбороты.СуммаОборот КАК Сумма
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, , , , , , ) КАК ХозрасчетныйОбороты
ГДЕ
    ХозрасчетныйОбороты.КорСубконто1 ССЫЛКА Справочник.Контрагенты
    ИЛИ ХозрасчетныйОбороты.КорСубконто1 ССЫЛКА Справочник.Организации

Используя ВЫРАЗИТЬ, мы явно указываем СКД, что работаем только с конкретными типами. Это исключает необходимость проверки прав на остальные «потенциальные» типы данных, которые система могла бы ожидать в этом поле.

Программное формирование отчета в привилегированном режиме

Иногда требуется вывести данные, на которые у пользователя нет прав доступа на уровне метаданных. В этом случае мы можем использовать привилегированный режим. Однако просто вызвать УстановитьПривилегированныйРежим(Истина) в начале процедуры ПриКомпоновкеРезультата недостаточно.

Проанализируем правильный алгоритм программного формирования отчета. Мы должны отключить стандартную обработку и самостоятельно инициализировать процессор компоновки:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Включаем привилегированный режим для обхода проверок прав
    УстановитьПривилегированныйРежим(Истина);
    
    // 1. Получаем схему и настройки
    СхемаКомпоновки = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // 2. Формируем макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки, ДанныеРасшифровки);
    
    // 3. Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    // Четвертый параметр "Истина" включает возможность использования внешних функций и игнорирование прав
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    // 4. Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Важное замечание: Привилегированный режим работает только на стороне сервера. Если вы используете внешний отчет, убедитесь, что он подключен в базу через механизм «Дополнительные отчеты и обработки» с отключенным безопасным режимом.

Настройка внешних отчетов в БСП

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

Проанализируем, как правильно зарегистрировать такой отчет. В модуле объекта внешнего отчета, в функции СведенияОВнешнейОбработке, необходимо явно указать параметры регистрации:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    // ... другие параметры ...
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); 
    Возврат ПараметрыРегистрации;
КонецФункции

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

Чек-лист для диагностики проблемы

Если группировка в СКД все еще не выводится, пройдите по следующим шагам:

  1. Проверьте право «Просмотр» на все справочники и документы, входящие в составной тип поля.
  2. Убедитесь, что у пользователя есть права на План видов характеристик и План счетов, если данные тянутся из регистра бухгалтерии.
  3. Примените ВЫРАЗИТЬ(Поле КАК Тип) в тексте запроса набора данных.
  4. Проверьте Функциональные опции: если поле связано с отключенной опцией, оно будет скрыто для всех, кроме администратора.
  5. Сбросьте настройки отчета у пользователя до стандартных (кнопка Еще -> Установить стандартные настройки), так как СКД может кэшировать старое дерево доступных полей.
  6. Проверьте вкладку «Наборы данных» в СКД, колонку «Ограничение доступности» — убедитесь, что там не стоят флажки на полях или группировках.

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

← На главную