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

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

Как открыть форму обработки в 1С на управляемых формах

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

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

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

Ниже разобраны все основные сценарии: встроенная обработка конфигурации, внешний файл .epf, передача параметров, получение результата через оповещение и открытие формы на сервере. Отдельно рассмотрены ограничения веб-клиента и типовые ошибки.

Базовый синтаксис ОткрытьФорму

Метод ОткрытьФорму() доступен на клиенте в управляемом приложении. Минимальный вызов выглядит так:

ОткрытьФорму("Обработка.МояОбработка.Форма");

Первый параметр — имя формы. Для обработки оно строится по шаблону Обработка.<ИмяОбработки>.Форма.<ИмяФормы>. Если форма одна и является основной, достаточно Обработка.МояОбработка.Форма — платформа сама подставит основную форму объекта.

Полная сигнатура метода включает параметры, владельца, ключ уникальности, окно, описание оповещения о закрытии, режим открытия окна:

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

ПараметрыФормы.Вставить("Организация", ТекущаяОрганизация);

ОткрытьФорму("Обработка.МояОбработка.Форма.ОсновнаяФорма",

ПараметрыФормы,

ЭтотОбъект,

Новый УникальныйИдентификатор,

,

,

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

Открытие формы встроенной обработки из кнопки

Чаще всего форму обработки открывают по команде на форме документа или справочника. Для этого в модуле формы создают клиентскую процедуру-обработчик:

&НаКлиенте

Процедура ЗаполнитьПоОбработке(Команда)

ОткрытьФорму("Обработка.ЗаполнениеТаблицы.Форма", , ЭтотОбъект);

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

Третий параметр — владелец формы. Он важен по двум причинам: открытая форма окажется связанной с родительской (закроется вместе с ней), и в обработке через ЭтотОбъект.ВладелецФормы можно обратиться к реквизитам родительской формы.

Если обработка должна открываться из общей команды, добавьте команду в раздел «Общие команды» конфигуратора, в свойстве «Режим использования параметра» укажите нужный тип, а в модуле команды напишите тот же вызов ОткрытьФорму.

Порядок действий
  1. 1
    Создайте обработку в конфигураторе и добавьте ей основную форму
  2. 2
    В модуле формы-источника добавьте клиентскую процедуру с вызовом ОткрытьФорму
  3. 3
    Укажите полное имя формы: Обработка.Имя.Форма.ИмяФормы
  4. 4
    Передайте владельца и параметры при необходимости
  5. 5
    Запустите режим предприятия и проверьте открытие по кнопке

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

Передача параметров в открываемую форму

Параметры передаются структурой. В открываемой форме они доступны через объект Параметры в обработчике ПриСозданииНаСервере:

&НаСервере

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

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

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

КонецЕсли;

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

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

Получение результата при закрытии

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

&НаКлиенте

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

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

ОткрытьФорму("Обработка.Подбор.Форма", , ЭтотОбъект, , , ,

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

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

&НаКлиенте

Процедура ПослеЗакрытияПодбора(Результат, ДопПараметры) Экспорт

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

// обработка возвращённого значения

КонецЕсли;

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

В открываемой форме результат возвращается методом Закрыть(ЗначениеРезультата). Если форму закрыли крестиком без передачи значения, в обработчик оповещения придёт Неопределено — это нужно учитывать в проверке.

Открытие формы внешней обработки (.epf)

Внешняя обработка не является объектом конфигурации, поэтому её сначала нужно подключить. На сервере получают имя подключённой обработки, затем на клиенте открывают форму:

&НаСервере

Функция ПодключитьВнешнююОбработку(АдресХранилища)

Возврат ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);

КонецФункции

&НаКлиенте

Процедура ОткрытьВнешнюю(Команда)

НачатьПомещениеФайла(Новый ОписаниеОповещения("ПослеПомещения", ЭтотОбъект), , , Истина, УникальныйИдентификаторФормы);

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

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

ОткрытьФорму("ВнешняяОбработка." + ИмяПодключенной + ".Форма");

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

Открытие формы с сервера и в фоновом задании

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

&НаКлиенте

Процедура СформироватьИОткрыть(Команда)

ДанныеДляФормы = ПодготовитьДанныеНаСервере(ПериодОтчета);

ПараметрыФормы = Новый Структура("Данные", ДанныеДляФормы);

ОткрытьФорму("Обработка.Результат.Форма", ПараметрыФормы, ЭтотОбъект);

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

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

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

Особенности веб-клиента и режима совместимости

В веб-клиенте действуют те же правила, но есть ограничения: работа с файловой системой (помещение .epf) требует расширения работы с файлами, а модальные окна браузер блокирует — поэтому режим БлокироватьОкноВладельца корректно работает только через механизм оповещений, а не через устаревший модальный вызов.

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

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

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

Форма открылась по кнопке
Норма

Окно появилось, реквизиты заполнены из параметров

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

Ошибка «форма не найдена» — проверьте имя формы в конфигураторе

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

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

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

Параметры пусты — имя ключа в структуре не совпадает с проверяемым

Результат вернулся при закрытии
Норма

Оповещение сработало, значение не Неопределено

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

Оповещение не вызывается — процедура не экспортная или неверное имя

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

Как открыть конкретную форму, если у обработки их несколько?

Укажите полный путь: ОткрытьФорму("Обработка.МояОбработка.Форма.Настройки"). Если имя формы не указано, откроется та, что назначена основной в свойствах обработки.

Почему ОткрытьФорму выдаёт ошибку «Метод объекта не обнаружен»?

Чаще всего вызов находится в серверной процедуре или в модуле объекта. Перенесите открытие в клиентскую процедуру с директивой &НаКлиенте, а серверные данные получайте отдельным вызовом.

Как запретить открытие второй копии одной и той же формы?

Передайте фиксированный ключ уникальности, например строку или конкретный идентификатор. При повторном вызове платформа активирует уже открытое окно вместо создания нового.

Можно ли открыть форму обработки из подписки на событие?

Нет, подписки выполняются на сервере. Интерактивные действия возможны только в клиентских обработчиках форм и команд.

Как открыть форму обработки в обычном приложении?

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

Итог

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

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