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