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

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

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

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

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

Основной инструмент — метод глобального контекста ОткрытьФорму() (в управляемом приложении) или метод формы Открыть()/ОткрытьМодально() (в обычном приложении). Параметры передаются структурой, а принимаются в обработчике ПриСозданииНаСервере() через свойство Параметры. Ниже разобраны рабочие примеры кода, типовые сценарии и ошибки, из-за которых параметр «теряется» по дороге.

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

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

Важно понимать: параметры доступны только на этапе создания формы. В обработчике ПриОткрытии() объект Параметры уже недоступен в полном объёме — поэтому все значения, которые понадобятся позже, нужно в ПриСозданииНаСервере() сохранить в реквизиты формы. Это самая частая причина «пропавших» параметров у начинающих разработчиков.

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

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

&НаКлиенте

Процедура ПодборНажатие(Команда)

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

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

ПараметрыПодбора.Вставить("Склад", Объект.Склад);

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

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

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

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

Код приёма в открываемой форме:

&НаСервере

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

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

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

КонецЕсли;

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

СкладОтбор = Параметры.Склад;

КонецЕсли;

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

РежимПодбора = Параметры.РежимПодбора;

КонецЕсли;

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

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

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

Стандартные параметры, которые платформа обрабатывает сама

Часть ключей структуры параметров зарезервирована платформой. Если передать их, форма объекта отработает автоматически, без единой строки кода в ПриСозданииНаСервере:

  • Ключ — ссылка на объект, который нужно открыть для редактирования;
  • ЗначениеКопирования — ссылка на объект, с которого создаётся копия;
  • Отбор — структура отбора для динамического списка формы выбора или формы списка;
  • ЗначенияЗаполнения — структура значений реквизитов для нового объекта;
  • РежимВыбора — открывает форму списка в режиме выбора;
  • ТекущаяСтрока — ссылка, на которую нужно спозиционировать список.

Пример: открыть форму выбора контрагента с отбором по признаку «поставщик» и запретом изменения отбора пользователем:

Отбор = Новый Структура("ЭтоПоставщик", Истина);

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

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

Третий аргумент — владелец формы. Если передать элемент поля ввода, платформа после выбора сама подставит результат в это поле. Если передать ЭтотОбъект, результат придёт через оповещение или обработку выбора.

Передача параметров в обычных формах

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

ФормаПодбора = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаПодбора",

Новый Структура("Склад", Склад), ЭтотОбъект);

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

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

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

Передача параметра — половина задачи; обычно форма должна что-то вернуть. В управляемом приложении для этого используют оповещения. При открытии передают описание оповещения, а форма-источник при закрытии вызывает ОповеститьОВыборе() или возвращает значение через Закрыть(Результат):

&НаКлиенте

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

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

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

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

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

&НаКлиенте

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

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

Объект.Контрагент = Результат;

КонецЕсли;

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

Альтернатива — обработчик ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) в форме-владельце: он срабатывает, когда дочерняя форма вызывает ОповеститьОВыборе(). Оба подхода рабочие; оповещения гибче, потому что позволяют передать дополнительные параметры контекста.

Сравнение вариантов возврата результата

ОписаниеОповещения

Подходит для любых сценариев, позволяет передать дополнительные параметры и обработать отказ от выбора. Требует экспортной процедуры-обработчика.

ОбработкаВыбора

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

Модальное открытие (Закрыть с результатом)

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

Ограничения и типичные ошибки

Не все типы данных можно передать через параметры формы. Структура параметров сериализуется, поэтому в ней нельзя передавать несериализуемые объекты: ТабличныйДокумент, COMОбъект, открытые транзакции, объекты типа Запрос с установленными параметрами. Ссылки, примитивные типы, структуры, массивы, таблицы значений (через помещение во временное хранилище) — передаются нормально.

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

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

Проверка результата и отладка

Быстрый способ убедиться, что параметр дошёл: поставить точку останова в ПриСозданииНаСервере открываемой формы и в окне «Вычислить выражение» посмотреть содержимое Параметры. Там видны и переданные вами ключи, и стандартные параметры, добавленные платформой.

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

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

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

Значение в отладчике
Норма

В объекте Параметры виден ключ с ожидаемым значением

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

Ключа нет или значение Неопределено — ошибка на стороне вызывающего кода

Повторное открытие формы
Норма

Каждый вызов создаёт форму с новыми параметрами

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

Активируется старая форма — задайте уникальный ключ уникальности, например Новый УникальныйИдентификатор

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

Отбор применён к списку, Ключ открыл нужный объект

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

Параметр проигнорирован — проверьте точное написание имени ключа

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

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

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

Почему параметр виден в ПриСозданииНаСервере, но пропадает в ПриОткрытии?

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

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

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

Чем ОткрытьФормуМодально отличается от ОткрытьФорму с блокировкой владельца?

ОткрытьФормуМодально останавливает выполнение кода до закрытия формы и возвращает результат напрямую, но не работает в ряде клиентов и считается устаревшим подходом. Режим БлокироватьОкноВладельца с описанием оповещения — рекомендуемая замена: интерфейс блокируется так же, но код остаётся асинхронным.

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

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

Итог

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

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