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