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