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