Разработка и Конфигурация · 13 мин
Как запустить управляемую форму 1С в обычном режиме
Как открыть управляемую форму 1С в обычном приложении: внешние обработки, режим запуска, толстый клиент, типовые приёмы и ограничения. Пошаговая инструкция с примерами кода.
Управляемые формы появились в платформе 1С:Предприятие 8.2, и с тех пор разработчики регулярно сталкиваются с обратной задачей: конфигурация работает в обычном приложении, а форму нужно открыть именно управляемую — например, чтобы показать современный интерфейс отчёта, использовать внешнюю обработку с управляемой формой или переиспользовать готовый механизм из управляемого режима. Платформа такую возможность допускает, но с рядом условий и ограничений, которые нужно понимать до начала работы.
Ключевой момент: управляемая форма может открыться в сеансе обычного приложения только в том случае, если клиент запущен в режиме, который технически поддерживает управляемые формы, — это толстый клиент обычного приложения. В тонком и веб-клиенте обычное приложение не работает вовсе, поэтому вся схема строится вокруг толстого клиента. Дальше задача сводится к тому, чтобы форма была создана как управляемая, а код её открытия вызывался корректным способом.
Ниже разобраны все рабочие способы: от простого запуска внешней обработки с управляемой формой до программного открытия формы объекта конфигурации из обычного приложения, с примерами кода, типичными ошибками и проверками результата.
Когда это вообще возможно: условия и ограничения платформы
Прежде чем писать код, убедитесь, что окружение соответствует минимальным требованиям. Управляемые формы в сеансе обычного приложения поддерживаются только толстым клиентом. Если пользователи работают в тонком клиенте или через веб-браузер, обычное приложение там просто не запускается, и вся схема теряет смысл — в таком случае нужно либо переходить на управляемый режим целиком, либо делать обычную форму.
Второе условие — у объекта конфигурации должна существовать управляемая форма. Если у справочника или документа создана только обычная форма, платформа в обычном приложении откроет именно её, а попытка программно получить управляемую форму завершится ошибкой. Для внешних обработок аналогично: при создании формы обработки в конфигураторе нужно явно выбрать тип «Управляемая форма».
Третий нюанс — режим использования модальности. В управляемых формах модальные вызовы (ОткрытьМодально, Вопрос, Предупреждение без обработчика) либо запрещены, либо работают иначе, в зависимости от настроек конфигурации. Если в коде управляемой формы есть модальные вызовы, а в свойствах конфигурации установлен запрет модальности, форма упадёт с ошибкой уже при открытии.
Можно открывать управляемые формы программно и через внешние обработки
Схема неприменима, нужна управляемая форма в управляемом режиме
Создайте управляемую форму объекта в конфигураторе
Проверьте режим использования модальности в свойствах конфигурации
Способ 1. Открыть внешнюю обработку с управляемой формой
Самый простой сценарий, который не требует изменения конфигурации. Создайте внешнюю обработку, добавьте ей форму и в мастере создания формы выберите тип «Управляемая». Затем в толстом клиенте обычного приложения откройте файл через меню «Файл → Открыть». Платформа сама определит тип формы и отобразит её в управляемом виде — в отдельном окне с характерным для управляемого интерфейса оформлением.
Если обработку нужно открывать программно из кода обычного приложения, используйте объектную модель внешних обработок:
Обработка = ВнешниеОбработки.ПолучитьФорму("C:\Обработки\МояОбработка.epf", "Форма");
Обработка.Открыть();
Здесь важно, что метод ПолучитьФорму() у внешних обработок возвращает именно ту форму, которая указана вторым параметром. Если имя формы не указано, подставляется основная форма обработки. Если основная форма у обработки управляемая — откроется управляемая.
Способ 2. Программно открыть управляемую форму объекта конфигурации
Для объектов конфигурации (справочников, документов, отчётов, обработок) в обычном приложении доступен глобальный метод ПолучитьФорму(), который умеет возвращать управляемую форму, если она существует и запрошена по имени. Типовой вызов выглядит так:
Форма = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлементаУправляемая");
Форма.Открыть();
Имя формы указывается полным путём: вид объекта, имя объекта, слово «Форма» и имя конкретной формы, как оно задано в конфигураторе. Если нужно открыть форму конкретного элемента, а не новую, передайте параметр Ключ:
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент);
Форма = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлементаУправляемая", ПараметрыФормы);
Форма.Открыть();
Обратите внимание: ПолучитьФорму() в этом контексте возвращает объект управляемой формы, и дальше с ним работают как с обычной управляемой формой — через Открыть() или ОткрытьМодально() (если модальность разрешена). Свойства и методы обычной формы (например, ЭлементыФормы) у этого объекта отсутствуют.
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент);
Форма = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлементаУправляемая", ПараметрыФормы);
Если Форма <> Неопределено Тогда
Форма.Открыть();
Иначе
Предупреждение("Управляемая форма не найдена");
КонецЕсли;Способ 3. Запустить всю конфигурацию в нужном режиме
Иногда задача ставится шире: не отдельную форму открыть, а заставить конфигурацию с управляемыми формами работать в обычном режиме целиком, либо наоборот — проверить, как управляемое приложение поведёт себя у пользователя обычного режима. Здесь работают настройки конфигурации и параметры запуска.
В свойствах конфигурации есть параметр «Основной режим запуска» — он определяет, какой клиент стартует по умолчанию: «Обычное приложение», «Управляемое приложение» или «Выбирать автоматически». Для отладки удобнее задавать режим принудительно в командной строке или в свойствах базы в списке информационных баз:
/RunModeOrdinaryApplication— принудительный запуск толстого клиента в режиме обычного приложения;/RunModeManagedApplication— принудительный запуск в управляемом режиме;- параметр
RunMode=OrdinaryApplicationв файле настроек списка баз (v8i) даёт тот же эффект без ярлыка.
Учтите, что если конфигурация полностью переведена на управляемый интерфейс (свойство «Режим использования модальности», командный интерфейс рабочего стола и т.д.), то в обычном приложении она может выглядеть пустой: панели разделов не будет, откроется только главное меню. Это нормальное поведение, а не ошибка — обычное приложение не отрисовывает управляемый командный интерфейс.
Как выбрать действие
Типичные ошибки и как их избежать
Самая частая проблема — ошибка «Форма не найдена» или «Ошибка при вызове метода контекста (ПолучитьФорму)». Причины почти всегда одни и те же: неверно указано полное имя формы (пропущено слово «Форма» в пути или опечатка в имени), либо форма с таким именем существует, но имеет тип «Обычная», а не «Управляемая». Проверяется это в конфигураторе: откройте список форм объекта и посмотрите тип каждой формы в дереве метаданных.
Вторая группа ошибок связана со смешением объектных моделей. Код внутри управляемой формы пишется в другой парадигме: директивы &НаКлиенте и &НаСервере, отсутствие ЭлементыФормы, другой состав событий (ПриСозданииНаСервере вместо ПередОткрытием). Если разработчик копирует в управляемую форму код из обычной, форма либо не компилируется, либо падает при открытии. Переносить логику нужно с адаптацией, а не дословно.
Третья ловушка — попытка открыть управляемую форму модально через ОткрытьМодально() при запрещённой модальности. В управляемой парадигме вместо этого используется ОткрытьФорму() с описанием оповещения о закрытии. Если конфигурация работает в режиме «Не использовать» для модальности, перепишите вызов на асинхронный.
Как проверить, что всё отработало правильно
После открытия формы убедитесь, что перед вами действительно управляемая форма, а не обычная. Визуальные признаки: у управляемой формы нет классической панели инструментов формы обычного приложения, командная панель расположена вверху и содержит кнопки в стиле управляемого интерфейса, а заголовок окна формируется автоматически из представления объекта. Если форма выглядит как стандартное окно обычного приложения — открылась обычная форма, и нужно проверять имя формы в вызове.
Для программной проверки в отладчике посмотрите тип возвращаемого объекта: у управляемой формы это «УправляемаяФорма» (ManagedForm), у обычной — «Форма» (Form). Это надёжный способ убедиться в результате, не полагаясь на внешний вид.
Также проверьте поведение при повторном открытии: управляемые формы по умолчанию не допускают дублирования окна одного и того же объекта с тем же ключом — повторный вызов активирует уже открытое окно. Если для вашего сценария нужны независимые копии, добавляйте в параметры уникальный ключ уникальности.
Как проверить результат
УправляемаяФорма (ManagedForm)
Форма (Form) — открылась обычная форма
Командная панель сверху, стиль управляемого интерфейса
Классическая панель инструментов обычного приложения
Активируется уже открытое окно
Открывается множество копий без необходимости
Форма показывает данные переданного элемента
Открывается пустая форма нового элемента
Ограничения и когда лучше выбрать другой путь
Смешанная схема — это компромисс, и у неё есть границы. Внутри управляемой формы, открытой из обычного приложения, работает серверный вызовный контекст управляемого приложения: директивы &НаСервере выполняются на сервере (или в отдельном контексте толстого клиента), и обмен данными между этой формой и вызвавшим её обычным кодом ограничен. Нельзя, например, напрямую обратиться из управляемой формы к объектам обычной формы-родителя.
Если управляемых форм в конфигурации становится много, а обычное приложение остаётся только «обёрткой», это верный признак того, что пора планировать полный переход на управляемый режим. Поддержка двух парадигм одновременно удваивает трудоёмкость доработок: каждую форму и каждый механизм приходится проверять в двух режимах.
Обратная ситуация — когда нужно открыть обычную форму из управляемого приложения — невозможна в принципе: тонкий и веб-клиенты обычные формы не отображают. Поэтому при постепенной миграции правильное направление всегда одно: из обычного приложения открывать управляемые формы, постепенно увеличивая их долю.
Ответы на частые вопросы
Можно ли открыть управляемую форму в тонком клиенте обычного приложения?
Нет. Тонкий клиент не поддерживает обычное приложение в принципе — он работает только с управляемыми формами в управляемом режиме. Смешанная схема возможна исключительно в толстом клиенте, запущенном в режиме обычного приложения.
Почему ПолучитьФорму() возвращает ошибку, хотя форма есть?
Чаще всего неверно указан путь: полное имя должно выглядеть как «Справочник.Имя.Форма.ИмяФормы». Также проверьте, что форма создана именно как управляемая — обычная форма с тем же именем не подойдёт, и платформа либо вернёт ошибку, либо откроет обычную форму вместо управляемой.
Как передать параметры в управляемую форму из обычного кода?
Через второй параметр ПолучитьФорму() — структуру с параметрами. Стандартный параметр «Ключ» передаёт ссылку на открываемый объект, произвольные параметры обрабатываются в обработчике ПриСозданииНаСервере управляемой формы через коллекцию Параметры.
Работает ли ОткрытьМодально() для управляемой формы в обычном приложении?
Только если в свойствах конфигурации разрешено использование модальности. При запрещённой модальности вызов завершится исключением. Рекомендуемый подход — ОткрытьФорму() с описанием оповещения о закрытии, это работает в любом режиме модальности.
Почему управляемая конфигурация в обычном режиме открывается с пустым окном?
Обычное приложение не отображает управляемый командный интерфейс: панель разделов, рабочий стол и подсистемы там не отрисовываются. Доступны только главное меню и программное открытие форм. Это ограничение платформы, а не ошибка конфигурации.
Можно ли из управляемой формы обратиться к данным обычной формы, которая её открыла?
Напрямую — нет, это разные объектные модели и контексты. Передавайте нужные данные через параметры при открытии, а результат возвращайте через оповещение о закрытии или через временное хранилище (ПоместитьВоВременноеХранилище с передачей адреса).
Что важно запомнить
Управляемая форма в обычном режиме открывается только в толстом клиенте обычного приложения — через ПолучитьФорму() с полным именем управляемой формы или через внешнюю обработку с управляемой формой. Проверяйте тип формы в конфигураторе, избегайте модальных вызовов и переносите код с адаптацией под управляемую парадигму, а не дословно.