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