При разработке и доработке внешних обработок в 1С программисты часто сталкиваются с необходимостью открыть одну форму обработки из другой. Например, при заполнении табеля учета рабочего времени может потребоваться открыть самописную форму выбора руководителя. Однако вместо ожидаемого окна система выдает ошибку: «Неизвестное имя формы».
Проанализируем ситуацию на примере сообщения об ошибке:
Ошибка при вызове метода контекста (ОткрытьФорму)
{...}: ОткрытьФорму("ЗаполнениеТабельУчетаРабочегоВремени1_5_ПерваяПоловинаМесяца.Форма.ФормаВыбораСотрудника",ПараметрыОбр,,,,,ОП,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
по причине:
Неизвестное имя формы. Имя: "ЗаполнениеТабельУчетаРабочегоВремени1_5_ПерваяПоловинаМесяца.Форма.ФормаВыбораСотрудника"
Разберем по шагам, почему возникает эта ошибка во время выполнения встроенного языка и какие существуют проверенные способы ее решения.
Платформа 1С требует указывать полный путь к объекту метаданных при использовании функции ОткрытьФорму. Если мы посмотрим на код, вызвавший ошибку, то увидим, что путь начинается сразу с имени самой обработки: "ЗаполнениеТабельУчетаРабочегоВремени1_5_ПерваяПоловинаМесяца...".
Для встроенных в конфигурацию обработок путь должен начинаться со слова Обработка. Но поскольку наша обработка является внешней, платформа не найдет ее в основном дереве метаданных. Обязательным требованием является наличие префикса ВнешняяОбработка.
Посмотрим на правильный синтаксис прямого обращения:
// Правильный формат строки для внешней обработки
ОткрытьФорму("ВнешняяОбработка.ИмяВашейОбработки.Форма.ИмяНужнойФормы");
// Пример из обсуждения:
ОткрытьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма1");
Даже если вы добавите префикс ВнешняяОбработка, код все равно может не сработать, если вы открываете файл обработки напрямую через меню "Файл - Открыть". Выясним причину.
Когда внешняя обработка открывается как файл, платформа не использует то имя, которое программист задал ей в конфигураторе в палитре свойств. Вместо этого система генерирует для нее динамическое имя, включающее уникальный идентификатор (GUID). Имя будет выглядеть примерно так: ВнешняяОбработка.123e4567-e89b-12d3-a456-426655440000.
Из-за этого прямое обращение по жестко прописанному в коде имени (как в конфигураторе) приведет к той же ошибке — платформа не найдет объект с таким текстовым именем в памяти.
Если вам нужно открыть вторую форму (например, форму выбора) из основной управляемой формы этой же самой внешней обработки, лучше всего не пытаться угадать ее имя, а спросить его у платформы. Рассмотрим этот надежный метод.
Свойство ЭтаФорма.ИмяФормы возвращает реальный полный путь к текущей форме, включая сгенерированный GUID (например: "ВнешняяОбработка.<GUID>.Форма.ФормаОсновная"). Нам нужно только отрезать имя текущей формы и приклеить имя той, которую мы хотим открыть.
// Получаем полный путь текущей открытой формы
ТекущийПуть = ЭтаФорма.ИмяФормы;
// Находим позицию слова "Форма."
ПозицияСлова = СтрНайти(ТекущийПуть, "Форма.");
// Выделяем базовый путь обработки
БазовыйПуть = Лев(ТекущийПуть, ПозицияСлова + 5);
// Формируем путь к нужной форме
ПутьКФормеВыбора = БазовыйПуть + "ФормаВыбораСотрудника";
// Открываем форму
ОткрытьФорму(ПутьКФормеВыбора, ПараметрыОбр, ЭтаФорма);
Если вам нужно открыть форму внешней обработки программно (например, она хранится в справочнике дополнительных отчетов и обработок или в двоичных данных), ее необходимо сначала поместить во временное хранилище и подключить. Метод Подключить менеджера внешних обработок вернет нам правильное динамическое имя.
Рассмотрим пример кода:
// Помещаем файл обработки во временное хранилище (адрес получаем заранее)
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки);
// Подключаем внешнюю обработку и получаем ее сгенерированное имя
ИмяПодключеннойОбработки = ВнешниеОбработки.Подключить(АдресХранилища);
// Теперь формируем правильную строку и открываем форму
ПутьКФорме = "ВнешняяОбработка." + ИмяПодключеннойОбработки + ".Форма.ФормаВыбораСотрудника";
ОткрытьФорму(ПутьКФорме);
Если ваша внешняя обработка написана для режима обычных форм (неуправляемое приложение) и запускается в Толстом клиенте, вам не обязательно формировать сложные строки для функции ОткрытьФорму. Мы можем обратиться к контексту самого объекта обработки.
// Получаем форму через контекст объекта и открываем ее
ЭтотОбъект.ПолучитьФорму("ФормаВыбораСотрудника").Открыть();
Важно: Платформа не позволяет открывать обычные (неуправляемые) формы внешних файлов при работе в Тонком клиенте или Веб-клиенте. Если код выдает ошибку или просто не работает, проверьте, в каком клиенте вы запускаете базу.
Проанализируем архитектурные особенности. В управляемом приложении каждая открытая форма внешней обработки существует как отдельный изолированный экземпляр. Если пользователь ввел данные на первой форме, но не сохранил их (или они хранятся в реквизитах формы), вторая форма их не увидит.
Для передачи данных между такими формами придется использовать структуру параметров (при открытии) или функцию ПоместитьВоВременноеХранилище, что усложняет код.
Альтернативный вариант: Вместо того чтобы создавать множество форм внутри внешней обработки и бороться с динамическими путями, используйте систему страниц (закладок) на одной единственной управляемой форме. Вы можете программно или интерактивно переключать видимость страниц. Это позволит хранить все данные в едином контексте, избавит от необходимости передавать параметры между окнами и полностью исключит ошибку "Неизвестное имя формы".