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