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

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

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

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

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

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

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

Что такое обычная форма и где она работает

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

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

Сегодня обычные формы встречаются в старых конфигурациях (УПП, «Управление торговлей» 10.3, «Бухгалтерия» 1.6/2.0), которые запускаются в режиме обычного приложения. Платформа 8.3 их по-прежнему поддерживает, но новые разработки на них не ведутся.

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

Управляемая форма появилась в платформе 8.2 вместе с новой клиент-серверной моделью. Разработчик описывает не пиксельное расположение элементов, а логическую структуру: какие реквизиты выводить, в какие группы они объединены, какие команды доступны. Платформа сама решает, как отрисовать эту структуру в толстом, тонком, веб- или мобильном клиенте, с учётом разрешения экрана и возможностей устройства.

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

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

Ключевые отличия в архитектуре и коде

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

КритерийОбычная формаУправляемая форма
Описание интерфейсаЖёсткий макет, ручное размещение элементовДекларативная структура, автокомпоновка платформой
КлиентыТолько толстый клиентТолстый, тонкий, веб-, мобильный клиенты
Контекст исполненияЕдиный, на клиентеРазделён: клиент и сервер, директивы компиляции
Работа с объектамиПрямой доступ к прикладным объектам из модуля формыТолько через данные формы и серверные вызовы
Обновление интерфейсаЭлементы обновляются вручную или автоматически по привязкеДекларативные связи, отображение перестраивается платформой
АктуальностьУстаревший механизм, поддерживается для совместимостиСтандарт разработки на платформе 8.3

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

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// доступен контекст данных формы, запросы, менеджеры объектов
КонецПроцедуры

&НаКлиенте
Процедура КомандаРассчитать(Команда)
	РассчитатьНаСервере(); // явный серверный вызов
КонецПроцедуры

Директивы компиляции и серверные вызовы

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

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

Каждый переход «клиент → сервер» — это сетевой обмен. Если в цикле на клиенте сто раз вызывается серверный метод, пользователь получит заметные паузы. Правильный подход — собрать данные на клиенте в структуру или массив и передать на сервер одним вызовом.

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

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

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

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

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

Конфигурация работает в тонком, веб- или мобильном клиентеИспользуйте только управляемые формы — обычные там физически не откроются
Дорабатываете старую конфигурацию в режиме обычного приложенияДелайте обычную форму, но планируйте миграцию на управляемые
Новая внешняя обработка для типовой конфигурации 8.3Управляемая форма, размещение через механизм дополнительных отчетов и обработок
Нужно открыть форму из кода в обоих режимахСоздайте обе формы и выбирайте нужную по режиму запуска, либо перейдите на единый управляемый режим

Как определить тип формы и проверить совместимость

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

Если конфигурация переводится с обычных форм на управляемые, проверяйте три вещи: установлен ли основной режим запуска «Управляемое приложение», созданы ли управляемые формы у всех используемых объектов и нет ли в общих модулях кода, который работает только на толстом клиенте (например, прямой работы с OLE/ActiveX без проверки типа клиента).

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

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

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

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

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

Ошибка «Обычные формы не поддерживаются» или пустое окно

Серверные вызовы
Норма

Один серверный вызов на логическую операцию

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

Циклические вызовы, заметные паузы при работе

Директивы компиляции
Норма

Каждый метод имеет директиву, клиентский код не обращается к БД напрямую

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

Ошибки компиляции модуля формы при сохранении

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

Элементы компонуются корректно, форма адаптируется

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

Наложение элементов, недоступные кнопки

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

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

Вторая ошибка — изменение данных формы в методе &НаСервереБезКонтекста и ожидание, что изменения появятся на клиенте. Без контекста метод не видит реквизиты формы, поэтому результат нужно возвращать значением и присваивать его на клиенте или в контекстном серверном методе.

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

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

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

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

Итог

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

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

Ответы на частые вопросы

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

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

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

Клиент и сервер в управляемом приложении — физически разные процессы, часто на разных машинах. Прикладной объект живёт на сервере, а на клиент передаётся только сериализованное представление — данные формы. Чтобы работать с объектом, используйте серверный метод и преобразование РеквизитФормыВЗначение.

Что выбрать: &НаСервере или &НаСервереБезКонтекста?

Если метод не читает и не изменяет данные формы — используйте &НаСервереБезКонтекста: вызов выполняется быстрее, потому что состояние формы не передаётся на сервер. Контекстный серверный метод нужен только для работы с реквизитами и элементами формы.

Сохранятся ли обычные формы при обновлении платформы 8.3?

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

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

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