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

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

Как передать параметры при открытии формы в 1С

Как передать параметры при открытии формы в 1С: ОткрытьФорму, структура параметров, ПриСозданииНаСервере, обработка значений и типичные ошибки разработчика.

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

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

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

Основной способ открыть форму в управляемом приложении — глобальный метод ОткрытьФорму(). Его упрощённая сигнатура выглядит так: ОткрытьФорму(ИмяФормы, Параметры, Владелец, Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна). Второй аргумент — это и есть структура с параметрами.

Структура формируется встроенным конструктором Новый Структура(), где имена ключей перечисляются строкой через запятую, а значения следуют в том же порядке:

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

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

ПараметрыФормы.Вставить("Организация", ТекущаяОрганизация);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаСписка",

ПараметрыФормы, ЭтотОбъект);

Имя формы задаётся строкой по шаблону ИмяОбъекта.Форма.ИмяФормы, например "Справочник.Номенклатура.Форма.ФормаЭлемента" или "Обработка.ЗагрузкаДанных.Форма" для основной формы обработки. Если указать только "Справочник.Номенклатура.ФормаВыбора" — платформа откроет соответствующую стандартную форму.

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

Как читать параметры на стороне открываемой формы

Внутри открываемой формы переданные значения доступны через свойство Параметры. Первым срабатывает серверный обработчик ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) — именно здесь принято разбирать параметры, потому что в этот момент можно влиять на реквизиты формы, отборы и даже отменить открытие, установив Отказ = Истина.

Типовой код обработки выглядит так:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("Контрагент") Тогда

ОтборКонтрагент = Параметры.Контрагент;

// дальнейшая логика: установка отбора, заполнение реквизитов

КонецЕсли;

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

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

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

Порядок передачи и чтения параметра
  1. 1
    Сформируйте структуру: Новый Структура с нужными ключами и значениями
  2. 2
    Вызовите ОткрытьФорму с именем формы и этой структурой
  3. 3
    В модуле открываемой формы добавьте ПриСозданииНаСервере
  4. 4
    Проверьте ключ через Параметры.Свойство() и примените значение
  5. 5
    Протестируйте открытие формы из всех точек вызова, включая стандартное открытие без параметров

Стандартные параметры: отбор списка и заполнение нового объекта

Платформа резервирует ряд имён параметров, которые формы понимают без дополнительного кода. Два самых востребованных — Отбор для форм списков и ЗначенияЗаполнения для форм новых объектов.

Отбор в форме списка

Чтобы открыть список, уже отфильтрованный по контрагенту или организации, передайте ключ Отбор со вложенной структурой:

Отбор = Новый Структура("Контрагент", СсылкаНаКонтрагента);

ПараметрыФормы = Новый Структура("Отбор", Отбор);

ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.ФормаСписка", ПараметрыФормы);

Отбор по полю сработает только если это поле доступно для отбора в динамическом списке. Для нестандартных отборов (по периоду, по условию «в списке») стандартного параметра недостаточно — придётся программно настраивать Список.Отбор в ПриСозданииНаСервере.

Заполнение нового объекта

Параметр ЗначенияЗаполнения позволяет открыть форму нового документа или элемента справочника с уже заполненными реквизитами:

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Организация", ТекущаяОрганизация);

ЗначенияЗаполнения.Вставить("Склад", ОсновнойСклад);

ОткрытьФорму("Документ.ПеремещениеТоваров.ФормаОбъекта",

Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения));

Дополнительно существует параметр Основание — ссылка на объект-основание, если у документа настроено ввод на основании. Платформа сама вызовет обработчик ОбработкаЗаполнения модуля объекта. Ещё один полезный стандартный ключ — Ключ: ссылка на существующий объект, форму которого нужно открыть.

Сравнение стандартных параметров

Отбор

Фильтрует динамический список при открытии. Работает только для форм списков и только по отбираемым полям.

ЗначенияЗаполнения

Заполняет реквизиты нового объекта. Не влияет на существующие объекты и не отменяет ОбработкуЗаполнения.

Основание

Запускает механизм ввода на основании через ОбработкуЗаполнения. Требует, чтобы тип основания был указан в свойствах объекта.

Ключ

Открывает форму конкретной существующей ссылки. Без него форма объекта откроется для нового элемента.

Передача собственных (нестандартных) параметров

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

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

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

ПараметрыФормы.Вставить("СкладПоУмолчанию", Склад);

ОткрытьФорму("Обработка.РабочееМестоКладовщика.Форма", ПараметрыФормы);

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

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

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

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

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

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

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

Процедура ПослеВыбораКонтрагента(Результат, ДополнительныеПараметры) получит значение, которое форма передала в Закрыть(Значение). Режим БлокироватьОкноВладельца делает форму модальной относительно родителя — пользователь не сможет вернуться к исходной форме, пока не закроет выбор.

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

Обычное приложение: чем отличается передача параметров

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

Форма = Обработки.МояОбработка.ПолучитьФорму("Форма");

Форма.ПараметрРежим = "Загрузка"; // экспортная переменная формы

Форма.Открыть();

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

Типичные ошибки и как их диагностировать

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

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

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

Типичные ошибки
01
Опечатка в имени ключа структуры — параметр молча игнорируется без ошибки
02
Чтение Параметры.Ключ без проверки Свойство() — исключение при открытии формы из другого места
03
Передача несериализуемого объекта (ТабличныйДокумент, объект ДокументОбъект) — ошибка при открытии
04
Использование ОткрытьМодально в тонком или веб-клиенте вместо ОписаниеОповещения
05
Отбор по полю, недоступному для отбора в динамическом списке — фильтр не применяется
06
Хранение переданного значения только в Параметры вместо копирования в реквизит формы
Контрольные точки

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

Параметр дошёл до формы
Норма

В ПриСозданииНаСервере Параметры.Свойство() возвращает Истина

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

Ключ отсутствует — проверяйте имя и точку вызова ОткрытьФорму

Отбор списка применён
Норма

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

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

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

Заполнение нового объекта
Норма

Реквизиты нового документа заполнены переданными значениями

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

Поля пустые — проверьте ключ ЗначенияЗаполнения и ОбработкуЗаполнения

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

Можно ли передать параметры в уже открытую форму?

Напрямую через ОткрытьФорму — нет: если форма с тем же ключом уникальности уже открыта, платформа просто активирует её. Для передачи данных в существующую форму используйте Оповестить() с обработчиком ОбработкаОповещения на стороне формы-приёмника.

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

Таблица значений не сериализуется для передачи в параметрах. Стандартный приём — на сервере поместить её во временное хранилище через ПоместитьВоВременноеХранилище(), а в форму передать полученный адрес строкой. В ПриСозданииНаСервере форма извлекает данные по адресу через ПолучитьИзВременногоХранилища().

Почему параметр Отбор не фильтрует список?

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

Чем отличается Ключ от Основания при открытии формы документа?

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

Доступны ли параметры формы после её создания, в середине работы?

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

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

Передайте в параметрах стандартные ключи формы выбора, например РежимВыбора = Истина, а признак запрета добавления обработайте в ПриСозданииНаСервере формы выбора, отключив соответствующие команды. Конкретный набор стандартных параметров зависит от типа объекта и настроек формы.

Итог

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

Параметры передаются структурой через второй аргумент ОткрытьФорму и читаются в ПриСозданииНаСервере через Параметры.Свойство(). Стандартные ключи Отбор, ЗначенияЗаполнения, Основание и Ключ решают большинство задач без дополнительного кода. Для возврата результата используйте ОписаниеОповещения, для больших данных — временное хранилище.