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

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

Как в 1С открыть другую форму этого же объекта

Как в 1С открыть другую форму этого же объекта: ОткрытьФорму, ПолучитьФорму, параметры, уникальность, выбор формы в конфигураторе. Примеры кода и ошибки.

У одного объекта метаданных в 1С — справочника, документа, регистра — может быть несколько форм одного типа: например, две формы элемента («Полная» и «Упрощённая») или несколько форм списка. Задача «открыть другую форму этого же объекта» возникает, когда нужно из кода вызвать не основную форму, а конкретную альтернативную, либо когда в конфигураторе требуется назначить другую форму основной.

Решение зависит от контекста: управляемое приложение использует методы ОткрытьФорму() и ОткрытьФормуМодально() с указанием полного имени формы, обычное приложение — ПолучитьФорму() и ПолучитьОбщуюФорму(). Ключевой момент во всех случаях — правильно сформировать имя формы, включающее имя конкретной формы из ветки «Формы» объекта метаданных.

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

Как устроено имя формы объекта в 1С

Полное имя формы строится по шаблону: <ВидОбъекта>.<ИмяОбъекта>.Форма.<ИмяФормы>. Например, для формы «ФормаЭлементаРасширенная» справочника «Номенклатура» полное имя будет Справочник.Номенклатура.Форма.ФормаЭлементаРасширенная. Именно эту строку платформа использует для поиска нужной формы.

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

Открытие другой формы в управляемом приложении

В управляемых формах используется глобальный метод ОткрытьФорму(). Минимальный вызов для открытия конкретной формы объекта выглядит так:

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлементаУпрощенная");

Если нужно открыть форму конкретного существующего элемента, передайте его ссылку в параметре «Ключ»:

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Ключ", ТекущаяСсылка);

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлементаУпрощенная", ПараметрыФормы);

Дополнительные аргументы метода позволяют указать владельца формы, уникальность, окно и описание оповещения о закрытии. Владелец нужен, чтобы форма закрылась вместе с родительской и не «терялась» за другими окнами. Уникальность (любое значение, например ссылка) заставляет платформу открывать отдельный экземпляр формы даже если форма этого объекта уже открыта.

Порядок действий
  1. 1
    В конфигураторе создайте нужную форму в ветке «Формы» объекта, если её ещё нет
  2. 2
    Запомните имя формы и составьте полное имя по шаблону Вид.Объект.Форма.ИмяФормы
  3. 3
    В коде вызовите ОткрытьФорму() с этим именем и, при необходимости, параметром «Ключ»
  4. 4
    Проверьте в режиме предприятия, что открывается именно нужная форма и с нужными данными

Открытие другой формы в обычном приложении

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

Форма = Справочники.Номенклатура.ПолучитьФорму("ФормаЭлементаУпрощенная");

Форма.Открыть();

Чтобы открыть форму существующего элемента, получите объект по ссылке и вызовите ПолучитьФорму() у него:

Объект = ТекущаяСсылка.ПолучитьОбъект();

Форма = Объект.ПолучитьФорму("ФормаЭлементаУпрощенная");

Форма.Открыть();

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

Как сделать другую форму основной в конфигураторе

Если требуется, чтобы другая форма открывалась всегда — при двойном щелчке по элементу, при создании нового, из стандартных команд интерфейса, — не нужен код. Достаточно назначить её основной.

Откройте в конфигураторе объект метаданных, перейдите в палитру свойств и найдите группу свойств «Основные формы»: «Основная форма элемента», «Основная форма списка», «Основная форма для выбора» и другие. В нужном свойстве выберите требуемую форму из выпадающего списка. После обновления конфигурации базы данных платформа будет открывать именно её во всех стандартных сценариях.

Учтите, что изменение основной формы влияет на всех пользователей и на все места вызова. Если разным пользователям нужны разные формы, назначение основной не подойдёт — используйте программное открытие с проверкой условий, например роли пользователя.

Маршрут решения

Как выбрать подход

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

