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