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