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

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

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

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

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

Работает это одинаково в управляемых и обычных формах, но в управляемом приложении есть особенности: форма создаётся на сервере, обработка параметров выполняется в обработчике ПриСозданииНаСервере, а часть параметров платформа обрабатывает сама, без вашего кода. Понимание того, какие параметры стандартные, а какие произвольные, избавляет от типовых ошибок вроде «параметр передал, а форма его не видит».

Материал рассчитан на конфигурации с управляемым интерфейсом (такой режим используется во всех современных типовых решениях). Примеры кода приведены на встроенном языке 1С и подходят для большинства конфигураций на платформе 8.3.

Общий принцип передачи параметров

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

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

bsl
// Код, открывающий форму
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Организация", ТекущаяОрганизация);
ПараметрыФормы.Вставить("ДатаНачала", НачалоМесяца(ТекущаяДатаСеанса()));

ОткрытьФорму("Обработка.ВыгрузкаДанных.Форма.ФормаНастроек", ПараметрыФормы, ЭтотОбъект);

Чтение параметров внутри формы

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

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

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

	Организация = Неопределено;
	Если Параметры.Свойство("Организация", Организация) Тогда
		ЭтотОбъект.ОрганизацияОтбор = Организация;
	КонецЕсли;

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

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

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

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

ПараметрГде применяетсяЧто делает
КлючФорма объектаСсылка на открываемый объект
ОтборФорма спискаСтруктура отбора динамического списка
ЗначенияЗаполненияФорма нового объектаЗначения реквизитов при создании
ЗначениеКопированияФорма объектаСсылка-источник для копирования
РежимВыбораФорма спискаОткрытие в режиме выбора
ТекущаяСтрокаФорма спискаПозиционирование на указанной ссылке

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

bsl
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Владелец", КонтрагентСсылка));

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

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

Открытие формы с отбором и предзаполнением: пошагово

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

Порядок действий
  1. 1
    Определите полное имя формы: ИмяОбъектаМетаданных + точка + имя формы, например Справочник.Номенклатура.Форма.ФормаСписка
  2. 2
    Создайте структуру и добавьте стандартный параметр Отбор или ЗначенияЗаполнения с нужными значениями
  3. 3
    Вызовите ОткрытьФорму, передав имя формы, структуру параметров и при необходимости владельца формы
  4. 4
    Откройте форму в режиме предприятия и проверьте, что отбор применён или реквизиты заполнены

Параметр «владелец формы» (третий аргумент ОткрытьФорму) часто упускают, хотя он важен: владелец определяет время жизни открытой формы и уникальность. Если владелец закроется, закроется и зависимая форма. Передавайте владельцем текущую форму (ЭтотОбъект) или форму-источник вызова.

Произвольные параметры и возврат результата

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

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

Если форма должна вернуть результат (например, форма выбора периода), открывайте её с описанием оповещения: ОткрытьФорму(..., ОписаниеОповещения), а в форме-источнике обработайте результат в процедуре, указанной в оповещении. Форма возвращает значение методом Закрыть(Результат).

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

Типичные ошибки и их устранение

Большинство проблем с параметрами форм сводится к нескольким повторяющимся ситуациям. Их легко диагностировать, если знать, где искать.

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

Отдельного внимания заслуживает коллизия имён. Если ваша произвольная форма получает параметр с именем Отбор или Ключ, платформа может попытаться применить его по стандартным правилам. Для произвольных данных выбирайте уникальные имена с префиксом, например Настройка_Отбор или Парам_Организация.

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

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

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

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

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

Свойство() возвращает Ложь — проверьте имя ключа в структуре при вызове

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

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

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

Отображаются все записи — проверьте имя поля отбора и тип значения

Значения заполнения подставлены
Норма

Новый объект создан с заполненными реквизитами

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

Реквизиты пустые — имена ключей должны совпадать с именами реквизитов объекта

Ограничения и безопасная работа с параметрами

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

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

FAQ: частые вопросы о передаче параметров в форму 1С

Как передать параметр в форму, открываемую через ПолучитьФорму?

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

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

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

Можно ли передать таблицу значений в форму?

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

Как открыть форму списка с отбором без изменения конфигурации?

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

Что делать, если имя параметра совпадает со стандартным?

Переименуйте произвольный параметр, добавив префикс, например Настройка_Отбор. Имена Отбор, Ключ, ЗначенияЗаполнения и подобные зарезервированы платформой, и она попытается обработать их по своим правилам, что приведёт к ошибке или неожиданному поведению.

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

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

Итог

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

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