Как открыть форму выбора и вернуть выбранное значение в 1С:Предприятие 8.3

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

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

Суть проблемы и постановка задачи

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

  1. Перехватить нажатие кнопки выбора.
  2. Программно вызвать форму выбора справочника Контрагенты.
  3. Сделать так, чтобы форма «знала», куда вернуть результат, без использования команды ОповеститьОВыборе внутри самой формы справочника (так как это потребовало бы снятия объекта с поддержки или создания расширения).
  4. Обработать полученную ссылку и записать её данные в текстовое поле.

Рассмотрим пошагово, как это реализовать, используя возможности встроенного языка.

Шаг 1. Перехват начала выбора

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


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

    // Ключевой момент: передаем Элемент (наше поле) в качестве владельца формы
    ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыВыбора, Элемент);
КонецПроцедуры

В данном фрагменте кода мы используем метод ОткрытьФорму. Проанализируем его параметры. Второй параметр — это структура ПараметрыВыбора, которая позволяет настроить поведение открываемой формы. Третий параметр — Владелец. Указывая Элемент (наше текстовое поле), мы сообщаем платформе, что именно этот элемент ожидает возврата значения.

Шаг 2. Получение и обработка выбранного значения

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


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

&НаСервереБезКонтекста
Функция ПолучитьНаименованиеНаСервере(СсылкаНаКонтрагента)
    // Используем получение данных через ссылку для оптимизации
    Возврат СсылкаНаКонтрагента.Наименование;
КонецФункции

Обратите внимание на использование функции с директивой &НаСервереБезКонтекста. Проанализируем ситуацию: получение наименования через ВыбранноеЗначение.Наименование напрямую на клиенте может привести к неявному серверному вызову всей записи объекта, что неэффективно. Лучше вызвать легкую функцию, которая вернет только нужную строку.

Шаг 3. Продвинутые параметры открытия (Отборы и папки)

Часто требуется не просто открыть весь справочник, а ограничить выбор определенной папкой или условием (например, только «Поставщики»). Рассмотрим, как передать параметры отбора, не меняя форму выбора (в некоторых случаях поможет редактор форм в режиме предприятия):


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

Здесь мы использовали стандартный параметр Отбор. Платформа 1С автоматически применяет структуру отбора к динамическому списку формы выбора, если ключи структуры совпадают с именами полей в списке. Это мощный инструмент, позволяющий гибко управлять интерфейсом без программирования внутри справочников.

Альтернативный метод: ОписаниеОповещения

В некоторых случаях выбор инициируется не из конкретного поля ввода, а, например, из команды или кнопки в меню. В этом случае у нас нет «Элемента», который можно назначить владельцем. Тогда на помощь приходит механизм оповещений. Разберем по шагам этот подход:


&НаКлиенте
Процедура ВыполнитьВыборПрограммно()
    // Создаем описание оповещения, указывая процедуру, которая примет результат
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораКонтрагента", ЭтотОбъект);
    
    // Открываем форму в режиме выбора
    ПараметрыВыбора = Новый Структура("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.Элементы);
    
    // Четвертый параметр - Уникальность, пятый - Окно, шестой - ПутьКДанным, седьмой - Оповещение
    ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыВыбора, , , , , Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораКонтрагента(РезультатВыбора, ДополнительныеПараметры) Экспорт
    Если РезультатВыбора <> Неопределено Тогда
        // Обрабатываем результат (это ссылка на контрагента)
        Сообщить("Выбран контрагент: " + РезультатВыбора);
    КонецЕсли;
КонецПроцедуры

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

Рекомендации по оптимизации

При реализации механизмов выбора стоит учитывать несколько важных аспектов:

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

← На главную