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

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

Как получить форму обработки в 1С

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

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

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

Чем отличается получение формы от её открытия

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

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

Получение формы встроенной обработки в управляемом приложении

Для обработки, входящей в состав конфигурации, путь к форме строится по шаблону Обработка.<ИмяОбработки>.Форма.<ИмяФормы>. Если имя формы не указать, будет использована основная форма обработки, назначенная в свойствах объекта.

// Открыть основную форму обработки

ОткрытьФорму("Обработка.ЗагрузкаДанных.Форма");

// Открыть конкретную форму с параметрами

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

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

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

// Получить форму как объект без открытия

Форма = ПолучитьФорму("Обработка.ЗагрузкаДанных.Форма");

Форма.РежимОтладки = Истина;

Форма.Открыть();

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

Порядок открытия формы с параметрами
  1. 1
    Сформируйте структуру с параметрами формы
  2. 2
    Вызовите ОткрытьФорму() с полным путём к форме и структурой
  3. 3
    В модуле формы обработайте параметры в ПриСозданииНаСервере()
  4. 4
    Проверьте, что форма открылась и реквизиты заполнены переданными значениями

Получение формы внешней обработки (.epf)

Внешняя обработка не является частью конфигурации, поэтому обратиться к ней по имени напрямую нельзя. Сначала файл подключается методом ВнешниеОбработки.Подключить(), который возвращает временное имя, присвоенное обработке в текущем сеансе. Это имя и используется в пути к форме.

ИмяОбработки = ВнешниеОбработки.Подключить("C:\Обработки\Загрузка.epf", , Ложь);

ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");

Третий параметр метода Подключить() отвечает за безопасный режим. Если обработка получена из ненадёжного источника, безопасный режим следует включить — тогда код обработки не сможет выполнять потенциально опасные операции с файловой системой и COM-объектами.

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

Получение формы в обычном приложении

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

// Через менеджер обработки

Форма = Обработки.ЗагрузкаДанных.ПолучитьФорму("ФормаНастройки");

Форма.Открыть();

// Для внешней обработки

Обработка = ВнешниеОбработки.Создать("C:\Обработки\Загрузка.epf");

Форма = Обработка.ПолучитьФорму();

Форма.Открыть();

Метод ПолучитьФорму() без параметра возвращает основную форму. Если основная форма не назначена, платформа сгенерирует форму автоматически, что не всегда желательно — поведение такой формы не контролируется разработчиком.

Способы работы с формой

ОткрытьФорму()

Управляемое приложение, нужно просто показать форму. Не подходит, если требуется вызвать экспортные методы формы до открытия.

ПолучитьФорму() (глобальный)

Управляемое приложение, нужен объект формы для программного обращения. Форма существует в памяти до явного закрытия.

Обработки.Имя.ПолучитьФорму()

Только обычное приложение. В управляемом режиме этот метод недоступен.

Передача параметров и обработка закрытия формы

Когда обработка должна вернуть результат — например, выбранные настройки или таблицу данных — используется механизм оповещений. При вызове ОткрытьФорму() четвёртым параметром передаётся описание оповещения, которое сработает после закрытия формы.

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

ОткрытьФорму("Обработка.ПодборТоваров.Форма", , ЭтотОбъект, , , , Оповещение);

&НаКлиенте

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

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

ЗаполнитьТаблицу(Результат);

КонецЕсли;

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

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

Типичные ошибки при получении формы

Самая частая ошибка — «Ошибка при вызове метода контекста: форма не найдена». Она возникает, когда имя обработки или формы указано с опечаткой, форма удалена из обработки, либо путь построен для обычного приложения, а код выполняется в управляемом. Имя формы в пути должно точно совпадать с именем в дереве конфигурации, регистр букв значения не имеет.

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

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

Проверка результата и диагностика

После открытия формы убедитесь, что она действительно создана: ОткрытьФорму() возвращает ссылку на форму, и если вместо объекта вернулось Неопределено, что-то пошло не так. Для формы, полученной через ПолучитьФорму(), проверьте свойство Открыта() — оно показывает, отображается ли форма в данный момент.

Если форма не открывается без видимой ошибки, проверьте журнал регистрации и включённый режим отладки. Также полезно временно вывести полный путь к форме через Сообщить() перед вызовом — это сразу покажет ошибки в динамически формируемом имени внешней обработки.

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

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

Возвращаемое значение ОткрытьФорму()
Норма

Ссылка на объект формы

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

Неопределено — форма не создана

Свойство формы Открыта()
Норма

Истина после вызова Открыть()

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

Ложь — форма создана, но не отображена

Параметры в ПриСозданииНаСервере
Норма

Переданные значения доступны через Параметры

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

Ключи отсутствуют — проверьте структуру параметров

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

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

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

Как открыть форму обработки модально?

В управляемом приложении используйте ОткрытьФорму() с параметром режима открытия РежимОткрытияОкнаФормы.БлокироватьОкноВладельца или БлокироватьВесьИнтерфейс, а результат получайте через описание оповещения. Метод ОткрытьМодально() считается устаревшим и в ряде конфигураций запрещён настройками совместимости.

Почему внешняя обработка подключается, но форма не открывается?

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

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

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

Чем ПолучитьФорму() отличается от ОткрытьФорму() по производительности?

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

Итог

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

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