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