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