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