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