К статье
Практический материал

Разработка и Конфигурация · 10 мин

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

Практическое руководство: как получить выбранное значение из формы выбора в 1С через ОбработкаВыбора, ОповеститьОВыборе и модальный вызов. Примеры кода и типичные ошибки.

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

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

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

Как устроен механизм выбора значения в 1С

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

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

Получение значения через ОбработкаВыбора

Это базовый способ, который срабатывает при стандартном открытии формы выбора платформой. В модуле формы-владельца объявляется обработчик ОбработкаВыбора, и платформа сама передаёт туда результат:

&НаКлиенте

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Номенклатура") Тогда

Объект.Номенклатура = ВыбранноеЗначение;

Модифицированность = Истина;

КонецЕсли;

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

Обязательно проверяйте тип пришедшего значения: обработчик вызывается при любом выборе в любом поле формы, и без проверки можно записать в реквизит ссылку не того объекта. Если полей выбора несколько, дополнительно анализируйте параметр ИсточникВыбора — он содержит форму, из которой пришёл выбор.

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

Получение значения через описание оповещения при ОткрытьФорму

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

&НаКлиенте

Процедура ПодобратьКонтрагента(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеВыбораКонтрагента", ЭтотОбъект);

ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", , ЭтотОбъект, , , , Оповещение);

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

&НаКлиенте

Процедура ПослеВыбораКонтрагента(Результат, ДополнительныеПараметры) Экспорт

Если Результат = Неопределено Тогда

Возврат; // пользователь закрыл форму без выбора

КонецЕсли;

Объект.Контрагент = Результат;

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

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

Процедура-обработчик обязательно должна быть объявлена с ключевым словом Экспорт и находиться в контексте, указанном при создании описания оповещения (в примере — ЭтотОбъект, то есть модуль текущей формы). Без Экспорт платформа не сможет её вызвать.

Порядок действий
  1. 1
    Создайте описание оповещения с именем процедуры-обработчика и контекстом
  2. 2
    Откройте форму выбора методом ОткрытьФорму, передав оповещение параметром
  3. 3
    В обработчике проверьте результат на Неопределено
  4. 4
    Присвойте значение реквизиту и выполните связанную логику
  5. 5
    Проверьте сценарий закрытия формы без выбора

Передача результата через ОповеститьОВыборе

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

// В модуле формы подбора

&НаКлиенте

Процедура ПеренестиВДокумент(Команда)

Результат = Новый Структура;

Результат.Вставить("Товары", СобратьВыбранныеСтроки());

ОповеститьОВыборе(Результат);

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

Преимущество подхода — можно передавать не только ссылку, но и произвольную структуру: массив строк, количество, цены. Метод ОповеститьОВыборе по умолчанию закрывает форму после оповещения; если нужно оставить её открытой для продолжения подбора, используйте Оповестить с собственным именем события и обработчиком ОбработкаОповещения на стороне владельца.

Сравнение вариантов

ОбработкаВыбора

Подходит для стандартного выбора через поле ввода; не требует кода открытия, но ограничен сценариями платформы

Описание оповещения

Оптимален при программном открытии формы; даёт явный обработчик результата, требует проверки на Неопределено

ОповеститьОВыборе

Нужен для нестандартных форм подбора и передачи структур; требует кода в обеих формах

Открытие формы выбора с отбором и параметрами

На практике форму выбора почти всегда открывают с ограничениями: только действующие контрагенты, только товары из конкретной группы. Отбор передаётся через структуру параметров:

&НаКлиенте

Процедура ВыбратьТовар(Команда)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Отбор", Новый Структура("ГруппаТоваров", ТекущаяГруппа));

ПараметрыФормы.Вставить("РежимВыбора", Истина);

Оповещение = Новый ОписаниеОповещения("ПослеВыбораТовара", ЭтотОбъект);

ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора",

ПараметрыФормы, ЭтотОбъект, , , , Оповещение);

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

Параметр РежимВыбора = Истина важен, если открывается обычная форма списка, а не специальная форма выбора: без него двойной клик по строке откроет элемент на редактирование вместо выбора. Для множественного выбора добавьте параметр МножественныйВыбор = Истина — тогда в результат придёт массив ссылок, и обработчик должен уметь его обходить.

Если отбор должен быть недоступен для снятия пользователем, используйте фиксированные настройки динамического списка в форме выбора, а не просто параметр «Отбор» — иначе пользователь сможет отключить ограничение и выбрать неподходящий элемент.

Проверка результата и типичные ошибки

После получения значения его нужно валидировать. Минимальный набор проверок: значение не Неопределено, тип соответствует ожидаемому, ссылка не битая (для случаев, когда объект мог быть удалён между выбором и записью). При множественном выборе дополнительно проверяйте, что массив не пуст.

Типичные ошибки
01
Нет проверки на Неопределено — при закрытии формы без выбора реквизит очищается или возникает ошибка
02
Процедура-обработчик объявлена без Экспорт — оповещение не срабатывает, значение теряется молча
03
Не передан РежимВыбора при открытии формы списка — двойной клик открывает элемент вместо выбора
04
ОбработкаВыбора без проверки типа — в реквизит записывается ссылка не того объекта при выборе в другом поле
05
Обращение к серверным данным выбранного объекта из клиентского обработчика без вызова сервера — ошибка контекста

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

Контрольные точки

Как проверить результат

Выбор значения в поле
Норма

Реквизит заполнен выбранной ссылкой, форма помечена модифицированной

Тревожный признак

Поле осталось пустым или заполнилось значением другого типа

Закрытие формы без выбора
Норма

Реквизит сохранил прежнее значение

Тревожный признак

Реквизит очистился

Множественный выбор
Норма

В табличную часть добавлены все выбранные строки

Тревожный признак

Добавилась только одна строка или возникла ошибка обращения к массиву

Часто задаваемые вопросы

Почему ОбработкаВыбора не вызывается после выбора значения?

Чаще всего форма выбора открыта программно без указания владельца и без описания оповещения. Проверьте, что в ОткрытьФорму передан ЭтотОбъект как владелец формы либо отдельное описание оповещения. Также убедитесь, что обработчик объявлен именно в модуле формы-владельца, а не в общем модуле.

Как получить несколько выбранных значений сразу?

Передайте в форму выбора параметр МножественныйВыбор = Истина. В результат придёт массив ссылок. В обработчике обойдите массив циклом и добавьте каждое значение в табличную часть, предварительно проверив, что результат не Неопределено и массив не пуст.

Можно ли получить выбранное значение без закрытия формы подбора?

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

Что приходит в результат, если пользователь закрыл форму без выбора?

В обработчик описания оповещения приходит Неопределено. Обработчик ОбработкаВыбора в этом случае вообще не вызывается. Всегда делайте проверку на Неопределено перед присваиванием, чтобы не затереть уже введённые данные.

Как передать вместе со ссылкой дополнительные данные, например цену?

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

Итог

Что важно запомнить

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