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

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

Как обратиться к форме внешней обработки 1С

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

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

Главная сложность в том, что внешняя обработка не входит в состав метаданных конфигурации, поэтому обращаться к ней через Обработки.ИмяОбработки нельзя. Вместо этого используется менеджер ВнешниеОбработки или методы глобального контекста ОткрытьФорму и ПолучитьФорму с указанием пути к файлу обработки.

Ниже разобраны рабочие способы для управляемого и обычного приложений, передача параметров, обращение к элементам и данным формы, а также типичные ошибки, из-за которых форма не открывается или обращение завершается исключением.

Как устроено обращение к внешней обработке

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

Идентификация обработки зависит от способа запуска. Если файл лежит на диске, обращение идёт по полному пути к файлу. Если обработка зарегистрирована в справочнике дополнительных отчетов и обработок (в типовых конфигурациях на БСП), обращение идёт по имени, под которым она подключена. Это принципиально разные сценарии, и код для них отличается.

Открытие формы в управляемом приложении

В управляемом приложении прямой вызов ПолучитьФорму для внешних обработок недоступен — платформа требует использовать ОткрытьФорму с указанием имени формы. При этом обработка должна быть предварительно подключена в безопасном режиме или создана на сервере.

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

&НаКлиенте

Процедура ОткрытьОбработку(Команда)

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

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

ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма.ОсновнаяФорма",

ПараметрыФормы, ЭтаФорма);

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

Имя МояОбработка — это не имя файла на диске, а имя, под которым обработка подключена в сеансе. Если обработка открыта интерактивно через «Файл — Открыть», платформа присваивает ей имя вида ВнешняяОбработка.N, и точный номер можно узнать только программно. Поэтому надежнее всего работать через подключение из справочника дополнительных обработок, где имя фиксировано.

Открытие формы в обычном приложении

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

ФормаОбработки = ВнешниеОбработки.ПолучитьФорму(

"C:\Обработки\ЗагрузкаДанных.epf", "Форма");

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

Если имя формы не указано, откроется основная форма обработки, заданная в её свойствах. Через возвращаемый объект доступны реквизиты и экспортные процедуры модуля формы — это удобный способ не только открыть форму, но и обратиться к её данным до открытия.

Ограничение очевидно: обычное приложение встречается всё реже, а в тонком и веб-клиенте этот код не работает. Если обработка должна запускаться в обоих режимах, логику открытия формы придется разделять директивами компиляции #Если ТолстыйКлиентОбычноеПриложение Тогда.

Передача параметров и получение результата

Параметры в управляемую форму передаются вторым аргументом ОткрытьФорму — структурой. В модуле формы обработки они доступны через свойство Параметры в обработчике ПриСозданииНаСервере:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("Организация") Тогда

ОрганизацияОтбор = Параметры.Организация;

КонецЕсли;

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

Чтобы получить результат работы формы обратно в вызывающий код, используют механизм оповещений. При открытии формы передают описание оповещения, а в форме обработки перед закрытием вызывают ОповеститьОВыборе или Закрыть(Результат):

&НаКлиенте

Процедура ОткрытьСВыбором(Команда)

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

ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма.ФормаВыбора",

, ЭтаФорма, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте

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

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

ВыбранноеЗначение = Результат;

КонецЕсли;

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

Порядок действий
  1. 1
    Подключите внешнюю обработку: через ВнешниеОбработки.Создать() на сервере или через справочник дополнительных обработок
  2. 2
    Узнайте точное имя, под которым обработка зарегистрирована в сеансе
  3. 3
    Вызовите ОткрытьФорму с полным именем формы и структурой параметров
  4. 4
    В модуле формы обработки прочитайте параметры в ПриСозданииНаСервере
  5. 5
    Для возврата результата используйте описание оповещения и Закрыть(Результат)
  6. 6
    Проверьте открытие формы и передачу значений в отладчике

Обращение к данным и элементам формы

