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