Разработка и Конфигурация · 12 мин
Как получить форму на тонком клиенте 1С
Как получить и открыть форму на тонком клиенте 1С: методы ПолучитьФорму и ОткрытьФорму, параметры, ограничения тонкого клиента, типичные ошибки и примеры кода.
Получение формы на тонком клиенте 1С — одна из базовых задач при разработке на управляемых формах. В отличие от толстого клиента, где доступны обычные формы и прямой доступ к данным, тонкий клиент работает только с управляемыми формами и накладывает ограничения на контекст выполнения кода. Поэтому важно понимать, какие методы доступны, где они выполняются и как передавать параметры.
В управляемом приложении используются два основных метода: ПолучитьФорму() — возвращает объект формы без её открытия, и ОткрытьФорму() — сразу показывает форму пользователю. Оба доступны на тонком клиенте, но ведут себя по-разному при передаче параметров, обработке результата и работе с модальностью.
Типичная ошибка новичков — попытаться обратиться к данным формы напрямую, как это делалось в обычных формах через Форма.Объект.Реквизит. На тонком клиенте данные формы существуют в особом виде, а серверные вызовы требуют явных директив компиляции. Ниже разобраны рабочие сценарии с примерами кода.
Чем тонкий клиент ограничивает работу с формами
Тонкий клиент 1С не выполняет код на стороне клиента, если этот код требует прямого доступа к базе данных. Все запросы, обращения к менеджерам объектов (Справочники.Номенклатура.НайтиПоКоду() и т.п.) должны выполняться на сервере. В модуле формы это реализуется через процедуры и функции с директивами &НаСервере или &НаСервереБезКонтекста.
Второе ограничение — на тонком клиенте недоступны обычные формы. Если конфигурация содержит только обычную форму объекта и запущена в режиме управляемого приложения, платформа сгенерирует управляемую форму автоматически, но её поведение и состав элементов могут отличаться от ожидаемого. Для предсказуемого результата форму нужно создать явно в конфигураторе.
Третий момент — модальность. В современных версиях платформы модальные вызовы (ОткрытьФормуМодально()) по умолчанию запрещены, и вместо них используются блокирующие окна с описанием оповещения о закрытии. Это особенно важно на тонком клиенте и в веб-клиенте, где синхронные модальные вызовы могут быть недоступны в принципе.
Метод ПолучитьФорму: синтаксис и сценарии
Метод ПолучитьФорму() возвращает объект управляемой формы, не отображая её на экране. Это позволяет перед открытием программно установить реквизиты формы, вызвать её экспортные процедуры или проверить условия. Синтаксис:
Форма = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы, Владелец, Уникальность);
Форма.Открыть();
Первый параметр — полное имя формы. Оно строится по шаблону: тип объекта, имя объекта, слово «Форма», имя конкретной формы. Если имя формы не указать (Справочник.Номенклатура.Форма), платформа возьмёт форму по умолчанию для данного вида. Для документов, регистров и отчётов шаблон аналогичен: Документ.РеализацияТоваров.Форма.ФормаДокумента.
Второй параметр — структура с параметрами формы. Стандартные параметры, например Ключ (ссылка на редактируемый объект) или Отбор для форм списков, платформа обрабатывает сама. Произвольные параметры доступны в обработчике ПриСозданииНаСервере через коллекцию Параметры, если они объявлены в редакторе формы как ключевые или обычные параметры.
&НаКлиенте
Процедура ОткрытьКарточку(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", ТекущийЭлементСправочника);
Форма = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);
Форма.Открыть();
КонецПроцедурыМетод ОткрытьФорму: когда он удобнее
Если промежуточная настройка формы не нужна, проще сразу вызвать ОткрытьФорму(). Метод принимает те же параметры, что и ПолучитьФорму(), плюс дополнительные: описание оповещения о закрытии, режим открытия окна (независимый, блокирующий окно владельца, блокирующий весь интерфейс).
&НаКлиенте
Процедура ОбработкаКоманды(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормы", ЭтотОбъект);
ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", , ЭтотОбъект, , , , Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияФормы(Результат, ДополнительныеПараметры) Экспорт
// Обработка результата закрытия
КонецПроцедуры
Обратите внимание на экспортность процедуры обработчика оповещения: без ключевого слова Экспорт платформа не сможет вызвать её при закрытии формы, и вы получите ошибку времени выполнения. Это одна из самых частых причин «неработающего» кода на тонком клиенте.
ПолучитьФорму или ОткрытьФорму
Нужен доступ к объекту формы до показа: установка реквизитов, вызов экспортных методов, условное открытие. Минус — больше кода и риск забыть вызвать Открыть().
Стандартный сценарий показа формы с параметрами и оповещением о закрытии. Минус — нет доступа к форме до её создания.
Когда нужно просто показать объект (ссылку) в его форме по умолчанию без параметров. Не подходит, если требуется конкретная форма или отбор.
Передача и приём параметров формы
Параметры передаются структурой и принимаются на сервере в обработчике ПриСозданииНаСервере. Чтобы параметр не «терялся» при обновлении формы и был доступен в других обработчиках, его следует объявить в палитре свойств формы на закладке «Параметры». Ключевые параметры дополнительно влияют на уникальность формы: повторный вызов с теми же ключевыми параметрами активирует уже открытую форму вместо создания новой.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ОрганизацияОтбор") Тогда
// Используем переданное значение
ТекущаяОрганизация = Параметры.ОрганизацияОтбор;
КонецЕсли;
КонецПроцедуры
Всегда проверяйте наличие параметра через Параметры.Свойство() перед обращением: если форму откроют другим способом (например, из стандартного списка), вашего произвольного параметра в ней не будет, и прямое обращение Параметры.ОрганизацияОтбор вызовет исключение.
Серверные вызовы из клиентского кода формы
Когда при получении или открытии формы нужны данные из базы (например, найти ссылку по коду и передать её как Ключ), логика делится на две части. Клиентская процедура вызывает серверную функцию, та возвращает примитивные данные или ссылку, после чего клиент открывает форму.
&НаКлиенте
Процедура ОткрытьПоШтрихкоду(Команда)
НайденнаяСсылка = НайтиПоШтрихкодуНаСервере(Штрихкод);
Если НайденнаяСсылка = Неопределено Тогда
ПоказатьПредупреждение(, "Товар не найден");
Возврат;
КонецЕсли;
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента",
Новый Структура("Ключ", НайденнаяСсылка));
КонецПроцедуры
&НаСервереБезКонтекста
Функция НайтиПоШтрихкодуНаСервере(Штрихкод)
// Запрос к базе, возврат ссылки или Неопределено
КонецФункции
Директива &НаСервереБезКонтекста предпочтительнее для методов, которым не нужны данные текущей формы: такой вызов не сериализует данные формы на сервер и обратно, что заметно быстрее на тонком клиенте, особенно при медленном канале связи.
Типичные ошибки и как их диагностировать
Ошибка «Форма не найдена» почти всегда означает опечатку в полном имени или отсутствие формы в конфигурации. Проверьте, что форма создана у объекта, что её имя совпадает с указанным в строке вызова, и что тип объекта указан корректно (например, для внешней обработки путь другой: ВнешняяОбработка.ИмяОбработки.Форма.Форма).
Ошибка «Метод объекта не обнаружен» при обращении к процедуре формы после ПолучитьФорму() означает, что процедура не экспортная или находится не в том контексте. Экспортные клиентские процедуры формы доступны через объект формы, серверные процедуры с контекстом формы из клиентского кода напрямую недоступны.
Если форма открывается пустой, хотя передан Ключ, убедитесь, что передана именно ссылка, а не строковое представление или структура. Тип значения в структуре параметров имеет значение: платформа не приводит типы автоматически.
Проверка результата и отладка
Быстрый способ проверить правильность пути к форме — открыть её из конфигуратора или через команду «Перейти по ссылке». В отладчике поставьте точку останова в ПриСозданииНаСервере целевой формы: если выполнение туда не попадает, проблема в имени формы или параметрах уникальности; если попадает, но данные пустые — проблема в составе переданных параметров.
Для диагностики параметров временно выведите их состав: в ПриСозданииНаСервере переберите коллекцию Параметры и запишите ключи в журнал регистрации или выведите через Сообщить. Это покажет, какие параметры реально дошли до формы и с какими типами.
Как проверить результат
Отладчик останавливается в обработчике
Форма не создаётся — проверяйте имя формы и параметр уникальности
Все переданные ключи присутствуют с ожидаемыми типами
Ключей нет или типы отличаются — ошибка в структуре параметров на вызывающей стороне
Активируется уже открытая форма (при совпадающей уникальности)
Открываются дубли форм — проверьте параметр Уникальность или ключевые параметры
Форма открывается без заметной паузы
Долгая пауза — ищите множественные серверные вызовы или тяжёлый код в ПриСозданииНаСервере
FAQ
Можно ли на тонком клиенте использовать ПолучитьФорму для обычной формы?
Нет. Метод ПолучитьФорму в управляемом приложении работает только с управляемыми формами. Если у объекта есть только обычная форма, платформа при открытии сгенерирует управляемую автоматически, но обратиться к ней как к объекту через ПолучитьФорму с указанием имени обычной формы не получится — нужно создать управляемую форму в конфигураторе.
Как открыть форму списка с отбором на тонком клиенте?
Передайте в параметрах структуру с ключом Отбор, содержащую вложенную структуру отбора: Новый Структура("Отбор", Новый Структура("Владелец", СсылкаНаВладельца)). Платформа применит отбор к динамическому списку формы автоматически при создании.
Почему ОткрытьФормуМодально выдаёт ошибку?
В большинстве современных конфигураций режим использования модальности отключён, и платформа запрещает модальные вызовы. Используйте ОткрытьФорму с параметром РежимОткрытияОкнаФормы.БлокироватьОкноВладельца и обработкой результата через ОписаниеОповещения.
Как вернуть значение из закрываемой формы?
В открываемой форме вызовите метод Закрыть(ВозвращаемоеЗначение). На вызывающей стороне это значение придёт первым параметром в процедуру, указанную в ОписанииОповещения. Так работает стандартный механизм выбора и подбора.
Чем отличается уникальность формы и как ею управлять?
Параметр Уникальность в ПолучитьФорму и ОткрытьФорму определяет, будет ли создана новая форма или активирована существующая. Если передать Ложь или не указывать — ищется уже открытая форма с таким же ключом; если передать произвольное уникальное значение (например, Новый УникальныйИдентификатор) — форма откроется новой каждый раз.
Можно ли получить форму внешней обработки на тонком клиенте?
Да, но сначала обработку нужно подключить на сервере (например, через ВнешниеОбработки.Создать или механизм дополнительных отчётов и обработок БСП). После подключения форма доступна по пути вида ВнешняяОбработка.ИмяОбработки.Форма.ИмяФормы. Для безопасного режима и файловых операций учитывайте ограничения профилей безопасности.
Что важно запомнить
На тонком клиенте формы получают через ПолучитьФорму или открывают через ОткрытьФорму с полным путём к управляемой форме. Параметры передаются структурой и принимаются в ПриСозданииНаСервере с проверкой через Свойство(). Доступ к данным — только через серверные процедуры, предпочтительно &НаСервереБезКонтекста. Модальность заменяется блокирующим режимом окна и оповещением о закрытии.