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