Как получить управляемую форму по ссылке в 1С 8.3

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

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

Базовый механизм получения формы

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

Рассмотрим стандартный пример кода, который выполняется на стороне клиента:


// Предположим, у нас есть переменная СсылкаНаДокумент
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
ФормаДокумента = ПолучитьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);

// Теперь форма получена, и мы можем вызвать её экспортный метод
ФормаДокумента.ОбновитьДанныеНаФорме();

// Если форму нужно показать пользователю
ФормаДокумента.Открыть();

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

Различие между ПолучитьФорму и ОткрытьФорму

Часто возникает вопрос: почему нельзя просто использовать ОткрытьФорму? Выясним разницу. Метод ОткрытьФорму является «быстрым» — он создает форму и сразу выводит её на экран. Метод ПолучитьФорму дает разработчику контроль. Мы получаем ссылку на объект формы до того, как пользователь её увидит. Это позволяет:

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

Ограничения контекста: Клиент против Сервера

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

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

Уникальность формы и предотвращение дублирования окон

Проанализируем ситуацию, когда код выполняется несколько раз. Если мы будем просто вызывать ПолучитьФорму с параметром Ключ, платформа может создавать новые окна для одного и того же документа. Чтобы этого избежать, необходимо использовать четвертый параметр метода — Уникальность.

Посмотрим на улучшенный пример:


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

Форма = ПолучитьФорму(ИмяФормы, ПараметрыФормы, , УникальныйКлюч);
Форма.Открыть();

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

Работа с данными формы на сервере (FormDataToValue)

Иногда форма нужна не для красоты, а для того, чтобы получить данные, которые пользователь уже ввел, но еще не сохранил. В этом случае получение формы на клиенте — это только первый шаг. Чтобы обработать эти «грязные» данные на сервере, используется механизм преобразования.

Разберем по шагам этот процесс:

  1. На клиенте мы имеем объект ЭтаФорма или форму, полученную по ссылке.
  2. При вызове серверной процедуры данные формы (обычно это реквизит Объект) передаются автоматически.
  3. На сервере мы используем метод ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.ИмяДокумента")).

Это позволяет работать с данными в памяти так же, как с обычным объектом документа, выполнять проверки и расчеты, не записывая их преждевременно в базу данных.

Альтернативный подход: Оповещения

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

Вместо того чтобы искать форму и вызывать её методы, можно использовать команду Оповестить("ОбновитьДанные", СсылкаНаДокумент);. В самой форме документа в процедуре ОбработкаОповещения прописывается реакция на это событие. Это делает код более «чистым» и снижает зависимость модулей друг от друга.

Заключение

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

← На главную