Как передать параметры и отбор в форму выбора справочника в 1С?

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

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

Основные причины ошибок при вызове формы выбора

Разберем типичную ситуацию: при попытке программно открыть форму выбора выдается ошибка Неизвестное имя формы или вместо интерактивного выбора открывается стандартная форма списка в режиме просмотра/редактирования.

Выясним главные причины такого поведения:

  1. Неверный синтаксис пути к форме: Если форма выбора не создана явно в конфигураторе, обращаться к ней через ключевое слово Форма (например, Справочник.ИмяСправочника.Форма.ФормаВыбора) нельзя — платформа выдаст ошибку. Для стандартных форм, генерируемых платформой по умолчанию, используется синтаксис Справочник.ИмяСправочника.ФормаВыбора.
  2. Неуказанный владелец формы: Если третьим параметром метода ОткрытьФорму не передан элемент формы (поле ввода) или сама форма-владелец, открываемая форма может сработать как обычный список без возврата выбранного значения.
  3. Отсутствие режима выбора: В некоторых случаях dynamic list (динамический список) открывается в режиме просмотра, если явно не указан параметр РежимВыбора или не настроено свойство динамического списка.

Шаг 1. Формирование структуры параметров и открытие формы

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

Посмотрим на практический пример кода в модуле управляемой формы:


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

КонецПроцедуры

&НаСервереБезКонтекста
Функция НачВыбора()
    
    Возврат ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Размерный ряд");

КонецФункции

Проанализируем ключевые моменты данного решения:

  1. Параметр СтандартнаяОбработка = Ложь предотвращает повторное или стандартное открытие формы платформой.
  2. В структуру ПараметрыФормы мы передаем вложенную структуру Отбор. Ключи этой структуры должны совпадать с именами полей и реквизитов dynamic list открываемого объекта (в данном примере — реквизит Владелец).
  3. Третий параметр метода ОткрытьФорму — Элемент. Он указывает платформе, какой элемент вызвал выбор. После выбора значения платформа автоматически заполнит этот элемент и вызовет его событие ОбработкаВыбора.

Шаг 2. Альтернативные варианты передачи отборов и обработки результата

Рассмотрим другие способы реализации выбора в зависимости от задач разработчика.

1. Использование свойств элемента в Конфигураторе (Декларативный способ)

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

2. Ручная обработка результата выбора через событие формы

Если результат выбора нужно обработать программно (например, высчитать дополнительные показатели или заполнить несколько полей), третьим параметром метода ОткрытьФорму передается сама форма (ЭтаФорма). Результат выбора примет событие ОбработкаВыбора формы-владельца:


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

КонецПроцедуры

3. Явная установка режима выбора для кастомных форм

Если для справочника создана произвольная форма списка, которая используется и для подбора, убедитесь, что в параметрах формы передано свойство РежимВыбора = Истина, либо динамический список в открываемой форме настроен на выбор элементов по двойному клику или клавише Enter.

← На главную