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

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

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

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

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

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

Ниже разобраны рабочие подходы: использование метода ПолучитьФорму, вызов серверных процедур из формы, преобразование данных формы в прикладные объекты через ДанныеФормыВЗначение, а также типовые ошибки и способы их диагностики.

Почему форму нельзя открыть напрямую на сервере

В клиент-серверной архитектуре 1С код выполняется в двух контекстах. Серверный контекст (директивы &НаСервере, серверные общие модули) не имеет доступа к пользовательскому интерфейсу: там нет окон, форм и интерактивных элементов. Клиентский контекст (&НаКлиенте) — единственное место, где форма может быть создана и показана пользователю.

Поэтому попытка вызвать ПолучитьФорму или ОткрытьФорму внутри серверной процедуры приведёт к ошибке компиляции или выполнения: методы работы с интерфейсом недоступны на сервере. Это не ограничение конкретной конфигурации, а фундаментальное свойство платформы.

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

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

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

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

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

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

Типичный сценарий с участием сервера: клиент вызывает серверную функцию, которая подбирает или создаёт объект, возвращает ссылку, а клиент открывает форму по этой ссылке:

&НаКлиенте

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

Ссылка = НайтиДокументНаСервере(НомерДокумента);

Если ЗначениеЗаполнено(Ссылка) Тогда

ОткрытьЗначение(Ссылка);

КонецЕсли;

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

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

Функция НайтиДокументНаСервере(Номер)

Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ Номер = &Номер");

Запрос.УстановитьПараметр("Номер", Номер);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Возврат Выборка.Ссылка;

КонецЕсли;

Возврат Неопределено;

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

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

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

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

Основной приём — преобразование реквизита формы типа ДанныеФормыСтруктура в прикладной объект методом РеквизитФормыВЗначение. После этого с объектом можно работать привычными методами: проводить документ, вызывать экспортные процедуры модуля объекта, записывать. Обратное преобразование выполняется через ЗначениеВРеквизитФормы.

&НаСервере

Процедура ЗаполнитьЦеныНаСервере()

ДокументОбъект = РеквизитФормыВЗначение("Объект");

ДокументОбъект.ЗаполнитьЦены(); // экспортная процедура модуля объекта

ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");

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

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

Порядок действий
  1. 1
    Определите задачу: открыть новую форму или обработать данные уже открытой
  2. 2
    Для открытия: выполните серверную логику, верните ссылку или параметры на клиент
  3. 3
    На клиенте вызовите ПолучитьФорму или ОткрытьФорму с полученными параметрами
  4. 4
    Для обработки данных: создайте процедуру &НаСервере в модуле формы
  5. 5
    Используйте РеквизитФормыВЗначение для доступа к прикладному объекту
  6. 6
    После изменений верните данные через ЗначениеВРеквизитФормы и проверьте отображение

Передача параметров и получение результата из формы

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

&НаСервере

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

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

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

КонецЕсли;

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

Для получения результата из открытой формы используется механизм оповещений: при открытии передаётся ОписаниеОповещенияОЗакрытии, а форма при закрытии возвращает значение через Закрыть(Результат). Это стандартный способ организовать диалог «открыл — выбрал — получил результат» без обращения к внутренностям чужой формы.

Частые ошибки и их причины

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

Вторая типичная проблема — обращение к реквизиту формы как к прикладному объекту без преобразования. Реквизит формы типа ДанныеФормыСтруктура не имеет методов Записать или Провести: сначала нужен вызов РеквизитФормыВЗначение. Обратная ошибка — забыть вернуть изменённые данные через ЗначениеВРеквизитФормы, из-за чего на экране остаются старые значения.

Третья группа ошибок связана с контекстом серверных вызовов: процедуры &НаСервереБезКонтекста не видят реквизиты формы и ЭтаФорма, поэтому для работы с данными формы нужна именно контекстная серверная процедура. Также нельзя передавать между клиентом и сервером несериализуемые типы — например, сами объекты форм.

