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

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

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

Разбираем способы передачи данных в открываемую форму 1С: параметры формы, ОткрытьФорму(), структуры, оповещения о выборе. Примеры кода и типичные ошибки.

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

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

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

Как работает передача параметров при открытии формы

Метод ОткрытьФорму() принимает имя формы и вторым параметром — структуру с произвольными данными. Эти данные попадают в открываемую форму как её параметры и доступны в обработчике ПриСозданииНаСервере через коллекцию Параметры.

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

Ключ уникальности — третий параметр ОткрытьФорму(). Если передать туда, например, ссылку на объект, повторный вызов с тем же ключом не создаст дубликат формы, а просто покажет уже открытую. Это удобно, но иногда мешает: когда нужно открыть несколько форм с разными параметрами, ключ уникальности должен различаться.

Базовый пример: передача структуры параметров

Самый частый сценарий — передать несколько значений в форму обработки или документа. В вызывающем коде формируется структура, в открываемой форме она читается в ПриСозданииНаСервере.

&НаКлиенте

Процедура ОткрытьПодбор(Команда)

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

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

ПараметрыФормы.Вставить("ДатаНачала", НачалоМесяца(ТекущаяДата()));

ПараметрыФормы.Вставить("РежимВыбора", Истина);

ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма", ПараметрыФормы, ЭтотОбъект);

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

В модуле открываемой формы параметры обрабатываются так:

&НаСервере

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

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

ОрганизацияОтбор = Параметры.Организация;

КонецЕсли;

Если Параметры.Свойство("РежимВыбора") И Параметры.РежимВыбора Тогда

Элементы.Список.РежимВыбора = Истина;

КонецЕсли;

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

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

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

Стандартные параметры: Ключ, Отбор и ЗначенияЗаполнения

Для форм объектов и списков платформа резервирует ряд стандартных параметров. Их не нужно объявлять вручную — они обрабатываются автоматически.

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

&НаКлиенте

Процедура ОткрытьСписокПоКонтрагенту(Команда)

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

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

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

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

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

Возврат данных из открытой формы: оповещения о выборе

Передача данных «в обратную сторону» — из открытой формы в вызвавшую — делается через механизм оповещений. При открытии формы передаётся ОписаниеОповещения с указанием процедуры-обработчика, а в открываемой форме результат возвращается методом ОповеститьОВыборе() или Закрыть(Результат).

&НаКлиенте

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

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

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

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

ПараметрыФормы, ЭтотОбъект, , , , Оповещение);

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

&НаКлиенте

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

Если Результат <> Неопределено Тогда

Номенклатура = Результат;

КонецЕсли;

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

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

Для множественного подбора (когда форма не закрывается после каждого выбора) используйте ОповеститьОВыборе(Значение) в форме подбора и обработчик ОбработкаВыбора в вызвавшей форме — так форма подбора остаётся открытой, а данные поступают по мере выбора.

Передача больших данных через временное хранилище

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

&НаСервере

Процедура ПодготовитьДанныеНаСервере()

ТаблицаРезультатов = СформироватьТаблицу();

АдресХранилища = ПоместитьВоВременноеХранилище(

ТаблицаРезультатов, УникальныйИдентификатор);

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

В открываемой форме данные извлекаются методом ПолучитьИзВременногоХранилища(Адрес). Второй параметр ПоместитьВоВременноеХранилище — уникальный идентификатор формы — привязывает время жизни хранилища к форме: пока форма жива, данные доступны.

Ограничение: данные хранилища живут на сервере и потребляют память сеанса. Если открывается много форм с тяжёлыми данными и они не закрываются, память сервера растёт. После использования данные стоит удалять через УдалитьИзВременногоХранилища(Адрес), если они больше не нужны.

Сравнение способов передачи данных

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

СпособНаправлениеПодходящие данныеОграничения
Параметры формы (структура)В открываемую формуПростые типы, ссылки, структурыТолько при создании формы, сериализуемые типы
Стандартные параметры (Ключ, Отбор)В открываемую формуСсылки, отборы списковТолько для предусмотренных платформой сценариев
ОписаниеОповещения + Закрыть()Из формы обратноРезультат выбора, структураОдин результат при закрытии
ОповеститьОВыбореИз формы обратноМножественный подборНужен обработчик ОбработкаВыбора
Временное хранилищеВ обе стороныТаблицы значений, большие объёмыРасход памяти сервера, нужна очистка
Типичные ошибки
01
Обращение к Параметры.Имя без проверки Свойство() — форма падает при открытии без этого параметра
02
Передача данных через глобальные переменные модуля вместо параметров — ломается при параллельной работе и мешает тестированию
03
Ожидание, что ЗначенияЗаполнения заполнят существующий объект, открытый по Ключу
04
Передача таблицы значений напрямую в параметрах вместо временного хранилища — ошибка сериализации или потеря данных
05
Отсутствие обработки Неопределено в оповещении о закрытии — ошибка при отмене выбора пользователем

Особые сценарии и уточнения

Передача данных в уже открытую форму

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

Явное объявление параметров в конфигураторе

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

Расширения и чужие формы

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

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

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

Форма открывается
Норма

Открывается без ошибок, параметры видны в отладчике в ПриСозданииНаСервере

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

Ошибка «Поле объекта не обнаружено» или ошибка сериализации

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

Список показывает только записи по переданному условию

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

Список полный — отбор не применился из-за неверного имени поля

Возврат результата
Норма

Обработчик оповещения срабатывает, данные корректны

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

Обработчик не вызывается или приходит Неопределено при успешном выборе

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

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

Да. Для команды открытия можно определить обработчик ОбработкаКоманды в модуле менеджера объекта и там сформировать параметры. Либо заменить команду интерфейса на свою, в обработчике которой вызывается ОткрытьФорму() с нужной структурой.

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

Параметр — это только входное значение. Платформа не копирует параметры в реквизиты автоматически, кроме стандартных случаев вроде Ключа и ЗначенийЗаполнения. Присвоение реквизитам нужно написать явно в ПриСозданииНаСервере.

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

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

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

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

Можно ли передать данные в форму до её открытия на клиенте без серверного вызова?

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

Итог

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

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