Разработка и Конфигурация · 10 мин
Как вызвать форму выбора в 1С: практическое руководство
Как вызвать форму выбора в 1С: команда ОткрытьФорму, параметры выбора, обработка результата, отборы и типичные ошибки разработчика.
Форма выбора в 1С — это стандартный механизм, который позволяет пользователю подобрать элемент справочника, документа или другого объекта из списка. Программный вызов такой формы нужен, когда стандартного поля ввода недостаточно: например, требуется открыть список с отбором, запретить создание новых элементов или обработать результат выбора особым образом.
В управляемом приложении основной инструмент — метод ОткрытьФорму() с указанием имени формы выбора объекта и структурой параметров. В обычном приложении используется метод ПолучитьФорму() с последующим открытием. Ниже разобраны оба подхода, передача параметров, получение результата и типичные ошибки, из-за которых форма открывается не так, как ожидалось.
Как устроен вызов формы выбора в управляемом приложении
В управляемых формах (такси, 8.3) вызов выполняется на клиенте через глобальный метод ОткрытьФорму(). Минимальный вариант выглядит так: указывается полное имя формы — Справочник.Номенклатура.ФормаВыбора — и форма открывается в режиме выбора, если передан параметр РежимВыбора = Истина или форма вызвана из поля ввода.
Ключевой момент: чтобы форма работала именно как форма выбора (с кнопкой «Выбрать» и возвратом результата), в параметрах нужно передать РежимВыбора со значением Истина. Без этого флага откроется обычный список, и выбор элемента не вернётся в вызывающий код.
&НаКлиенте
Процедура ВыбратьНоменклатуру(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
Третий аргумент ОткрытьФорму() — владелец формы. Если указать текущую форму (ЭтотОбъект), результат выбора придёт в её обработчик ОбработкаВыбора. Это самый простой способ получить выбранное значение без дополнительных оповещений.
Передача параметров: отбор, владелец, запрет создания
Почти все практические задачи сводятся к настройке параметров структуры. Самый частый сценарий — отбор списка по условию. Для этого в параметры добавляется ключ Отбор — структура, где имя свойства совпадает с именем реквизита объекта.
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
Отбор = Новый Структура;
Отбор.Вставить("Владелец", КонтрагентСсылка);
Отбор.Вставить("ПометкаУдаления", Ложь);
ПараметрыФормы.Вставить("Отбор", Отбор);
Кроме отбора полезны и другие стандартные параметры. ЗакрыватьПриВыборе со значением Ложь позволяет выбирать несколько элементов подряд, не открывая форму заново. МножественныйВыбор включает выбор нескольких строк с возвратом массива. ТекущаяСтрока позиционирует список на нужном элементе при открытии.
Если нужно запретить пользователю создавать новые элементы прямо из формы выбора, отбором это не решить — потребуется либо доработка формы, либо проверка прав доступа. Учитывайте это при проектировании: стандартная форма выбора по умолчанию показывает кнопку «Создать».
Включает режим выбора с возвратом результата
Фильтрует список по реквизитам объекта
Форма остаётся открытой после выбора
Позиционирует курсор на указанном элементе
Как получить результат выбора
Через обработчик ОбработкаВыбора
Если форма открыта с владельцем, после выбора у формы-владельца срабатывает событие ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора). В нём проверяют тип значения и присваивают его нужному реквизиту. Способ подходит для простых случаев, когда выбор инициируется из одной формы.
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Номенклатура") Тогда
Объект.Номенклатура = ВыбранноеЗначение;
КонецЕсли;
КонецПроцедуры
Через описание оповещения
Более гибкий вариант — передать в ОткрытьФорму() описание оповещения о закрытии. Тогда результат придёт в указанную процедуру независимо от владельца, что удобно, когда из одной формы вызывается несколько разных списков.
Оповещение = Новый ОписаниеОповещения("ПослеВыбораНоменклатуры", ЭтотОбъект);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, ЭтотОбъект,
, , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
В процедуре-обработчике результат доступен как первый параметр. Обязательно проверяйте его на Неопределено: если пользователь закрыл форму без выбора, значение будет пустым, и присваивание приведёт к очистке реквизита.
- 1Сформируйте структуру параметров с РежимВыбора = Истина
- 2Добавьте Отбор при необходимости фильтрации списка
- 3Вызовите ОткрытьФорму() с именем формы выбора и владельцем
- 4Создайте обработчик ОбработкаВыбора или передайте ОписаниеОповещения
- 5В обработчике проверьте результат на Неопределено и тип значения
Вызов формы выбора в обычном приложении
В обычных формах (режим 8.2 и старые конфигурации) используется другой механизм. Форму получают методом ПолучитьФорму() у менеджера объекта, настраивают и открывают модально методом ОткрытьМодально(). Результат модального открытия возвращается напрямую как значение функции.
ФормаВыбора = Справочники.Номенклатура.ПолучитьФорму("ФормаВыбора", , ЭтотОбъект);
ФормаВыбора.РежимВыбора = Истина;
ФормаВыбора.Отбор.Владелец.Установить(КонтрагентСсылка);
Результат = ФормаВыбора.ОткрытьМодально();
Если Результат <> Неопределено Тогда
Объект.Номенклатура = Результат;
КонецЕсли;
Модальный вызов блокирует интерфейс до закрытия формы, поэтому код после ОткрытьМодально() выполняется только после выбора. Это упрощает логику, но в управляемом приложении модальность запрещена по умолчанию — там используются оповещения.
Управляемое и обычное приложение
Управляемое приложение, асинхронная обработка результата, единственный вариант для веб-клиента
Обычное приложение, синхронный код, не работает в управляемом режиме и веб-клиенте
Когда достаточно штатного выбора без кастомных отборов — программный вызов не нужен
Типичные ошибки при вызове формы выбора
Самая частая проблема — форма открывается, но не возвращает результат. Причина почти всегда в отсутствии параметра РежимВыбора = Истина или в том, что не указан владелец и не передано описание оповещения. Проверяйте оба условия в первую очередь.
Вторая группа ошибок связана с отбором. Если имя реквизита в структуре отбора указано с опечаткой или реквизит не индексирован и недоступен для отбора в динамическом списке, фильтр молча не сработает или вызовет ошибку. Также отбор по ссылочному реквизиту требует передачи именно ссылки, а не строки с наименованием.
Третья типичная ситуация — попытка использовать модальный вызов в управляемом приложении. Если в свойствах конфигурации режим использования модальности установлен в «Не использовать», код с ОткрытьМодально() выдаст ошибку времени выполнения. Переписывайте такие места на оповещения.
Проверка результата и ограничения
После внедрения вызова проверьте три сценария: успешный выбор элемента, закрытие формы без выбора (крестик или Esc) и выбор при активном отборе. Во втором случае реквизит не должен меняться, в третьем — список должен быть отфильтрован сразу при открытии, без лишних действий пользователя.
Учитывайте ограничения платформы. В веб-клиенте и тонком клиенте часть серверных вызовов из обработчиков выбора может быть недоступна — выносите серверную логику в отдельные серверные процедуры. Также помните, что стандартную форму выбора объекта могут переопределять расширения конфигурации: поведение в конкретной базе может отличаться от типового.
Как проверить результат
Ссылка записана в реквизит, форма закрылась
Реквизит пуст или форма не реагирует на выбор
Реквизит сохранил прежнее значение
Реквизит очищается
Список отфильтрован сразу
Показаны все элементы или ошибка отбора
Если задача выходит за рамки стандартных параметров — например, нужен сложный произвольный запрос к данным или нестандартное оформление списка — создайте собственную форму выбора в конфигураторе и назначьте её основной для объекта или вызывайте по точному имени. Это безопаснее, чем дорабатывать типовую форму напрямую: при обновлении конфигурации изменения в типовых объектах могут быть потеряны.
Что важно запомнить
Форма выбора вызывается через ОткрытьФорму() с РежимВыбора = Истина, результат приходит в ОбработкаВыбора или в описание оповещения. Всегда проверяйте результат на Неопределено и используйте ссылки в отборах, а не строки.
Частые вопросы
Как открыть форму выбора с отбором по нескольким условиям?
Добавьте в структуру «Отбор» несколько пар «имя реквизита — значение». Все условия объединяются по логике «И». Если нужна логика «ИЛИ» или отбор по вычисляемому условию, стандартного параметра недостаточно — потребуется собственная форма с настройкой динамического списка.
Почему форма выбора открывается, но выбор не возвращается?
Проверьте три вещи: передан ли параметр РежимВыбора = Истина, указан ли владелец формы или описание оповещения, и есть ли в форме-владельце обработчик ОбработкаВыбора. Чаще всего отсутствует именно параметр РежимВыбора.
Как разрешить выбор нескольких элементов сразу?
Передайте в параметрах МножественныйВыбор = Истина и ЗакрыватьПриВыборе = Ложь. Результатом будет массив выбранных ссылок, который нужно обработать в обработчике выбора — например, добавить все элементы в табличную часть.
Работает ли ОткрытьМодально() в управляемом приложении?
Нет, если в свойствах конфигурации режим модальности установлен в «Не использовать» — а это стандарт для современных конфигураций. Код завершится ошибкой. Используйте ОткрытьФорму() с описанием оповещения о закрытии.
Как открыть форму выбора с позиционированием на текущем элементе?
Передайте в параметрах ключ ТекущаяСтрока со ссылкой на нужный элемент. При открытии курсор списка встанет на эту строку, что удобно при повторном выборе — пользователь видит, что выбрано сейчас.
Можно ли вызвать форму выбора документа так же, как справочника?
Да, механизм идентичен: укажите имя вида «Документ.РеализацияТоваровУслуг.ФормаВыбора» с параметром РежимВыбора. Учтите, что отбор по реквизитам документа работает только по тем полям, которые включены в динамический список формы.