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