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