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