Как открыть форму документа в 1С, если его тип заранее неизвестен?

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

В практике разработчика 1С часто возникают ситуации, когда необходимо написать универсальный код для открытия формы объекта. Например, у вас есть переменная, содержащая ссылку на документ или справочник, но вы не знаете заранее, какой именно это документ — ЗаказКлиента, РеализацияТоваровУслуг или ПоступлениеТоваров. Жесткое кодирование пути к форме в таких случаях невозможно или крайне неэффективно.

В данной статье мы разберем несколько способов решения этой задачи, проанализируем современные стандарты разработки на платформе 1С:Предприятие 8.3 и выясним, почему некоторые старые методы лучше не использовать в управляемом приложении.

Способ 1. Использование универсального метода ПоказатьЗначение

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

Проанализируем пример кода:


// Допустим, ДокументСсылка — это наша переменная с неизвестным типом
ОписаниеОповещения = Неопределено; // Можно задать процедуру, которая выполнится после закрытия
ПоказатьЗначение(ОписаниеОповещения, ДокументСсылка);

Почему этот метод хорош? Во-первых, он асинхронный. Это критически важно для работы в веб-клиенте и мобильном клиенте. Во-вторых, он не требует от программиста знаний о структуре метаданных конкретного объекта. Система сама найдет нужную форму. Однако стоит помнить, что этот метод просто открывает значение для просмотра/редактирования и не позволяет тонко настраивать параметры открытия формы «на лету».

Способ 2. Динамическое формирование пути к форме

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

Разберем по шагам логику построения пути:

  1. Получаем полное имя объекта метаданных через ссылку.
  2. Добавляем к нему стандартное окончание .ФормаОбъекта или .ФормаСписка.
  3. Передаем полученную строку в процедуру ОткрытьФорму.

Посмотрим на пример реализации:


// Получаем полное имя метаданных (например, "Document.ЗаказКлиента")
ПолноеИмяМетаданных = ДокументСсылка.Метаданные().ПолноеИмя();

// Формируем структуру параметров с ключом ссылки
ПараметрыФормы = Новый Структура("Ключ", ДокументСсылка);

// Открываем форму универсально
ОткрытьФорму(ПолноеИмяМетаданных + ".ФормаОбъекта", ПараметрыФормы);

Такой подход позволяет работать с любыми типами данных — будь то документы, справочники или задачи. Мы избавляемся от операторов Если...Тогда...ИначеЕсли, проверяющих тип каждой ссылки.

Способ 3. Почему ПолучитьФорму() — это «плохой тон»?

Многие программисты, перешедшие с версии 8.1 или обычных форм, привыкли использовать конструкцию ПолучитьФорму().Открыть(). Рассмотрим ситуацию, когда разработчик пытается вызвать экспортные процедуры формы перед её открытием:


// ТАК ДЕЛАТЬ НЕ РЕКОМЕНДУЕТСЯ
Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", П);
Форма.ОбновитьДанныеНаСервере(); // Вызов серверного метода формы
Форма.Открыть();

Проанализируем причину, по которой 1С считает такой подход вредным. В управляемом приложении вызов ПолучитьФорму создает объект формы на клиенте, но для этого часто требуется обращение к серверу. Если после этого вы вызываете еще одну серверную процедуру формы, а затем метод Открыть, вы создаете лишние «прыжки» (round-trips) между клиентом и сервером. В условиях медленного интернета это значительно замедляет работу интерфейса.

Правильная работа с параметрами формы

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

Рассмотрим основные параметры:

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


Параметры = Новый Структура;
Параметры.Вставить("Ключ", СсылкаНаДокумент);
Параметры.Вставить("ТолькоПросмотр", Истина); // Пример произвольного параметра

ОткрытьФорму("Документ.УниверсальныйДокумент.ФормаОбъекта", Параметры);

Особенности асинхронного открытия с оповещением

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

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


Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияДокумента", ЭтотОбъект);
Параметры = Новый Структура("Ключ", ДокументСсылка);

ОткрытьФорму(ДокументСсылка.Метаданные().ПолноеИмя() + ".ФормаОбъекта", Параметры, , , , , Оповещение);

// В этой же форме должна быть процедура:
&НаКлиенте
Процедура ПослеЗакрытияДокумента(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
    // Здесь обновляем данные или выводим сообщение
КонецПроцедуры

Выясним преимущества такого подхода: программа не «зависает» в ожидании закрытия окна, а продолжает работу. Как только пользователь закончит работу с документом, управление вернется в указанную вами процедуру.

Резюме

Для открытия формы объекта с неизвестным заранее типом в 1С:Предприятии 8.3:

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

Соблюдение этих простых правил сделает ваш код более надежным, быстрым и соответствующим современным стандартам разработки 1С.

← На главную