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