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