Как программно открыть форму внешней обработки в 1С:Предприятии 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Базовый механизм открытия формы в управляемом приложении

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

Путь к форме внешней обработки всегда строится по шаблону: "ВнешняяОбработка.[ИмяОбработки].Форма.[ИмяФормы]". Рассмотрим пример кода, который вызывается на стороне клиента:


&НаКлиенте
Процедура ОткрытьДополнительнуюФорму(Команда)
    // Указываем полный путь к форме
    // ИмяОбработки — это имя, заданное в свойствах корневого объекта в Конфигураторе
    // ИмяФормы — имя конкретной формы в дереве метаданных обработки
    ОткрытьФорму("ВнешняяОбработка.МояОбработкаПоиска.Форма.ФормаНастроек");
КонецПроцедуры

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

Решение проблемы «Неизвестное имя формы»

Часто программисты сталкиваются с ситуацией, когда код написан верно, но система выдает ошибку: «Неизвестное имя формы». Проанализируем причины этого поведения. Когда вы открываете файл обработки через меню «Файл — Открыть», 1С регистрирует её во временном хранилище под именем, указанным в метаданных. Ошибка возникает в следующих случаях:

  1. Несоответствие имен: Имя в строке кода не совпадает с именем обработки в конфигураторе (свойство «Имя» объекта ВнешняяОбработка).
  2. Кэширование данных: Если вы изменили имя обработки или формы в конфигураторе и сохранили файл, но в сеансе «Предприятия» обработка уже была открыта ранее, система может обращаться к старой версии структуры.

Как показывает практика практикующих разработчиков, самым простым и действенным решением в данном случае является передобавление или перезапуск обработки. Необходимо полностью закрыть окно обработки в режиме «Предприятие» и открыть файл заново. Это принудительно обновляет описание метаданных объекта в текущем сеансе.

Использование метода ПолучитьФорму и объекта ЭтотОбъект

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

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


&НаКлиенте
Процедура СписокРолей(Команда)
    // Если нужно передать параметры
    ПараметрыФормы = Новый Структура("КлючСвязи", ТекущийОбъектСсылка);
    
    // Вызов формы с указанием владельца (ЭтаФорма)
    // Это связывает окна между собой
    ОткрытьФорму("ВнешняяОбработка.МатрицаРолей.Форма.ФормаВыбора", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры

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

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

Если мы передадим в этот параметр уникальный идентификатор или даже простую строку, 1С проверит: не открыта ли уже форма с таким ключом? Если открыта — система просто активирует существующее окно.


&НаКлиенте
Процедура ОткрытьНастройкиУникально(Команда)
    // Используем фиксированную строку как ключ уникальности
    Ключ = "УникальныйКлючМоихНастроек";
    ОткрытьФорму("ВнешняяОбработка.ПоискИЗамена.Форма.Настройки", , , Ключ);
КонецПроцедуры

Также важно уметь передавать данные. Рассмотрим по шагам:

  1. В вызываемой форме (которую открываем) переходим на закладку «Параметры» и добавляем параметр, например, РежимРаботы.
  2. В вызывающей форме подготавливаем структуру: Параметры = Новый Структура("РежимРаботы", "Расширенный");.
  3. В вызываемой форме в обработчике ПриСозданииНаСервере считываем значение: Значение = Параметры.РежимРаботы;.

Особенности работы в Тонком клиенте и Веб-клиенте

Проанализируем современные требования к разработке. Начиная с последних версий платформы 8.3, использование модальных окон (ОткрытьФормуМодально) считается устаревшим и не рекомендуется. Это связано с тем, что модальность блокирует работу браузера в Веб-клиенте и мешает асинхронной работе интерфейса.

Вместо модального открытия рекомендуется использовать описание оповещения. Посмотрим на пример реализации асинхронного вызова:


&НаКлиенте
Процедура ВыполнитьВыбор(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормы", ЭтотОбъект);
    ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма.Выбор", , ЭтаФорма, , , , Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияФормы(Результат, ДополнительныеПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        Сообщить("Пользователь выбрал: " + Результат);
    КонецЕсли;
КонецПроцедуры

Работа с программно подключенными обработками

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


// На сервере подключаем
ИмяРегистрации = ВнешниеОбработки.Подключить(ПутьКФайлу, Ложь);
// На клиенте открываем
ОткрытьФорму("ВнешняяОбработка." + ИмяРегистрации + ".Форма.ИмяФормы");

Без этого префикса система не сможет найти объект в памяти, так как он не зарегистрирован в метаданных основной конфигурации.

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

← На главную