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

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

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

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

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

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

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

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

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

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

Типичный сценарий, где обычные формы ещё встречаются, — старые конфигурации вроде «Управление производственным предприятием 1.3» или самописные решения, созданные до массового перехода на платформу 8.2–8.3. Пока такая конфигурация не переведена на управляемое приложение, пользователи вынуждены работать через толстый клиент, что ограничивает удалённый доступ и публикацию базы через веб-сервер.

Как устроена управляемая форма

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

Данные формы хранятся в реквизитах формы, а не в элементах. Основной реквизит (например, «Объект» для формы документа) представляет собой данные объекта, сериализованные в специальный формат. На клиенте доступна только «проекция» этих данных — изменить объект базы напрямую нельзя, для записи нужен серверный вызов.

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

Разделение кода на клиентский и серверный

Это самое трудное отличие для тех, кто переходит с обычных форм. В обычной форме можно было в одном обработчике нажатия кнопки и изменить элементы на форме, и записать объект в базу. В управляемой форме такой код не скомпилируется: клиентский обработчик не имеет доступа к объектам базы и к большинству прикладных типов.

Правильный шаблон такой: клиентский обработчик собирает данные и вызывает серверную процедуру, серверная процедура работает с объектами (запросы, документы, проведение), а результат возвращается на клиент через параметры или через реквизиты формы. Каждый серверный вызов — это сетевой обмен, поэтому частые «мелкие» вызовы сервера из цикла заметно замедляют форму.

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

&НаСервере
Процедура ЗаполнитьЦеныНаСервере()
    // Здесь доступны запросы и прикладные объекты
КонецПроцедуры

Директива &НаСервереБезКонтекста используется, когда серверной процедуре не нужны данные формы: она получает параметры и возвращает результат. Такие вызовы дешевле, потому что платформа не сериализует весь контекст формы туда и обратно. Для тяжёлых операций с данными формы применяют методы РеквизитФормыВЗначение() и ЗначениеВРеквизитФормы().

Сравнение ключевых характеристик

КритерийОбычная формаУправляемая форма
Режим запускаОбычное приложение, толстый клиентУправляемое приложение, тонкий, веб- и мобильный клиенты
Построение интерфейсаРучное размещение элементов с координатамиДекларативное описание, автокомпоновка платформой
Контекст исполненияВесь код на клиентеРазделение: клиент / сервер, директивы компиляции
Доступ к данным объектаПрямой, из модуля формыЧерез реквизиты формы и серверные вызовы
Работа в веб-клиентеНетДа
Актуальность для новых разработокНе рекомендуетсяСтандарт разработки

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

Как определить, какие формы используются в конфигурации

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

На уровне отдельного объекта тип формы виден в конфигураторе: у справочника или документа в ветке «Формы» обычная и управляемая формы хранятся как разные объекты с разной внутренней структурой. Визуально управляемая форма открывается в редакторе с панелями «Реквизиты», «Команды», «Элементы», а обычная — как макет с размещёнными на нём элементами.

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

Как проверить режим работы

Свойство конфигурации «Основной режим запуска»
Норма

Управляемое приложение

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

Обычное приложение — веб-клиент недоступен

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

Форма открывается и работает

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

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

Редактор формы в конфигураторе
Норма

Панели «Реквизиты» и «Команды» — управляемая форма

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

Макет с координатным размещением элементов — обычная

Миграция с обычных форм на управляемые

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

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

Порядок перевода формы
  1. 1
    Создайте управляемую форму объекта в конфигураторе
  2. 2
    Перенесите данные в реквизиты формы и настройте элементы
  3. 3
    Разделите код: интерфейс — на клиенте, работа с базой — на сервере
  4. 4
    Проверьте форму в тонком клиенте и в веб-клиенте
  5. 5
    Удалите или отключите старую обычную форму после приёмки

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

Типичные ошибки
01
Вызов сервера в цикле из клиентского кода — форма «зависает» из-за множества сетевых обменов; собирайте данные пакетом и вызывайте сервер один раз
02
Попытка обратиться к объекту базы из клиентского контекста — ошибка компиляции; используйте серверную процедуру
03
Использование модальных окон без учёта режима модальности — в веб-клиенте модальные вызовы блокируются; применяйте описания оповещений
04
Хранение промежуточных данных в элементах формы вместо реквизитов — данные теряются при серверных вызовах
05
Копирование кода из обычной формы без переработки контекстов — непредсказуемые ошибки на этапе выполнения

Отдельная группа ошибок связана с производительностью. Управляемая форма при каждом серверном вызове с контекстом передаёт данные формы на сервер и обратно. Если форма содержит большие табличные части, такие вызовы становятся заметно дорогими. Оптимизация сводится к сокращению числа вызовов, использованию &НаСервереБезКонтекста и переносу тяжёлой логики в общие модули.

При отладке управляемой формы включайте в настройках отладки и клиентский, и серверный контексты, иначе серверные процедуры будут «проскакивать» мимо точек останова. Это одна из первых причин, по которой начинающие разработчики решают, что код «не выполняется».
ПЗ
Практическое замечание

Что выбрать для новой разработки

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

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

Разрабатывается новая конфигурация или новый объектИспользуйте только управляемые формы и управляемое приложение
Нужен доступ через браузер или с мобильных устройствУправляемые формы обязательны — обычные в веб-клиенте не работают
Поддерживается старая конфигурация на обычном приложенииОставляйте обычные формы до плановой миграции, новые доработки по возможности делайте управляемыми
Планируется переход на свежий релиз типовой конфигурацииПланируйте полную миграцию на управляемые формы — типовые решения давно переведены на них

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

Итог

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

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

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

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

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

Что делает директива &НаСервереБезКонтекста?

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

Почему после перевода конфигурации на управляемый режим часть окон перестала открываться?

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

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

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

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

Сначала выделите в старом модуле код, работающий с базой (запросы, запись объектов, проведение), и перенесите его в серверные процедуры или общие модули. Интерфейсную логику — видимость элементов, оформление, реакцию на действия пользователя — оставьте в клиентских процедурах. После переноса проверьте форму в тонком и веб-клиенте, потому что часть методов, доступных на клиенте обычной формы, в управляемой недоступна.

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

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