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

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

Часто при разработке отчетов на базе Системы Компоновки Данных (СКД) возникает специфическая задача: необходимо дать пользователю возможность включать или выключать определенный отбор (например, булевого типа "Да/Нет"), но при этом жестко зафиксировать само значение отбора. То есть, чтобы по умолчанию стояло "Нет", а выбрать "Да" было физически невозможно. Разберем эту ситуацию по шагам и проанализируем несколько проверенных способов решения проблемы.

Способ 1: Использование поля "Представление" в настройках отбора

Рассмотрим самый простой и элегантный метод, который изначально заложен разработчиками платформы 1С для создания удобных пользовательских "тумблеров". Если мы не хотим, чтобы пользователь задумывался о видах сравнения и конкретных значениях, мы можем скрыть поле выбора значения, оставив только флажок (галочку) активации.

Выполним следующие шаги:

  1. Откроем схему компоновки данных и перейдем на вкладку Настройки.
  2. Добавим нужный нам отбор (например, по булевому полю) и установим ему требуемое значение (например, "Нет").
  3. Перейдем к свойствам этого элемента отбора. Найдем поле Представление.
  4. Впишем в это поле любой понятный текст, например, "Только неактуальные документы" или даже просто любую цифру.
  5. Включим этот отбор в пользовательские настройки.

Проанализируем, что произойдет. Платформа 1С увидит, что для отбора задано кастомное представление, и автоматически скроет колонки с видом сравнения и самим значением. В пользовательских настройках появится аккуратная строка с вашим текстом и галочкой слева. Пользователь сможет только включать или выключать этот отбор, а само значение останется тем, которое мы задали в конфигураторе.

Способ 2: Ограничение через "Доступные значения" параметров

Если по какой-то причине первый способ не подходит, разберем альтернативный вариант с использованием параметров. Вместо классического отбора мы можем вынести наше условие в параметры СКД.

  1. Перейдем на вкладку Параметры в схеме СКД.
  2. Для нужного параметра найдем колонку Доступные значения.
  3. Зададим там список, состоящий строго из одного элемента (например, только значение "Нет").
  4. Обязательно установим флажок в колонке Ограничение доступности для самих значений, чтобы пользователь не мог перевыбрать или очистить список.

При таком подходе в пользовательских настройках выпадающий список для этого параметра будет ограничен единственным вариантом. Физически выбрать что-то другое будет невозможно.

Способ 3: Программный контроль перед формированием отчета

Посмотрим на более сложный, но максимально надежный способ — программное ограничение. Этот подход идеален, когда ограничение несет важную бизнес-логику и мы хотим гарантированно исключить человеческий фактор.

Нам потребуется переопределить стандартное формирование отчета в модуле объекта отчета, используя обработчик события ПриКомпоновкеРезультата. В нем мы можем программно перебрать настройки и принудительно установить нужное значение, игнорируя то, что попытался ввести пользователь.


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

КонецПроцедуры

Также разработчики часто выносят подобный флаг управления прямо на форму отчета в виде обычного реквизита формы (булевой галочки). При этом из пользовательских настроек СКД этот отбор полностью убирается. В событии ПриКомпоновкеРезультата код просто считывает значение галочки с формы и динамически добавляет скрытый отбор в компоновщик перед выполнением запроса.

Важное замечание о безопасности (Уязвимость пользовательских настроек)

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

Продвинутый пользователь может сохранить вариант настроек отчета в файл формата XML, открыть его в любом текстовом редакторе, вручную найти тег с вашим значением "Нет", исправить его на "Да", а затем загрузить этот файл настроек обратно в базу. Интерфейс 1С проглотит такие настройки и выполнит запрос.

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

← На главную