Как исправить ошибку "Неизвестное имя формы" при открытии формы внешней обработки в 1С?

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

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

Проанализируем ситуацию на примере сообщения об ошибке:


Ошибка при вызове метода контекста (ОткрытьФорму)
{...}: ОткрытьФорму("ЗаполнениеТабельУчетаРабочегоВремени1_5_ПерваяПоловинаМесяца.Форма.ФормаВыбораСотрудника",ПараметрыОбр,,,,,ОП,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
по причине:
Неизвестное имя формы. Имя: "ЗаполнениеТабельУчетаРабочегоВремени1_5_ПерваяПоловинаМесяца.Форма.ФормаВыбораСотрудника"

Разберем по шагам, почему возникает эта ошибка во время выполнения встроенного языка и какие существуют проверенные способы ее решения.

Причина 1: Отсутствие префикса типа объекта

Платформа 1С требует указывать полный путь к объекту метаданных при использовании функции ОткрытьФорму. Если мы посмотрим на код, вызвавший ошибку, то увидим, что путь начинается сразу с имени самой обработки: "ЗаполнениеТабельУчетаРабочегоВремени1_5_ПерваяПоловинаМесяца...".

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

Посмотрим на правильный синтаксис прямого обращения:


// Правильный формат строки для внешней обработки
ОткрытьФорму("ВнешняяОбработка.ИмяВашейОбработки.Форма.ИмяНужнойФормы");

// Пример из обсуждения:
ОткрытьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма1");

Причина 2: Динамические имена внешних обработок (Уникальные идентификаторы)

Даже если вы добавите префикс ВнешняяОбработка, код все равно может не сработать, если вы открываете файл обработки напрямую через меню "Файл - Открыть". Выясним причину.

Когда внешняя обработка открывается как файл, платформа не использует то имя, которое программист задал ей в конфигураторе в палитре свойств. Вместо этого система генерирует для нее динамическое имя, включающее уникальный идентификатор (GUID). Имя будет выглядеть примерно так: ВнешняяОбработка.123e4567-e89b-12d3-a456-426655440000.

Из-за этого прямое обращение по жестко прописанному в коде имени (как в конфигураторе) приведет к той же ошибке — платформа не найдет объект с таким текстовым именем в памяти.

Способ решения 1: Динамическое формирование пути (Для управляемых форм)

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

Свойство ЭтаФорма.ИмяФормы возвращает реальный полный путь к текущей форме, включая сгенерированный GUID (например: "ВнешняяОбработка.<GUID>.Форма.ФормаОсновная"). Нам нужно только отрезать имя текущей формы и приклеить имя той, которую мы хотим открыть.


// Получаем полный путь текущей открытой формы
ТекущийПуть = ЭтаФорма.ИмяФормы; 

// Находим позицию слова "Форма."
ПозицияСлова = СтрНайти(ТекущийПуть, "Форма.");

// Выделяем базовый путь обработки
БазовыйПуть = Лев(ТекущийПуть, ПозицияСлова + 5); 

// Формируем путь к нужной форме
ПутьКФормеВыбора = БазовыйПуть + "ФормаВыбораСотрудника";

// Открываем форму
ОткрытьФорму(ПутьКФормеВыбора, ПараметрыОбр, ЭтаФорма);

Способ решения 2: Программное подключение обработки

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

Рассмотрим пример кода:


// Помещаем файл обработки во временное хранилище (адрес получаем заранее)
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки);

// Подключаем внешнюю обработку и получаем ее сгенерированное имя
ИмяПодключеннойОбработки = ВнешниеОбработки.Подключить(АдресХранилища);

// Теперь формируем правильную строку и открываем форму
ПутьКФорме = "ВнешняяОбработка." + ИмяПодключеннойОбработки + ".Форма.ФормаВыбораСотрудника";
ОткрытьФорму(ПутьКФорме);

Способ решения 3: Использование обычных форм (Толстый клиент)

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


// Получаем форму через контекст объекта и открываем ее
ЭтотОбъект.ПолучитьФорму("ФормаВыбораСотрудника").Открыть();

Важно: Платформа не позволяет открывать обычные (неуправляемые) формы внешних файлов при работе в Тонком клиенте или Веб-клиенте. Если код выдает ошибку или просто не работает, проверьте, в каком клиенте вы запускаете базу.

Ограничения и альтернативные подходы

Проанализируем архитектурные особенности. В управляемом приложении каждая открытая форма внешней обработки существует как отдельный изолированный экземпляр. Если пользователь ввел данные на первой форме, но не сохранил их (или они хранятся в реквизитах формы), вторая форма их не увидит.

Для передачи данных между такими формами придется использовать структуру параметров (при открытии) или функцию ПоместитьВоВременноеХранилище, что усложняет код.

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

← На главную