К статье
Практический материал

Разработка и Конфигурация · 8 мин

Как получить имя формы в 1С программно

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

Имя формы в 1С — это строка вида «Справочник.Номенклатура.Форма.ФормаЭлемента», которая однозначно идентифицирует форму в конфигурации. Оно требуется при программном открытии форм, передаче параметров между формами, отладке и динамическом построении логики, когда заранее неизвестно, какая именно форма будет использоваться.

Способ получения имени зависит от режима работы (управляемое или обычное приложение), от того, где выполняется код (внутри формы, в модуле объекта, на клиенте или сервере), и от того, нужна форма конкретного объекта или общая форма. Ниже разобраны все основные сценарии с рабочими примерами кода.

Где хранится имя формы и как оно устроено

Имя формы строится по иерархии метаданных: вид объекта, имя объекта, служебное слово «Форма» и собственно имя формы, заданное разработчиком в конфигураторе. Например: «Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента».

Для общих форм структура короче: «ОбщаяФорма.ИмяФормы». У внешних обработок и отчётов имя формируется иначе — через полное имя файла или через имя объекта, зарегистрированного в справочнике дополнительных отчётов и обработок.

Получение имени текущей формы изнутри

Самая частая задача — узнать имя формы, находясь в её собственном модуле. В управляемом приложении у объекта УправляемаяФорма есть свойство ИмяФормы. Оно доступно и на клиенте, и на сервере:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Сообщить(ЭтотОбъект.ИмяФормы);

// Например: Справочник.Номенклатура.Форма.ФормаЭлемента

КонецПроцедуры

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

Практическое применение: запись в журнал регистрации для диагностики, условная логика, когда один общий модуль обслуживает несколько форм, проверка, из какой формы вызвана процедура.

Получение имени формы через метаданные объекта

Если нужно узнать, какие формы есть у объекта конфигурации, или получить имя формы по умолчанию, используется объект Метаданные. У каждого объекта метаданных есть коллекция Формы и свойства форм по умолчанию: ОсновнаяФормаОбъекта, ОсновнаяФормаСписка, ОсновнаяФормаДляВыбора.

&НаСервере

Функция ИмяОсновнойФормыСписка()

Мета = Метаданные.Справочники.Номенклатура;

Если Мета.ОсновнаяФормаСписка <> Неопределено Тогда

Возврат Мета.ОсновнаяФормаСписка.ПолноеИмя();

КонецЕсли;

Возврат "";

КонецФункции

Метод ПолноеИмя() объекта метаданных формы возвращает полную строку, пригодную для ОткрытьФорму. Если основная форма не назначена (свойство равно Неопределено), платформа будет генерировать форму автоматически, и статического имени у неё нет.

Перебор всех форм объекта

Когда нужно получить список всех форм объекта — например, для отчёта по конфигурации или динамического меню — перебирается коллекция Формы:

Для Каждого ФормаМета Из Метаданные.Справочники.Номенклатура.Формы Цикл

Сообщить(ФормаМета.ПолноеИмя());

КонецЦикла;

Как узнать имя формы через конфигуратор
  1. 1
    Откройте конфигуратор и найдите нужный объект в дереве конфигурации
  2. 2
    Разверните ветку «Формы» внутри объекта
  3. 3
    Посмотрите имя нужной формы — оно отображается в дереве
  4. 4
    Соберите полное имя по шаблону: ВидОбъекта.ИмяОбъекта.Форма.ИмяФормы
  5. 5
    Проверьте результат, передав строку в ОткрытьФорму в режиме отладки

Имя формы для открытия: ОткрытьФорму и ПолучитьФорму

Чаще всего имя формы нужно не само по себе, а как параметр метода ОткрытьФорму. Здесь важно понимать, что имя можно собрать строкой вручную, но безопаснее получать его из метаданных — тогда переименование объекта не сломает код незаметно.

&НаКлиенте

Процедура ОткрытьНужнуюФорму(Команда)

ИмяФормыДляОткрытия = "Справочник.Номенклатура.Форма.ФормаСписка";

ОткрытьФорму(ИмяФормыДляОткрытия);

