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