Разработка и Конфигурация · 10 мин
Как добавить отбор на форму списка в обычных формах 1С
Пошаговая инструкция: как добавить отбор на форму списка в обычных формах 1С 8.2/8.3 — через настройку списка, код и панель отборов. Примеры и ошибки.
Обычные формы в 1С:Предприятие 8.2/8.3 всё ещё встречаются в старых конфигурациях — УПП 1.3, УТ 10.3, Комплексная автоматизация 1.1 и самописных решениях. Отбор в форме списка там устроен иначе, чем в управляемых формах: нет стандартной панели «Ещё → Настроить список», а механика опирается на объект Отбор у динамического списка или табличного поля.
Добавить отбор можно тремя путями: через стандартную настройку списка, доступную пользователю без программирования; через встроенную панель отборов на форме; и программно — в модуле формы или извне. Выбор зависит от того, кто будет менять отбор (пользователь или разработчик) и нужно ли сохранять настройки.
Ниже разобраны все три способа с примерами кода, проверкой результата и типичными ошибками. Материал ориентирован на платформы 8.2 и 8.3 в режиме обычного приложения.
Как устроен отбор в обычных формах
Форма списка в обычном приложении содержит табличное поле, связанное с данными списка (СправочникСписок, ДокументСписок и т.д.). У этого объекта есть свойство Отбор — коллекция элементов отбора, каждый из которых включает поле, вид сравнения, значение и флаг использования.
Ключевое отличие от управляемых форм: здесь нет компоновки данных в пользовательском интерфейсе по умолчанию. Отбор применяется напрямую к запросу, который формирует платформа для получения данных списка. Поэтому отбор возможен только по полям, доступным в запросе списка, — как правило, по реквизитам объекта и стандартным полям (Ссылка, Код, Наименование, Дата, Номер).
Способ 1: отбор через настройку списка без программирования
Самый простой вариант, доступный пользователю с полными правами или правом настройки списка. Откройте форму списка, в меню «Действия» выберите «Настройка списка» (в некоторых конфигурациях — «Отбор и сортировка» или кнопка с изображением воронки на командной панели).
В открывшемся окне добавьте строку отбора: выберите поле (например, «Организация» или «Контрагент»), вид сравнения («Равно», «В списке», «Содержит») и значение. После нажатия «ОК» список обновится с учётом условия. Платформа может сохранить настройку для текущего пользователя, если это предусмотрено конфигурацией.
Ограничение способа: настройка хранится у конкретного пользователя и может сбрасываться при обновлении конфигурации или очистке кэша настроек. Для отбора, обязательного для всех пользователей, этот путь не подходит.
- 1Откройте форму списка в режиме 1С:Предприятие
- 2В меню «Действия» выберите «Настройка списка»
- 3Добавьте строку: поле, вид сравнения, значение
- 4Нажмите «ОК» и убедитесь, что список отфильтрован
- 5Проверьте, что условие отображается в строке отбора над списком
Способ 2: программный отбор в модуле формы
Когда отбор должен устанавливаться автоматически при открытии формы, код размещают в обработчике ПриОткрытии. Типовой пример для списка документов с отбором по организации:
Процедура ПриОткрытии()
ЭлементОтбора = Список.Отбор.Организация;
ЭлементОтбора.Установить(ТекущаяОрганизация, Истина);
КонецПроцедуры
Здесь Список — реквизит формы типа ДокументСписок. Обращение по имени поля (Список.Отбор.Организация) работает, если поле присутствует в отборе. Метод Установить(Значение, Использование) одновременно задаёт значение и включает элемент отбора.
Если нужного поля нет в коллекции отбора или требуется нестандартный вид сравнения, добавьте элемент явно:
ЭлементОтбора = Список.Отбор.Элементы.Добавить();
ЭлементОтбора.Имя = "СуммаДокумента";
ЭлементОтбора.ВидСравнения = ВидСравнения.БольшеИлиРавно;
ЭлементОтбора.Значение = 100000;
ЭлементОтбора.Использование = Истина;
После изменения отбора список обычно обновляется автоматически. Если данные не перечитались, вызовите ЭлементыФормы.Список.Обновить() или Список.Обновить() в зависимости от версии платформы.
Способ 3: отбор при открытии формы извне
Частая задача — открыть список уже отфильтрованным, например показать документы по конкретному контрагенту из формы контрагента. Для этого форму получают и настраивают до открытия:
ФормаСписка = Документы.РеализацияТоваровУслуг.ПолучитьФормуСписка();
ФормаСписка.Отбор.Контрагент.Установить(ТекущийКонтрагент, Истина);
ФормаСписка.Открыть();
У полученной формы объект Отбор доступен напрямую как свойство формы списка, поэтому обращение короче, чем из модуля самой формы. Этот приём удобен для кнопок перехода «показать связанные документы».
Учтите: пользователь сможет вручную снять установленный отбор через настройку списка. Если этого нельзя допустить, отбор нужно фиксировать программно в модуле формы или использовать произвольный запрос с параметром.
Отбор по нескольким условиям и виды сравнения
Несколько элементов отбора объединяются по логике «И». Чтобы показать документы одной организации за период, добавьте два элемента — по Организация и по Дата (два элемента: «больше или равно» и «меньше или равно»).
Доступные виды сравнения включают Равно, НеРавно, Больше, Меньше, БольшеИлиРавно, МеньшеИлиРавно, ВИерархии, ВСписке, Содержит (для строк). Вид «Содержит» выполняет поиск подстроки и на больших таблицах может работать медленно, так как индексы при таком условии не используются.
Отбор по значению «в списке» требует передачи объекта СписокЗначений в свойство Значение элемента отбора. Это удобно для выбора нескольких контрагентов или складов одновременно.
Сравнение вариантов
Не требует программирования, но настройка индивидуальна и может сбрасываться
Гарантированный отбор для всех пользователей формы; требует изменения конфигурации
Гибко для переходов между объектами; отбор действует только на этот экземпляр формы
Позволяет отбор по любым условиям, включая табличные части; сложнее в сопровождении
Отбор через произвольный запрос
Если стандартного отбора недостаточно — например, нужно фильтровать по данным табличной части или по условию «ИЛИ» — список переводят в режим произвольного запроса. В конфигураторе в свойствах реквизита списка установите «Произвольный запрос» и задайте текст запроса с параметрами.
Значения параметров затем устанавливаются программно: Список.Запрос.УстановитьПараметр("Организация", ТекущаяОрганизация). После изменения параметра список нужно обновить. Этот подход даёт полную гибкость, но лишает пользователя части стандартной настройки отбора и требует аккуратности с правами и производительностью запроса.
Проверка результата и типичные ошибки
После установки отбора убедитесь, что список действительно отфильтрован: количество строк уменьшилось, а в строке состояния отбора (если она выведена на форму) отображается условие. Откройте карточку записи из списка — значение поля должно соответствовать отбору.
Если отбор «не срабатывает», чаще всего причина в том, что элемент отбора создан, но флаг Использование не установлен, либо отбор устанавливается после открытия формы без обновления списка. Также проверьте, что имя поля указано точно как в метаданных — ошибка в имени вызовет исключение при обращении к отбору.
Как проверить результат
Показаны только записи, удовлетворяющие условию
Видны лишние записи или список пуст при наличии подходящих данных
Условие отображается и может быть изменено пользователем
Условие не видно — отбор установлен скрытно, это может запутать пользователя
Список открывается без ощутимой задержки
Длительное ожидание — проверьте индексацию полей отбора
Часто задаваемые вопросы
Как снять отбор программно?
Установите у нужного элемента свойство Использование в Ложь: Список.Отбор.Организация.Использование = Ложь. Чтобы очистить все отборы, пройдите по коллекции Список.Отбор.Элементы и отключите каждый элемент. После этого обновите список.
Можно ли сохранить отбор для всех пользователей без изменения конфигурации?
Штатно — нет: настройка списка сохраняется персонально для пользователя. Общий отбор для всех реализуется только кодом в модуле формы, то есть требует доработки конфигурации или внешней обработки, открывающей список с заданным отбором.
Почему отбор по строковому полю с видом «Содержит» работает медленно?
Поиск подстроки не использует индексы, поэтому платформа вынуждена просматривать все записи таблицы. На больших справочниках и журналах документов это заметно. По возможности заменяйте условие на «Равно» или отбор по началу строки.
Как сделать отбор по периоду «с начала месяца по сегодня»?
Добавьте два элемента отбора по полю Дата: первый с видом сравнения БольшеИлиРавно и значением НачалоМесяца(ТекущаяДата()), второй — МеньшеИлиРавно с КонецДня(ТекущаяДата()). Оба элемента объединяются по «И» и дают нужный диапазон.
Работает ли этот подход в управляемых формах?
Нет, перечисленные приёмы относятся к обычным формам. В управляемых формах отбор настраивается через отбор динамического списка с использованием компоновки данных: Список.КомпоновщикНастроек или параметры формы Отбор при открытии.
Что делать, если нужного поля нет в списке доступных для отбора?
Проверьте, что поле является реквизитом объекта, а не табличной части или связанного объекта. Если отбор нужен по таким данным, переведите список на произвольный запрос с соединениями и параметрами либо добавьте в запрос списка требуемое поле через настройку в конфигураторе.
Что важно запомнить
В обычных формах отбор задаётся через объект Отбор списка: пользователем — через «Настройка списка», разработчиком — кодом в ПриОткрытии или при внешнем открытии формы. Для сложных условий используйте произвольный запрос, а результат всегда проверяйте по содержимому списка и скорости его открытия.