КонецПроцедуры

Если форма открывается с параметрами, они передаются вторым аргументом в виде структуры. Имя формы при этом остаётся обычной строкой, и ошибка в ней проявится только в момент выполнения — компилятор строку не проверяет.

Типичные ошибки
01
Опечатка в строковом имени формы — ошибка всплывёт только при выполнении, а не при проверке модуля
02
Пропуск слова «Форма» в середине имени: «Справочник.Номенклатура.ФормаСписка» вместо «...Форма.ФормаСписка»
03
Ожидание, что ПолноеИмя() сработает, когда основная форма не назначена — получаете Неопределено и обращение к методу пустого значения
04
Попытка прочитать ИмяФормы из общего модуля, где этого свойства нет в контексте

Особенности обычных форм и внешних обработок

В обычном приложении используется метод ПолучитьФорму, который тоже принимает строковое имя. Синтаксис имени тот же. Разница в том, что обычные формы могут храниться и как произвольные формы обработки — тогда имя указывается относительно обработки.

Для внешних обработок и отчётов (файлов .epf и .erf) имя формы строится через имя файла или через объект ВнешниеОбработки. В толстом клиенте доступен вызов вида ВнешниеОбработки.ПолучитьФорму("Путь\Обработка.epf", "ИмяФормы"). В управляемом приложении внешние обработки обычно подключаются через механизм дополнительных отчётов и обработок БСП, где имя формы формируется программно.

Способы получения имени формы

Свойство ИмяФормы

Подходит внутри модуля формы. Быстро и надёжно, но недоступно извне

Метаданные + ПолноеИмя()

Универсально для любого объекта конфигурации. Требует проверки на Неопределено для неназначенных форм

Ручная строка

Просто, но хрупко: переименование объекта ломает код без предупреждения

ПолучитьФорму в обычном приложении

Только для обычных форм и толстого клиента, в управляемом приложении не работает

Проверка результата и отладка

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

Дополнительная проверка — сравнить собранное имя с деревом конфигурации: откройте свойства формы в конфигураторе и сверьте каждый сегмент строки. Учтите, что регистр букв в имени формы значения не имеет, а вот пропущенные сегменты и лишние точки критичны.

Контрольные точки

Как проверить корректность имени формы

Структура строки
Норма

Четыре сегмента через точку: Вид.Объект.Форма.Имя

Тревожный признак

Три сегмента или пропущено слово «Форма»

Вызов ОткрытьФорму
Норма

Форма открывается без исключения

Тревожный признак

Ошибка «Форма не найдена» при выполнении

Основная форма в метаданных
Норма

Свойство не равно Неопределено, ПолноеИмя() возвращает строку

Тревожный признак

Свойство Неопределено — форма генерируется автоматически

Частые вопросы

Можно ли получить имя формы по открытому окну?

Да, если у вас есть ссылка на объект формы (например, через параметр оповещения или владельца), прочитайте её свойство ИмяФормы. Перебрать все открытые окна штатными средствами управляемого приложения нельзя — платформа не предоставляет такой коллекции.

Почему ПолноеИмя() выдаёт ошибку?

Чаще всего потому, что обращение идёт к свойству ОсновнаяФормаСписка или аналогичному, которое равно Неопределено. Перед вызовом метода всегда проверяйте значение на Неопределено.

Как получить имя формы внешней обработки в управляемом приложении?

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

Чувствительно ли имя формы к регистру букв?

Нет, платформа сопоставляет имена метаданных без учёта регистра. Но для читаемости и единообразия кода лучше писать имя точно так, как оно задано в конфигураторе.

Как узнать, из какой формы вызвана процедура общего модуля?

Штатного способа получить «форму-вызывающего» нет. Передайте имя формы параметром при вызове: в модуле формы возьмите ЭтотОбъект.ИмяФормы и передайте строкой в общий модуль.

Можно ли переименовать форму, не сломав код?

Да, если все обращения к имени формы построены через метаданные или свойство ИмяФормы. Ручные строковые литералы придётся искать и править вручную — используйте глобальный поиск по старому имени.

Итог

Что важно запомнить

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