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