Как добавить отбор по родителю при открытии формы списка справочника в 1С (обычные формы)

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При работе с конфигурациями на обычных (неуправляемых) формах, такими как 1С:Управление торговлей 10.3/10.4 или 1С:Управление производственным предприятием 1.3, разработчики часто сталкиваются с трудностями при попытке программно ограничить список элементов. Традиционный для управляемых форм подход с динамическими списками здесь не работает, а использование методов, характерных для построителя отчетов, вызывает ошибки исполнения.

В этой статье мы подробно разберем, почему попытка использовать метод Добавить() в коллекции отбора приводит к ошибке, и изучим правильные способы установки фильтра по родителю (группе) справочника при открытии формы.

Анализ основной ошибки: почему не работает метод Добавить

Рассмотрим ситуацию, с которой часто начинают программисты: попытка вызвать Отбор.Добавить(). В обычном приложении основным элементом формы списка является ТабличноеПоле, связанное с типом данных СправочникСписок. В отличие от динамических списков в управляемом приложении, объект СправочникСписок обладает фиксированным набором доступных полей для фильтрации.

Выясним причину ошибки: состав полей в коллекции Отбор для обычных форм определяется метаданными справочника в конфигураторе. Такие поля, как Родитель, Код, Наименование и любые реквизиты с включенным индексированием, уже существуют в этой коллекции в момент инициализации формы. Попытка вызвать метод Добавить() для поля, которое и так присутствует, либо использование этого метода в объектах, где он не предусмотрен (как у СправочникСсылка), неизбежно ведет к аварийному завершению кода.

Правильный способ №1: Использование метода Установить

Самый простой и надежный способ программно задать фильтр — это использование метода Установить(). Этот метод является «комбинированным»: он одновременно включает использование отбора, задает вид сравнения (по умолчанию «Равно») и устанавливает значение. Рассмотрим пример кода, который следует разместить в модуле формы в обработчике события ПриОткрытии:


Процедура ПриОткрытии()
    // Предположим, у нас есть переменная НужныйРодитель с ссылкой на группу
    Если ЗначениеЗаполнено(НужныйРодитель) Тогда
        СправочникСписок.Отбор.Родитель.Установить(НужныйРодитель);
    КонецЕсли;
КонецПроцедуры

Этот код мгновенно применит фильтр, и пользователь увидит только элементы, входящие в указанную группу. Важно помнить, что СправочникСписок — это стандартное имя основного реквизита формы списка справочника.

Правильный способ №2: Детальная настройка через свойства объекта

Иногда требуется более тонкая настройка. Например, если мы хотим запретить пользователю самостоятельно отключать этот отбор или если нам нужно использовать специальный вид сравнения. В этом случае мы обращаемся к свойствам конкретного поля отбора напрямую. Проанализируем ситуацию, когда нам нужно показать не только прямых потомков папки, но и все элементы во всех вложенных подпапках.

Разберем решение по шагам:

  1. Обращаемся к полю Родитель в коллекции Отбор.
  2. Устанавливаем ВидСравнения в значение ВИерархии.
  3. Присваиваем значение ссылке на группу.
  4. Активируем отбор свойством Использование.

// Пример детальной настройки отбора
ПолеОтбора = СправочникСписок.Отбор.Родитель;
ПолеОтбора.ВидСравнения  = ВидСравнения.ВИерархии;
ПолеОтбора.Значение      = ГруппаДляФильтра;
ПолеОтбора.Использование = Истина;

// Дополнительно можно запретить пользователю менять этот отбор в окне настроек
ПолеОтбора.Доступность = Ложь;

Отбор при вызове формы из внешнего кода

Часто задачу нужно решить не «внутри» самой формы, а при её открытии из другого места (например, из документа или другой обработки). В обычном приложении мы сначала получаем объект формы, настраиваем её параметры, а затем вызываем метод Открыть().

Посмотрим на пример кода, который открывает форму выбора контрагентов с уже установленным фильтром по папке «Поставщики»:


// В коде внешней обработки или документа
ГруппаКонтрагентов = Справочники.Контрагенты.НайтиПоНаименованию("Поставщики");

ФормаВыбора = Справочники.Контрагенты.ПолучитьФормуВыбора("ФормаВыбора", , "УникальныйКлючФормы");
ФормаВыбора.СправочникСписок.Отбор.Родитель.Установить(ГруппаКонтрагентов);
ФормаВыбора.Открыть();

Важный нюанс: если вы используете типовую конфигурацию (например, УТ 10.3), обратите внимание на настройки иерархического просмотра. Если в форме включен режим «Иерархический просмотр» (кнопка в виде дерева), то установленный отбор по родителю может конфликтовать с визуальным отображением веток. В некоторых случаях для корректной работы жесткого фильтра рекомендуется программно отключать иерархию:

ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Ложь;

Особенности работы с иерархией в обычных формах

Проанализируем разницу между видами сравнения, так как это критично для отбора по родителю:

Подводя итог, можно сказать, что работа с отборами в неуправляемом приложении 1С требует понимания того, что Отбор — это фиксированная коллекция, структура которой определена в конфигураторе. Вместо попыток динамического изменения структуры коллекции (через Добавить), следует управлять свойствами уже существующих в ней элементов через метод Установить или прямое изменение свойств Значение и Использование.

← На главную