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