Как заменить выбор Да/Нет на флажок для булевых параметров в отчетах СКД?

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

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

Почему стандартные методы не работают в ПриОткрытии?

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

Способ 1: Использование события ПриЗагрузкеПользовательскихНастроекНаСервере

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

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


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

Важно помнить: чтобы этот код сработал, параметр должен быть включен в Пользовательские настройки в схеме компоновки данных (установлен соответствующий флажок «звездочка»).

Способ 2: Настройка через расширение языка запросов (Фигурные скобки)

Иногда проблему проще решить на уровне текста запроса, особенно если параметр используется как условие включения или выключения какого-либо фильтра. Посмотрим на пример, как можно вынести условие в фигурные скобки, чтобы СКД интерпретировала его как доступный отбор, который на форме легче превратить в флажок.

Проанализируем пример конструкции в запросе:


ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.СуммаОборот
ИЗ
    РегистрНакопления.Продажи.Обороты КАК Продажи
ГДЕ
    { (ВЫРАЗИТЬ(ИСТИНА КАК БУЛЕВО)) КАК ВключитьДополнительныйФильтр }

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

Способ 3: Создание собственной формы отчета

Если отчет имеет сложную логику или вы используете внешние источники данных (как в случае с прямыми SQL-запросами), стандартная форма может вести себя непредсказуемо. Выясним причину: общая форма отчета стремится к универсальности и часто перекрывает индивидуальные настройки элементов. Создание собственной формы отчета — это «золотой стандарт», когда требуется полный контроль над интерфейсом.

Разберем алгоритм действий:

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

Пример программной передачи значения из реквизита формы в параметр СКД:


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

Нюансы для параметров с внешними источниками

В ситуациях, когда отчет строится на основе внешнего SQL-запроса (через ВнешниеИсточникиДанных), крайне важно следить за типами данных. Если в СКД тип параметра определен как составной или неявно приводится к числу (0 или 1), флажок не появится. Обязательно убедитесь, что в схеме компоновки для данного параметра жестко задан тип Булево и снят флаг «Доступно пустое значение».

Если оставить возможность «пустого значения», платформа будет использовать поле выбора, чтобы пользователь мог выбрать третье состояние — «Не установлено» (Null/Неопределено). Флажок же поддерживает только два состояния: Истина или Ложь. Поэтому запрет незаполненных значений — это ключевое условие для появления чекбокса.

Заключение

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

← На главную