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

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

Как в модуле менеджера 1С открыть форму

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

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

На практике задача решается двумя путями. Первый — вызвать открытие формы из клиентского контекста (модуль команды, обработчик события формы, общий клиентский модуль), передав туда данные, подготовленные в модуле менеджера. Второй — использовать методы ОткрытьФорму() или ПолучитьФорму() в клиентском коде, ссылаясь на форму через имя вида «Справочник.Номенклатура.Форма.ФормаЭлемента».

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

Почему модуль менеджера не может открыть форму напрямую

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

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

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

Открытие формы через ОткрытьФорму() из клиентского кода

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

Типичный сценарий: в модуле менеджера есть серверная функция, которая подбирает или создаёт объект, а клиентская процедура открывает его форму. Разделение выглядит так:

// Модуль менеджера документа (сервер)

Функция НайтиПоследнююРеализацию(Контрагент) Экспорт

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

...

Возврат СсылкаНаДокумент;

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

// Клиентский модуль (например, модуль команды)

&НаКлиенте

Процедура ОткрытьПоследнююРеализацию(Команда)

Ссылка = НайтиПоследнююРеализациюНаСервере(Контрагент);

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

ПараметрыФормы = Новый Структура("Ключ", Ссылка);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента", ПараметрыФормы);

Иначе

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

КонецЕсли;

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

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

Порядок действий
  1. 1
    В модуле менеджера создайте экспортную серверную функцию, возвращающую ссылку или структуру данных
  2. 2
    В форме, откуда нужно открытие, добавьте серверную процедуру-обёртку (&НаСервереБезКонтекста), вызывающую функцию модуля менеджера
  3. 3
    В клиентской процедуре (&НаКлиенте) вызовите обёртку, получите результат
  4. 4
    Сформируйте структуру параметров и вызовите ОткрытьФорму() с полным именем формы
  5. 5
    Проверьте результат: форма открылась с нужным объектом или показано понятное сообщение

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

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

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

&НаКлиенте

Процедура ПодобратьНоменклатуру(Команда)

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

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

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

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

&НаКлиенте

Процедура ПослеВыбораНоменклатуры(Результат, ДопПараметры) Экспорт

Если Результат <> Неопределено Тогда

// обработка выбранной ссылки

КонецЕсли;

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

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

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

Метод ПолучитьФорму() и когда он нужен

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

&НаКлиенте

Процедура ОткрытьСПодготовкой(Команда)

ФормаОбработки = ПолучитьФорму("Обработка.ЗагрузкаДанных.Форма.Форма");

ФормаОбработки.УстановитьПараметрыЗагрузки(ПодготовленныеДанные);

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

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

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

Сравнение вариантов

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

Универсальный способ: параметры, оповещения, управление уникальностью. Подходит для большинства сценариев.

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

Нужен доступ к экспортным методам формы до открытия. Держит объект формы в памяти, требует аккуратности.

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

Открывает объект в его основной форме по ссылке. Простейший вариант, когда не нужны параметры.

ПоказатьВводЗначения / ПоказатьВыборИзСписка

Для простого выбора без полноценной формы — быстрее и легче.

Открытие формы из модуля команды и общего модуля

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

&НаКлиенте

Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

Данные = ПолучитьДанныеНаСервере(ПараметрКоманды);

Если Данные.ЕстьОшибка Тогда

ПоказатьПредупреждение(, Данные.ТекстОшибки);

Возврат;

КонецЕсли;

ОткрытьФорму("Обработка.РабочееМесто.Форма.Форма",

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

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

&НаСервере

Функция ПолучитьДанныеНаСервере(ПараметрКоманды)

Возврат Обработки.РабочееМесто.ПодготовитьДанные(ПараметрКоманды);

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

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

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

Типичные ошибки и ограничения

Самая частая ошибка — попытка вызвать ОткрытьФорму() в процедуре с директивой &НаСервере или в серверном общем модуле. Компилятор выдаст ошибку о недоступности метода. Решение — перенести вызов в клиентскую процедуру, а серверную логику оставить отдельно.

Вторая группа ошибок связана с именами форм. Имя указывается строкой и не проверяется компилятором: опечатка вроде «ФормаЭлемента» вместо «Форма.ФормаЭлемента» проявится только в момент выполнения. Если форма не основная, её имя должно точно совпадать с именем в конфигураторе, с учётом регистра.

Третья проблема — передача несериализуемых данных в параметры формы или возврат их с сервера. Параметры формы должны состоять из простых типов, ссылок, структур, массивов и хранилищ значений. Попытка передать, например, результат запроса напрямую приведёт к ошибке преобразования данных.

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

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

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

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

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

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

Вызов серверной функции
Норма

Возвращается ссылка или заполненная структура

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

Неопределено, пустая структура или исключение в журнале регистрации

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

Форма открывается, объект или отбор соответствуют параметрам

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

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

Возврат выбора
Норма

Обработчик оповещения срабатывает с выбранным значением

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

Обработчик не вызывается — проверьте ЭтотОбъект как владельца и имя процедуры

Частые вопросы

Можно ли открыть форму прямо из модуля менеджера?

Нет. Модуль менеджера исполняется только на сервере, где недоступны интерфейсные методы. Открытие выполняется в клиентском коде, а модуль менеджера используется для подготовки данных, которые клиент передаст в форму.

Чем ОткрытьФорму() отличается от ОткрытьЗначение()?

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

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

Передайте в параметрах структуру с ключом «Отбор», значением которого является вложенная структура: имя поля — значение отбора. Например: Новый Структура("Отбор", Новый Структура("Организация", СсылкаНаОрганизацию)).

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

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

Как передать в форму таблицу значений?

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

Открывается вторая копия уже открытой формы — как исправить?

Задайте параметр «КлючУникальности» при вызове ОткрытьФорму(). При совпадении ключа платформа активирует существующее окно вместо создания нового. Если уникальность не нужна, по умолчанию формы с одинаковым именем и владельцем уже переиспользуются.

Итог

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

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