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

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

Чем отличаются управляемые формы от обычных в 1С

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

Обычные и управляемые формы — это два разных механизма построения интерфейса в платформе 1С:Предприятие. Обычные формы появились в версии 8.0 и работали по принципу «всё на клиенте»: вся логика, данные и отрисовка выполнялись на компьютере пользователя. Управляемые формы введены с версии 8.2 и построены на другой архитектуре: форма описывается декларативно, а платформа сама решает, как её отрисовать на толстом, тонком или веб-клиенте.

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

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

Архитектура: где выполняется код и рисуется интерфейс

В обычной форме разработчик вручную размещает элементы на макете: кнопки, поля, табличные части имеют фиксированные координаты и размеры. Весь модуль формы исполняется на клиенте, а запросы к данным отправляются напрямую. Такая модель проста для понимания, но требует толстого клиента и плохо переносится на другие способы доступа.

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

Модуль управляемой формы разделён директивами компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Данные формы хранятся в специальных реквизитах, а при серверном вызове сериализуются и передаются между клиентом и сервером.

Ключевые отличия в одной таблице

КритерийОбычная формаУправляемая форма
Описание интерфейсаКоординаты и размеры элементов вручнуюДекларативно, авторазмещение платформой
Исполнение кодаВесь модуль на клиентеРазделение на клиентскую и серверную части
Поддерживаемые клиентыТолько толстый клиентТолстый, тонкий, веб-клиент
Работа с даннымиОбъектные типы доступны напрямуюДанные формы, объектные типы только на сервере
Режим запуска конфигурацииОбычное приложениеУправляемое приложение
Модальные окнаРазрешеныЗапрещены, используются оповещения

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

Как отличается код: директивы и работа с данными

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

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

bsl
&НаКлиенте
Процедура ЗаписатьДокумент(Команда)
    ЗаписатьДокументНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаписатьДокументНаСервере()
    ДокОбъект = РеквизитФормыВЗначение("Объект");
    ДокОбъект.Записать();
    ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
КонецПроцедуры

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

Совместимость и режимы запуска конфигурации

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

Обратная ситуация тоже возможна: управляемые формы могут открываться в толстом клиенте, запущенном в режиме обычного приложения, но это нестандартный сценарий. Типовые современные конфигурации (например, на базе БСП) рассчитаны только на управляемое приложение и тонкий/веб-клиент.

Когда какие формы выбирать

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

Сравнение вариантов

Обычные формы

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

Управляемые формы

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

Автогенерируемые формы

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

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

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

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

Порядок миграции формы
  1. 1
    Создайте у объекта новую форму и укажите для неё тип «Управляемая форма»
  2. 2
    Перенесите реквизиты и элементы, ориентируясь на дерево элементов, а не на координаты
  3. 3
    Разнесите код модуля по директивам: интерфейсная логика — &НаКлиенте, работа с данными — &НаСервере
  4. 4
    Замените модальные вызовы (Вопрос, ОткрытьЗначение) на неблокирующие аналоги с оповещениями
  5. 5
    Замените прямую работу с объектами на серверные процедуры с РеквизитФормыВЗначение
  6. 6
    Протестируйте форму в тонком и веб-клиенте, проверьте количество серверных вызовов

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

Типичные ошибки при миграции
01
Механический перенос кода без разделения на клиент и сервер — форма компилируется, но падает при обращении к объектным типам на клиенте
02
Серверные вызовы внутри цикла при обходе табличной части — форма «зависает» на секунды из-за сотен сетевых обменов
03
Оставленные модальные вызовы — в веб-клиенте форма перестаёт отвечать или выдаёт ошибку
04
Копирование старой компоновки элементов один в один — управляемая форма выглядит устаревшей и плохо масштабируется

Производительность и типичные проблемы

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

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

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

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

Форма открывается в тонком клиенте
Норма

Открывается без ошибок, все элементы на месте

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

Ошибки компиляции модуля или пустые элементы — код не разнесён по директивам

Форма работает в веб-клиенте
Норма

Нет модальных окон и блокировок, интерфейс отзывчив

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

Появляются ошибки о модальности или форма зависает

Скорость открытия
Норма

Форма открывается за время, комфортное для пользователя, серверных вызовов немного

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

Заметная пауза, в замере десятки серверных вызовов

Запись объекта
Норма

Запись выполняется в серверной процедуре, данные на форме обновляются

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

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

Часто задаваемые вопросы

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

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

Почему в управляемой форме недоступен ДокументОбъект на клиенте?

Объектные типы требуют доступа к базе данных и существуют только на сервере. Клиент работает с данными формы — специальными сериализуемыми структурами. Для работы с объектом используют серверную процедуру и методы РеквизитФормыВЗначение и ЗначениеВРеквизитФормы.

Что делать, если старая конфигурация целиком на обычных формах?

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

Как заменить модальный вызов Вопрос() в управляемой форме?

Используйте метод ПоказатьВопрос с передачей описания оповещения — процедуры, которая получит результат после ответа пользователя. Логика продолжения переносится в эту процедуру-обработчик, а не пишется после вызова, как в модальном варианте.

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

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

Нужно ли изучать обычные формы новому разработчику?

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

Итог

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

Обычные формы работают только на толстом клиенте и исполняют весь код на клиенте; управляемые — декларативны, делят код на клиент и сервер и поддерживают тонкий и веб-клиент. Для новой разработки используются только управляемые формы, а миграция старых форм выполняется вручную с переработкой кода и заменой модальных вызовов.