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

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

Как открыть управляемую форму из обычной формы в 1С

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

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

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

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

Проверка режима запуска конфигурации

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

Если режим запуска — «Управляемое приложение» или «Выборочный», обычные формы могут сосуществовать с управляемыми, и вызов управляемой формы из обычной становится возможным. Проверить режим можно и программно через ТекущийРежимЗапуска() — функция вернёт значение системного перечисления, по которому видно, в каком приложении выполняется код.

Открытие управляемой формы через ОткрытьФорму

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

Из модуля обычной формы вызов выглядит так же, как из любого клиентского контекста управляемого приложения. Важно, чтобы код выполнялся на клиенте — например, в обработчике нажатия кнопки обычной формы:

Процедура КнопкаОткрытьНажатие(Элемент)

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

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

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

Процедура КнопкаОткрытьНажатие(Элемент)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Отбор", Новый Структура("Владелец", ТекущийКонтрагент));

ОткрытьФорму("Справочник.Договоры.Форма.ФормаСписка", ПараметрыФормы);

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

Модальное открытие и получение результата

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

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

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

Процедура ПослеВыбораЭлемента(Результат, ДопПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        СсылкаНаЭлемент = Результат;
    КонецЕсли;
КонецПроцедуры

Открытие формы конкретного объекта

Частая задача — из обычной формы открыть управляемую форму существующего элемента справочника или документа. Для этого в параметры передаётся стандартный ключ Ключ, содержащий ссылку на объект. Управляемая форма сама подхватит ссылку и отобразит объект:

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

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

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

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

Если в параметрах передать пустую ссылку нужного типа, откроется форма создания нового объекта. А параметр ЗначенияЗаполнения позволяет сразу заполнить реквизиты нового элемента — это удобно при вводе документов на основании данных из обычной формы.

Порядок действий
  1. 1
    Проверьте режим запуска конфигурации в свойствах конфигурации
  2. 2
    Убедитесь, что у объекта создана управляемая форма и известно её полное имя
  3. 3
    В обработчике обычной формы вызовите ОткрытьФорму() с именем формы и структурой параметров
  4. 4
    В управляемой форме примите параметры в обработчике ПриСозданииНаСервере
  5. 5
    Запустите сеанс в толстом клиенте и проверьте открытие, передачу параметров и возврат результата

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

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

Вторая группа ошибок связана с именами форм. Если у объекта несколько форм, нужно указывать точное имя нужной. Если форма одна и назначена основной, можно использовать короткое имя вида "Справочник.Номенклатура.ФормаОбъекта". Опечатка в имени приводит к ошибке «Форма не найдена» уже в момент выполнения.

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

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

Альтернативы, если прямое открытие невозможно

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

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

Сравнение способов открытия

ОткрытьФорму() с оповещением

Рекомендуемый способ: не требует модальности, работает в тонком и веб-клиенте. Минус — чуть сложнее код обработки результата

ОткрытьФормуМодально()

Простой код и прямой возврат значения, но требует разрешённой модальности и не работает в веб-клиенте

Обычная форма-дублёр через ПолучитьФорму()

Единственный вариант в чистом обычном приложении. Минус — поддержка двух версий форм во время миграции

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

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

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

Итог

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

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

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

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

Нет. В тонком клиенте обычные формы вообще не работают, поэтому сценарий «обычная форма открывает управляемую» возможен только в толстом клиенте, запущенном в режиме управляемого приложения.

Почему ОткрытьФорму() выдаёт ошибку «Процедура или функция не определена»?

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

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

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

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

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

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

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

Нужно ли менять режим совместимости для смешанной работы форм?

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