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

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

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

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

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

Короткий ответ: да, можно, но только при определённых условиях. Платформа 1С:Предприятие 8.2 и 8.3 поддерживает совместное использование обычных и управляемых форм в одном сеансе, если конфигурация настроена на соответствующий режим интерфейса. При этом способ открытия и ограничения зависят от режима запуска тонкого клиента и от того, как именно вызывается форма.

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

Настройка конфигурации для совместной работы форм

Первое условие — конфигурация должна допускать запуск в режиме, где обычные формы вообще могут отображаться. Откройте в конфигураторе свойства корня конфигурации и проверьте параметр «Основной режим запуска». Для смешанной работы подходят значения «Управляемое приложение и обычное приложение» или «Выбирать автоматически».

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

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

Как открыть обычную форму программно

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

ФормаОбработки = ПолучитьФорму("Обработка.МояОбработка.Форма.ОбычнаяФорма");

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

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

Для объектов данных (документов, справочников) обычная форма элемента открывается через ПолучитьФорму("Документ.Реализация.Форма.ФормаДокумента", ПараметрыФормы) с передачей ключа — ссылки на открываемый объект.

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

Открытие через ОткрытьФорму и ОткрытьЗначение

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

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

Модальное открытие и его ограничения

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

Передача параметров и обмен данными между формами

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

Обратная передача данных — классическая сложность смешанного режима. Управляемые формы используют оповещения ОписаниеОповещения, а обычные формы про них «не знают». Рабочий паттерн: обычная форма при выборе вызывает ОповеститьОВыборе(ВыбранноеЗначение), а в управляемой форме-владельце обрабатывается событие ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора). Чтобы связь сработала, обычную форму нужно открывать с указанием владельца — параметр «Владелец» в структуре параметров или параметр владельца в ПолучитьФорму().

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

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

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

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

Типичные ошибки
01
Режим запуска «Управляемое приложение» — обычная форма не открывается с ошибкой платформы
02
Обращение к форме без имени — открывается основная управляемая форма вместо обычной
03
Вызов ОткрытьМодально() при запрещённой модальности — исключение в рантайме
04
Попытка открыть обычную форму на сервере или в веб-клиенте — ошибка контекста
05
Отсутствие владельца у формы — ОповеститьОВыборе не доходит до управляемой формы

Когда лучше не открывать обычную форму, а переписать её

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

Оставлять обычную форму оправдано, когда: ею пользуются редко и только из тонкого клиента; форма содержит сложные элементы, трудно переносимые в управляемый интерфейс (например, специфические ActiveX или поля HTML со старой логикой); либо доработка не окупается из-за планируемого отказа от функционала.

Маршрут решения

Как выбрать действие

Пользователи работают только в тонком клиенте, конфигурация в смешанном режимеОткрывайте обычную форму через ПолучитьФорму() с полным именем формы
Часть пользователей в веб-клиентеКонвертируйте форму в управляемую — обычная в браузере не откроется
Нужен модальный выбор значенияИспользуйте открытие с владельцем и ОповеститьОВыборе вместо ОткрытьМодально()
Ошибка «использование обычных форм невозможно»Проверьте режим запуска и режим совместимости интерфейса в свойствах конфигурации

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

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

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

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

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

Обычная форма отображается, параметры заполнены

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

Ошибка платформы про обычные формы — проверить режим запуска

Возврат значения
Норма

ОбработкаВыбора в управляемой форме получает значение

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

Событие не срабатывает — не передан владелец формы

Права пользователя
Норма

Форма открывается под целевой ролью

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

Ошибка доступа — нет прав на объект метаданных

Итог

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

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

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

Почему возникает ошибка «Использование обычных форм в управляемом приложении невозможно»?

Причина в настройках конфигурации: основной режим запуска установлен «Управляемое приложение» либо режим совместимости интерфейса запрещает обычные формы. Измените режим запуска на «Управляемое приложение и обычное приложение» и проверьте свойства совместимости в корне конфигурации.

Можно ли открыть обычную форму в веб-клиенте?

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

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

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

ОткрытьФорму() открывает управляемую форму вместо обычной — что не так?

Скорее всего, указано имя объекта без конкретной формы, и платформа открывает основную форму, которой назначена управляемая. Укажите полный путь с именем обычной формы, например "Обработка.МояОбработка.Форма.ОбычнаяФорма".

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

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

Влияет ли открытие обычной формы на обновление типовой конфигурации?

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