Типичные ошибки
01
Вызов ПолучитьФорму на сервере — метод недоступен, перенесите открытие на клиент
02
Запись реквизита формы напрямую без РеквизитФормыВЗначение — у ДанныеФормыСтруктура нет метода Записать
03
Изменение объекта на сервере без ЗначениеВРеквизитФормы — на экране остаются старые данные
04
Использование &НаСервереБезКонтекста для работы с реквизитами формы — контекст формы недоступен
05
Передача объекта формы между клиентом и сервером — тип не сериализуется, передавайте ссылки и структуры

Выбор подхода под конкретную задачу

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

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

Для работы с данными открытой формы выбирайте контекстную серверную процедуру, если требуется доступ к прикладному объекту, и серверную процедуру без контекста, если достаточно передать ей конкретные значения (ссылку, список, структуру) — такой вызов дешевле, потому что не тянет на сервер все данные формы.

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

Как выбрать действие

Нужно открыть форму известного объектаИспользуйте на клиенте ОткрытьЗначение или ОткрытьФорму с параметром Ключ
Объект ещё нужно найти или создатьВызовите серверную функцию, верните ссылку и откройте форму на клиенте
Нужно обработать данные открытой формыСоздайте процедуру &НаСервере и используйте РеквизитФормыВЗначение
Нужен результат из открываемой формыПередайте ОписаниеОповещенияОЗакрытии и верните значение через Закрыть
Нужны только вычисления по переданным значениямИспользуйте &НаСервереБезКонтекста — вызов дешевле и не тянет данные формы

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

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

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

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

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

Открытие формы
Норма

Форма открывается, параметры применены, данные корректны

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

Ошибка «метод недоступен» или форма открывается пустой

Изменения на сервере
Норма

После серверной процедуры данные на экране обновились

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

На экране старые значения — пропущен ЗначениеВРеквизитФормы

Производительность
Норма

Один-два серверных вызова на действие пользователя

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

Серверные вызовы внутри цикла, заметные задержки

Ответы на частые вопросы

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

Нет. Метод ПолучитьФорму доступен только в клиентском контексте, потому что форма — элемент интерфейса, а интерфейс существует на клиенте. Правильный шаблон: сервер готовит данные и возвращает ссылку или структуру параметров, а клиент вызывает ПолучитьФорму или ОткрытьФорму.

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

Создайте документ в серверной функции, заполните его, запишите и верните ссылку на клиент — там откройте через ОткрытьЗначение. Альтернатива без записи: передайте в ОткрытьФорму структуру с параметром ЗначенияЗаполнения, и форма заполнится при создании.

Чем РеквизитФормыВЗначение отличается от ДанныеФормыВЗначение?

РеквизитФормыВЗначение — метод управляемой формы, преобразующий её реквизит в прикладной объект. ДанныеФормыВЗначение — глобальный метод, работающий с объектом ДанныеФормы напрямую. В модулях форм чаще используют первый вариант.

Как обратиться к другой открытой форме?

Стандартного способа нет: формы изолированы и живут на клиентах. Используйте механизм оповещений — Оповестить с именем события и параметром, а в целевой форме обработайте его в ОбработкаОповещения. Для передачи данных при открытии применяйте структуру параметров.

Почему серверная процедура не видит реквизиты формы?

Скорее всего, она объявлена с директивой &НаСервереБезКонтекста. Такие процедуры не имеют доступа к контексту формы, включая ЭтаФорма и реквизиты. Смените директиву на &НаСервере либо передавайте нужные значения параметрами.

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

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

Итог

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

Форма существует только на клиенте: ПолучитьФорму и ОткрытьФорму вызываются в клиентском контексте. Сервер готовит данные и возвращает ссылку или параметры. Для работы с данными открытой формы используйте &НаСервере с парой РеквизитФормыВЗначение и ЗначениеВРеквизитФормы. Обмен между формами — через оповещения и параметры открытия.