Передача параметров и выбор формы по условию

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

Если ТекущаяСсылка.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда

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

Иначе

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

КонецЕсли;

ПараметрыФормы = Новый Структура("Ключ", ТекущаяСсылка);

ОткрытьФорму(ИмяФормы, ПараметрыФормы);

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

Если нужно перехватить стандартное открытие формы (например, заменить форму элемента при открытии из списка), используйте обработчик ОбработкаПолученияФормы() в модуле менеджера объекта: в нём можно подменить имя формы в параметре ВыбраннаяФорма и установить признак СтандартнаяОбработка = Ложь.

bsl
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
	Если ВидФормы = "ФормаОбъекта" Тогда
		СтандартнаяОбработка = Ложь;
		ВыбраннаяФорма = "ФормаЭлементаУпрощенная";
	КонецЕсли;
КонецПроцедуры

Типичные ошибки и как их проверить

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

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

Третья ошибка — передача в параметр «Ключ» значения не того типа или незаполненной ссылки. Форма элемента при пустом ключе откроется в режиме создания нового объекта, что легко принять за «неправильную форму». Перед вызовом проверяйте, что ссылка заполнена.

Типичные ошибки
01
Указано короткое имя формы в ОткрытьФорму() вместо полного — платформа не находит форму
02
Ожидание, что стандартная команда «Изменить» откроет альтернативную форму — стандартные команды открывают только основную
03
Передача собственных параметров, не объявленных в параметрах формы — ошибка при открытии
04
Вызов ПолучитьФорму() в управляемом приложении — метод недоступен, нужна ОткрытьФорму()
05
Передача пустой ссылки в «Ключ» — форма открывается в режиме создания нового объекта
Контрольные точки

Как проверить результат

Какая форма открылась
Норма

Заголовок и состав элементов соответствуют нужной форме

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

Открылась основная форма — проверьте, не используется ли стандартная команда

Данные в форме
Норма

Форма показывает данные переданной ссылки

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

Форма пустая в режиме нового объекта — параметр «Ключ» не передан или пуст

Повторное открытие
Норма

Открывается отдельный экземпляр или активируется существующий — по замыслу

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

Дубли окон там, где нужна одна форма — не задан параметр уникальности

Ограничения и безопасные границы

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

Модальное открытие (ОткрытьФормуМодально()) блокирует интерфейс и в веб-клиенте работает с ограничениями; в современных конфигурациях рекомендуется асинхронный вариант — ОткрытьФорму() с описанием оповещения о закрытии. Это важно учитывать при проектировании новых механизмов.

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

Как узнать полное имя формы, если я не помню его точно?

Откройте конфигуратор, найдите объект, разверните ветку «Формы» и посмотрите имя нужной формы. Полное имя собирается по шаблону «Вид.Объект.Форма.ИмяФормы». Также полное имя можно получить программно через свойство формы ИмяФормы в её обработчиках.

Можно ли открыть форму другого объекта, а не этого же?

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

Почему ОткрытьФорму() выдаёт ошибку «Форма не найдена», хотя форма есть?

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

Как открыть другую форму при двойном щелчке по элементу списка?

Двойной щелчок вызывает стандартную команду, которая открывает основную форму. Варианты: назначить нужную форму основной, подменить её в обработчике ОбработкаПолученияФормы() модуля менеджера объекта или отключить стандартную обработку события «Выбор» таблицы списка и вызвать ОткрытьФорму() самостоятельно.

Как передать в открываемую форму дополнительные данные?

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

Чем ОткрытьФорму() отличается от ПолучитьФорму()?

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

Итог

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

Другая форма того же объекта открывается по полному имени «Вид.Объект.Форма.ИмяФормы»: через ОткрытьФорму() в управляемом приложении и ПолучитьФорму() в обычном. Ссылку на элемент передавайте в параметре «Ключ». Если другая форма нужна всегда — назначьте её основной в конфигураторе; если по условию — подменяйте в ОбработкаПолученияФормы() или открывайте программно.