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

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

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

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

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

В управляемом приложении (режим «Такси») основной инструмент — метод ОткрытьФорму() с передачей параметров и описанием оповещения о закрытии. В обычном приложении используется модальный вызов ПолучитьФорму().ОткрытьМодально() или обработчик НачалоВыбора. Смешивать эти подходы нельзя: код, написанный для обычных форм, в управляемом приложении просто не сработает или выдаст ошибку.

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

Какие способы открыть форму выбора существуют

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

Дополнительно существуют вспомогательные методы: ПоказатьВыборИзСписка() для простого выбора из готового списка значений и ВвестиЗначение() для обычного приложения. Они не открывают полноценную форму выбора, но закрывают простые сценарии без написания кода формы.

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

Стандартное поле ввода

Подходит, когда достаточно типового выбора без особых отборов; настройка через свойства поля, кода почти нет.

ОткрытьФорму() с параметрами

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

ПоказатьВыборИзСписка()

Для выбора из небольшого заранее известного списка значений; не подходит для больших справочников.

Собственная форма подбора

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

Открытие формы выбора через ОткрытьФорму

Базовый синтаксис выглядит так: ОткрытьФорму(ИмяФормы, Параметры, Владелец, Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещения, РежимОткрытия). Имя формы формируется по шаблону Справочник.ИмяСправочника.ФормаВыбора. Для документов, планов видов характеристик и других ссылочных типов шаблон аналогичен.

Минимальный рабочий пример — открыть форму выбора справочника «Номенклатура» и получить результат в процедуре-обработчике:

&НаКлиенте

Процедура ВыбратьНоменклатуру(Команда)

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

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

ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте

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

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

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

КонецЕсли;

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

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

Порядок действий
  1. 1
    Определите имя формы: Справочник.<Имя>.ФормаВыбора или Документ.<Имя>.ФормаВыбора
  2. 2
    Создайте структуру параметров и при необходимости добавьте Отбор
  3. 3
    Сформируйте ОписаниеОповещения с именем процедуры-обработчика
  4. 4
    Вызовите ОткрытьФорму с параметрами и режимом открытия
  5. 5
    В обработчике проверьте Результат на Неопределено и запишите выбранное значение
  6. 6
    Протестируйте сценарий отмены выбора — поле не должно очищаться

Передача параметров: отбор, режимы, начальное значение

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

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

Отбор = Новый Структура;

Отбор.Вставить("Родитель", ГруппаТоваров);

Отбор.Вставить("ПометкаУдаления", Ложь);

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

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

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

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

ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущаяНоменклатура);

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

Полезные стандартные параметры формы выбора: РежимВыбора — форма открывается именно для выбора, а не просмотра; ЗакрыватьПриВыборе — форма закрывается после одного выбора (для подбора нескольких позиций ставьте Ложь); МножественныйВыбор — разрешает выбрать несколько элементов, тогда результат придёт массивом; ТекущаяСтрока — позиционирует список на указанном элементе.

Обработка результата и множественный выбор

Результат выбора зависит от режима. При одиночном выборе в обработчик оповещения приходит ссылка на выбранный элемент. При множественном выборе (МножественныйВыбор = Истина) приходит массив ссылок. Если форма закрыта крестиком или клавишей Esc без выбора — приходит Неопределено.

Типовая обработка множественного выбора с заполнением табличной части:

&НаКлиенте

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

Если ТипЗнч(Результат) = Тип("Массив") Тогда

Для Каждого Элемент Из Результат Цикл

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = Элемент;

КонецЦикла;

КонецЕсли;

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

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

Типичные ошибки
01
Обработчик оповещения без Экспорт — платформа не находит процедуру, выбор не срабатывает
02
Нет проверки на Неопределено — отмена выбора очищает ранее заполненное поле
03
Использование ОткрытьМодально() в управляемом приложении — режим модальности запрещён или заблокирован настройками
04
Отбор по несуществующему полю — ошибка при открытии формы
05
Ожидание ссылки при включённом множественном выборе — приходит массив, и присвоение ломается

Выбор через стандартное поле ввода и событие НачалоВыбора

Если форма выбора нужна для поля ввода на вашей форме, часто достаточно штатного механизма: поле со ссылочным типом само показывает кнопку выбора. Настроить поведение можно без кода — через свойства поля: «КнопкаВыбора», «БыстрыйВыбор», «ВыборГруппИЭлементов», «СвязиПараметровВыбора» для связанных отборов (например, договор только по выбранному контрагенту).

Когда стандартного поведения мало, используют событие поля НачалоВыбора. Внутри него можно установить СтандартнаяОбработка = Ложь и открыть свою форму выбора с любыми параметрами:

&НаКлиенте

Процедура ДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

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

ПараметрыФормы.Вставить("Отбор", Новый Структура("Владелец", Объект.Контрагент));

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

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

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

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

Здесь важно передать владельцем само поле (Элемент) — тогда при выборе значение корректно попадёт в данные формы. Связи параметров выбора во многих случаях позволяют добиться того же результата вообще без кода, поэтому сначала проверьте, нельзя ли решить задачу настройкой.

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

Открытие формы выбора в обычном приложении

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

ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора(, Элемент);

ФормаВыбора.Отбор.Родитель.Установить(ГруппаТоваров);

Результат = ФормаВыбора.ОткрытьМодально();

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

Номенклатура = Результат;

КонецЕсли;

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

Проверка результата и отладка

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

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

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

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

Выбор элемента
Норма

Значение попало в поле, форма закрылась

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

Поле пустое или ошибка «процедура не обнаружена»

Отмена выбора (Esc, крестик)
Норма

Поле сохранило прежнее значение

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

Поле очистилось — нет проверки на Неопределено

Отбор
Норма

Список показывает только нужные элементы

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

Ошибка при открытии или полный список без фильтра

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

Все отмеченные элементы добавлены массивом

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

Добавился только один элемент или ошибка типа

Частые вопросы

Как открыть форму выбора с отбором по нескольким условиям?

Добавьте в структуру отбора несколько ключей: Отбор.Вставить("Родитель", Группа); Отбор.Вставить("ПометкаУдаления", Ложь). Все условия объединяются по «И». Для сложных условий (ИЛИ, сравнения) используйте произвольный запрос в динамическом списке собственной формы выбора.

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

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

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

Передайте в параметрах формы стандартный параметр, отключающий создание, либо откройте форму в режиме только выбора через РежимВыбора = Истина — во многих типовых формах при этом команды создания скрываются. Надёжный вариант — собственная форма выбора без кнопки «Создать».

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

Передайте параметр МножественныйВыбор = Истина. В обработчик оповещения придёт массив ссылок. Проверяйте тип результата через ТипЗнч(Результат) = Тип("Массив") и обрабатывайте каждый элемент в цикле.

Можно ли открыть форму выбора на сервере?

Нет. Открытие любых форм — исключительно клиентская операция, выполняется в контексте &НаКлиенте. Серверные процедуры могут только подготовить данные (например, рассчитать параметры отбора), а сам вызов ОткрытьФорму делается на клиенте.

Чем заменить ОткрытьМодально при переходе на управляемые формы?

Используйте ОткрытьФорму с ОписаниемОповещения: логика после выбора переносится в отдельную экспортную процедуру-обработчик. Линейный код «открыл — получил результат — продолжил» разбивается на две процедуры.

Итог

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

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