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