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