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