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

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

Как открыть форму в режиме выбора в 1С

Как открыть форму выбора в 1С: ОткрытьФорму, параметры РежимВыбора и МножественныйВыбор, обработка выбора, отборы, типичные ошибки и готовые примеры кода.

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

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

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

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

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

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

ОткрытьФорму с оповещением

Рекомендуемый способ. Работает при запрете модальности, совместим с веб-клиентом. Требует описания отдельной процедуры-обработчика оповещения.

ОткрытьФормуМодально

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

Стандартная кнопка выбора поля ввода

Не требует кода, автоматически передаёт владельца и отбор по свойствам связей параметров выбора. Гибкость ограничена настройками поля.

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

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

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

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("РежимВыбора", Истина);
	ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);

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

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

Ключевой параметр — РежимВыбора со значением Истина. Он переводит форму списка в состояние выбора: активируется команда «Выбрать», двойной щелчок по строке трактуется как выбор, а при закрытии формы владельцу отправляется выбранное значение. Параметр ЗакрыватьПриВыборе управляет тем, закроется ли форма после выбора элемента.

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

Обработка результата выбора

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

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

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

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

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

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

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

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

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

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

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

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

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

Отборы, множественный выбор и другие параметры

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

bsl
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("МножественныйВыбор", Истина);
ПараметрыФормы.Вставить("Отбор", Новый Структура("ПометкаУдаления", Ложь));

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

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

Открытие формы выбора из поля ввода и связи параметров

Если задача — заменить поведение стандартной кнопки выбора у поля ввода, используют событие поля НачалоВыбора. Внутри обработчика устанавливают СтандартнаяОбработка = Ложь и открывают свою форму, передавая владельцем сам элемент. Тогда результат автоматически попадёт в поле, а событие ОбработкаВыбора у формы можно не реализовывать.

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

Порядок действий при программном открытии
  1. 1
    Определите имя формы выбора: основная форма объекта или своя форма в конфигураторе
  2. 2
    Сформируйте структуру параметров: РежимВыбора, при необходимости Отбор и МножественныйВыбор
  3. 3
    Вызовите ОткрытьФорму, указав владельца — поле ввода или форму
  4. 4
    Если владелец — форма, реализуйте ОбработкаВыбора или передайте ОписаниеОповещения
  5. 5
    Проверьте результат на Неопределено перед использованием
  6. 6
    Протестируйте открытие, выбор и отказ от выбора в тонком и веб-клиенте

Типичные ошибки и ограничения

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

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

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

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

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

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

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

Нажатие «Выбрать» в открытой форме
Норма

Значение подставляется в поле или обработчик получает ссылку

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

Форма закрывается, но реквизит не заполняется — нет владельца или обработчика

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

Реквизит остаётся без изменений, ошибок нет

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

Возникает ошибка или реквизит очищается — нет проверки на Неопределено

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

Список сразу отфильтрован, отбор виден в панели отбора

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

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

Итог

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

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

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

Чем отличается открытие формы списка от открытия формы выбора?

Форма списка предназначена для просмотра и редактирования данных, а форма выбора — для подстановки значения. Если открыть форму списка с параметром РежимВыбора = Истина, она поведёт себя как форма выбора: появится команда «Выбрать», а результат вернётся владельцу. Отдельная форма выбора в конфигураторе нужна, когда требуется особый состав колонок или упрощённый интерфейс.

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

В структуру Отбор поместите массив или фиксированный массив значений: Новый Структура("ВидНоменклатуры", МассивВидов). Платформа сформирует условие «В списке». Для более сложных условий (диапазоны, сравнения) придётся программно настраивать отбор динамического списка в обработчике ПриСозданииНаСервере самой формы выбора.

Почему ОбработкаВыбора не срабатывает?

Чаще всего при открытии формы не указан владелец — третий параметр ОткрытьФорму. Без владельца платформе некому отправить результат. Также проверьте, что форма выбора действительно закрывается с результатом (вызов Закрыть(Значение) или стандартная команда выбора), а не просто закрывается.

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

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

Как разрешить выбор и групп, и элементов в иерархическом справочнике?

Передайте параметр ВыборГруппИЭлементов со значением ГруппыИЭлементы (перечисление ИспользованиеГруппИЭлементов). По умолчанию во многих формах выбора доступны только элементы, и попытка выбрать группу будет заблокирована.

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

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