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