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

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

Как получить форму на тонком клиенте 1С

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

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

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

Типичная ошибка новичков — попытаться обратиться к данным формы напрямую, как это делалось в обычных формах через Форма.Объект.Реквизит. На тонком клиенте данные формы существуют в особом виде, а серверные вызовы требуют явных директив компиляции. Ниже разобраны рабочие сценарии с примерами кода.

Чем тонкий клиент ограничивает работу с формами

Тонкий клиент 1С не выполняет код на стороне клиента, если этот код требует прямого доступа к базе данных. Все запросы, обращения к менеджерам объектов (Справочники.Номенклатура.НайтиПоКоду() и т.п.) должны выполняться на сервере. В модуле формы это реализуется через процедуры и функции с директивами &НаСервере или &НаСервереБезКонтекста.

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

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

Метод ПолучитьФорму: синтаксис и сценарии

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

Форма = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы, Владелец, Уникальность);

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

Первый параметр — полное имя формы. Оно строится по шаблону: тип объекта, имя объекта, слово «Форма», имя конкретной формы. Если имя формы не указать (Справочник.Номенклатура.Форма), платформа возьмёт форму по умолчанию для данного вида. Для документов, регистров и отчётов шаблон аналогичен: Документ.РеализацияТоваров.Форма.ФормаДокумента.

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

bsl
&НаКлиенте
Процедура ОткрытьКарточку(Команда)
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Ключ", ТекущийЭлементСправочника);
    Форма = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);
    Форма.Открыть();
КонецПроцедуры

Метод ОткрытьФорму: когда он удобнее

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

&НаКлиенте

Процедура ОбработкаКоманды(Команда)

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

ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", , ЭтотОбъект, , , , Оповещение,

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте

Процедура ПослеЗакрытияФормы(Результат, ДополнительныеПараметры) Экспорт

// Обработка результата закрытия

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

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

ПолучитьФорму или ОткрытьФорму

ПолучитьФорму

Нужен доступ к объекту формы до показа: установка реквизитов, вызов экспортных методов, условное открытие. Минус — больше кода и риск забыть вызвать Открыть().

ОткрытьФорму

Стандартный сценарий показа формы с параметрами и оповещением о закрытии. Минус — нет доступа к форме до её создания.

ОткрытьЗначение

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

Передача и приём параметров формы

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("ОрганизацияОтбор") Тогда

// Используем переданное значение

ТекущаяОрганизация = Параметры.ОрганизацияОтбор;

КонецЕсли;

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

Всегда проверяйте наличие параметра через Параметры.Свойство() перед обращением: если форму откроют другим способом (например, из стандартного списка), вашего произвольного параметра в ней не будет, и прямое обращение Параметры.ОрганизацияОтбор вызовет исключение.

Серверные вызовы из клиентского кода формы

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

&НаКлиенте

Процедура ОткрытьПоШтрихкоду(Команда)

НайденнаяСсылка = НайтиПоШтрихкодуНаСервере(Штрихкод);

Если НайденнаяСсылка = Неопределено Тогда

ПоказатьПредупреждение(, "Товар не найден");

Возврат;

КонецЕсли;

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

Новый Структура("Ключ", НайденнаяСсылка));

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

&НаСервереБезКонтекста

Функция НайтиПоШтрихкодуНаСервере(Штрихкод)

// Запрос к базе, возврат ссылки или Неопределено

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

Директива &НаСервереБезКонтекста предпочтительнее для методов, которым не нужны данные текущей формы: такой вызов не сериализует данные формы на сервер и обратно, что заметно быстрее на тонком клиенте, особенно при медленном канале связи.

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

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

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

Если форма открывается пустой, хотя передан Ключ, убедитесь, что передана именно ссылка, а не строковое представление или структура. Тип значения в структуре параметров имеет значение: платформа не приводит типы автоматически.

Типичные ошибки
01
Обращение к Параметры.ИмяПараметра без проверки Свойство() — исключение при открытии формы стандартным способом
02
Забытое слово Экспорт у обработчика оповещения о закрытии — ошибка времени выполнения при закрытии формы
03
Серверный вызов в цикле на клиенте — резкое падение скорости работы на тонком клиенте
04
Использование ОткрытьФормуМодально при отключённой модальности — ошибка платформы; нужен режим окна и описание оповещения
05
Передача несериализуемых объектов (Запрос, ТаблицаЗначений как объект) в параметрах — ошибка передачи данных между клиентом и сервером

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

Быстрый способ проверить правильность пути к форме — открыть её из конфигуратора или через команду «Перейти по ссылке». В отладчике поставьте точку останова в ПриСозданииНаСервере целевой формы: если выполнение туда не попадает, проблема в имени формы или параметрах уникальности; если попадает, но данные пустые — проблема в составе переданных параметров.

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

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

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

Срабатывает ли ПриСозданииНаСервере (точка останова)
Норма

Отладчик останавливается в обработчике

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

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

Состав коллекции Параметры
Норма

Все переданные ключи присутствуют с ожидаемыми типами

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

Ключей нет или типы отличаются — ошибка в структуре параметров на вызывающей стороне

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

Активируется уже открытая форма (при совпадающей уникальности)

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

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

Скорость открытия на тонком клиенте
Норма

Форма открывается без заметной паузы

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

Долгая пауза — ищите множественные серверные вызовы или тяжёлый код в ПриСозданииНаСервере

FAQ

Можно ли на тонком клиенте использовать ПолучитьФорму для обычной формы?

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

Как открыть форму списка с отбором на тонком клиенте?

Передайте в параметрах структуру с ключом Отбор, содержащую вложенную структуру отбора: Новый Структура("Отбор", Новый Структура("Владелец", СсылкаНаВладельца)). Платформа применит отбор к динамическому списку формы автоматически при создании.

Почему ОткрытьФормуМодально выдаёт ошибку?

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

Как вернуть значение из закрываемой формы?

В открываемой форме вызовите метод Закрыть(ВозвращаемоеЗначение). На вызывающей стороне это значение придёт первым параметром в процедуру, указанную в ОписанииОповещения. Так работает стандартный механизм выбора и подбора.

Чем отличается уникальность формы и как ею управлять?

Параметр Уникальность в ПолучитьФорму и ОткрытьФорму определяет, будет ли создана новая форма или активирована существующая. Если передать Ложь или не указывать — ищется уже открытая форма с таким же ключом; если передать произвольное уникальное значение (например, Новый УникальныйИдентификатор) — форма откроется новой каждый раз.

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

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

Итог

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

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