Частая задача — не просто открыть форму, а обратиться к её реквизитам или табличным частям извне. В управляемом приложении прямой доступ к чужой форме ограничен: получить объект открытой формы можно, только если форма сама его «отдала», например через параметр или оповещение. Произвольно перебирать открытые окна и читать их реквизиты платформа не позволяет — это следствие клиент-серверной архитектуры.

Рабочие варианты обмена данными с формой внешней обработки:

  • передача данных внутрь — через параметры при открытии;
  • возврат данных наружу — через результат закрытия или оповещения;
  • обмен сложными структурами — через временное хранилище (поместить данные через ПоместитьВоВременноеХранилище и передать адрес параметром);
  • в обычном приложении — прямое обращение к реквизитам объекта формы, полученного через ПолучитьФорму.

Если нужно программно «нажать» команду на форме обработки, правильный путь — вызвать экспортную процедуру её модуля формы, а не имитировать нажатие. Для этого процедура в модуле формы обработки должна быть объявлена с ключевым словом Экспорт.

Обращение из кода конфигурации и из другой обработки

Если вызов идет из модуля конфигурации (например, из команды документа), рекомендуемая схема для управляемого приложения — регистрация обработки в справочнике «Дополнительные отчеты и обработки» и открытие через имя подключенной обработки. Это избавляет от зависимости от файловой системы и работает в клиент-серверном режиме.

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

Сравнение вариантов

ОткрытьФорму + доп. обработки БСП

Универсально для управляемого приложения, работает в клиент-сервере; требует регистрации обработки в справочнике

ВнешниеОбработки.ПолучитьФорму по пути

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

ВнешниеОбработки.Создать + ОткрытьФорму

Гибкий вариант без БСП; подключение на сервере, открытие на клиенте, нужно знать имя подключения

Типичные ошибки и их устранение

Самая частая ошибка — «Объект не найден» или «Метаданные не найдены» при вызове ОткрытьФорму. Причина почти всегда в том, что обработка не подключена в сеансе под тем именем, которое указано в строке вызова. Проверьте имя подключения и убедитесь, что подключение выполнено до открытия формы.

Вторая группа ошибок связана с безопасным режимом. В файловых базах и при открытии извне платформа может запретить создание внешней обработки, если включен запрет небезопасных действий. В этом случае подключайте обработку с явным указанием режима или добавляйте её в список доверенных через механизм профилей безопасности.

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

Типичные ошибки
01
Вызов ОткрытьФорму до подключения обработки — платформа не находит метаданные и выдает исключение
02
Передача мутабельных объектов (ДокументОбъект, СправочникОбъект) в параметры формы — сериализация невозможна, передавайте ссылки
03
Чтение параметров в ПриОткрытии вместо ПриСозданииНаСервере — часть значений теряется
04
Попытка обратиться к реквизитам чужой управляемой формы напрямую — используйте оповещения и результат закрытия
05
Путь к файлу хранится константой в коде — код не работает на сервере и после переноса базы
Контрольные точки

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

Открытие формы
Норма

Форма открылась без исключений, заголовок и элементы отображаются

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

Ошибка «Объект не найден» или пустое окно

Передача параметров
Норма

В ПриСозданииНаСервере Параметры содержат переданные ключи и значения

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

Свойство не найдено или значение Неопределено

Возврат результата
Норма

Описание оповещения срабатывает, результат содержит ожидаемое значение

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

Оповещение не вызывается — проверьте Закрыть(Результат) в обработке

FAQ

Как открыть основную форму внешней обработки, не зная её имени?

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

Можно ли обратиться к форме уже открытой обработки из другого кода?

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

Почему ОткрытьФорму работает в отладчике на файловой базе, но падает на сервере?

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

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

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

Чем отличается ОткрытьФорму от ПолучитьФорму для внешней обработки?

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

Можно ли вызвать процедуру модуля формы внешней обработки снаружи?

Да, если процедура объявлена с ключевым словом Экспорт и у вас есть объект формы (в обычном приложении) или форма передала ссылку на себя (в управляемом). Без экспорта и без ссылки на объект формы вызвать её методы нельзя.

Итог

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

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