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