Как наложить фильтр на форму выбора при программном добавлении строк в табличную часть?

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

При работе с управляемыми формами в 1С часто возникает задача ограничить выбор элементов в справочнике или документе. Если стандартных параметров выбора недостаточно или если типовой код формы выбора жестко навязывает ненужные нам отборы, необходимо применять программный подход. Разберем детально, как правильно организовать такой процесс.

Отказ от стандартной обработки выбора

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

Реализуем это следующим образом:


&НаКлиенте
Процедура ИмяКолонкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("ТолькоТиповые", Истина);
    
    ОткрытьФорму("Справочник.Соглашения.ФормаВыбора", ПараметрыОткрытия, Элемент);
КонецПроцедуры

Проблема типовых отборов в обработчике ПриСозданииНаСервере

Часто в типовых конфигурациях (например, УТ 11 или ERP) в событии ПриСозданииНаСервере формы выбора уже прописана логика, которая принудительно устанавливает параметры динамического списка. Если вы просто передаете параметр через ОткрытьФорму, типовой код может «перебить» ваши настройки или наложить дополнительные фильтры, которые вам не нужны.

Попытки «обмануть» систему через использование параметра АвтоТест — не лучший путь. Этот механизм предназначен для систем автоматизированного тестирования и отключает инициализацию важных компонентов формы, что приводит к ошибкам в работе динамического списка.

Решение через Расширение конфигурации

Наиболее архитектурно правильный способ обойти жесткие ограничения типовой конфигурации — использование Расширений конфигурации. Это позволяет модифицировать поведение системы, не внося изменений в основной код, что облегчает последующие обновления.

  1. Создайте расширение для вашей конфигурации.
  2. Добавьте форму выбора необходимого справочника в расширение.
  3. Перехватите событие ПриСозданииНаСервере с аннотацией &После.
  4. Внутри обработчика проверяйте наличие специального параметра, который вы передали при открытии формы:

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

Альтернативные подходы к настройке отборов

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

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

Подводя итог, старайтесь придерживаться следующего алгоритма: сначала используйте стандартные механизмы свойств элементов формы, если их недостаточно — используйте ОткрытьФорму с параметрами, и только в случае конфликта с типовой логикой — применяйте расширения с аннотацией &После.

← На главную