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