Разработка и Конфигурация · 11 мин
Чем отличается обычная форма от управляемой в 1С
Чем обычная форма отличается от управляемой в 1С: архитектура, синтаксис, директивы компиляции, совместимость и критерии выбора при разработке.
Обычная и управляемая формы — это два разных поколения механизма построения интерфейса в 1С:Предприятии. Обычная форма описывается разработчиком целиком: расположение элементов, привязка к данным, логика — всё жёстко задано в модуле и макете формы. Управляемая форма описывает только структуру и декларативные правила, а окончательный вид платформа строит сама на стороне клиента.
Различие принципиально, потому что управляемые формы — единственный способ показать интерфейс в веб-клиенте и тонком клиенте без терминального доступа. Обычные формы работают только в толстом клиенте, поэтому для современных конфигураций, рассчитанных на работу через браузер или мобильный клиент, они не подходят.
Выбор типа формы влияет не только на внешний вид, но и на архитектуру кода: в управляемых формах действует строгое разделение клиентского и серверного контекста, директивы компиляции и особая модель работы с данными. Ошибка в понимании этой модели — частая причина неработающих обработчиков и лишних серверных вызовов.
Что такое обычная форма и где она работает
Обычная форма — это механизм интерфейса, появившийся в платформе 8.0 и 8.1. Разработчик в конфигураторе вручную размещает элементы на макете: поля ввода, табличные части, кнопки, надписи. Платформа отображает форму практически «как нарисовано», с минимальной самостоятельной компоновкой.
Ключевое ограничение — обычная форма целиком выполняется на клиенте в толстом клиенте. Весь код модуля формы исполняется в одном контексте, разработчик может напрямую обращаться к прикладным объектам, например вызвать Справочники.Номенклатура.НайтиПоКоду() прямо из обработчика кнопки. Это удобно для быстрой разработки, но делает форму непригодной для трёхзвенной архитектуры.
Сегодня обычные формы встречаются в старых конфигурациях (УПП, «Управление торговлей» 10.3, «Бухгалтерия» 1.6/2.0), которые запускаются в режиме обычного приложения. Платформа 8.3 их по-прежнему поддерживает, но новые разработки на них не ведутся.
Что такое управляемая форма и как она устроена
Управляемая форма появилась в платформе 8.2 вместе с новой клиент-серверной моделью. Разработчик описывает не пиксельное расположение элементов, а логическую структуру: какие реквизиты выводить, в какие группы они объединены, какие команды доступны. Платформа сама решает, как отрисовать эту структуру в толстом, тонком, веб- или мобильном клиенте, с учётом разрешения экрана и возможностей устройства.
Данные формы отделены от прикладных объектов. На сервере форма работает с «данными формы» — специальным представлением объекта, а на клиент передаётся только сериализованное состояние. Прикладной объект (например, ДокументОбъект) на клиенте недоступен в принципе: чтобы изменить данные в базе, нужен серверный вызов.
Именно это разделение позволяет форме работать через интернет: клиент и сервер обмениваются только изменениями данных формы, а не всем объектом целиком.
Ключевые отличия в архитектуре и коде
Главное практическое отличие — модель исполнения кода. В обычной форме весь модуль един, и любой метод платформы доступен в любом обработчике. В управляемой форме каждый метод и переменная помечаются директивой компиляции, которая определяет, где код выполняется.
| Критерий | Обычная форма | Управляемая форма |
|---|---|---|
| Описание интерфейса | Жёсткий макет, ручное размещение элементов | Декларативная структура, автокомпоновка платформой |
| Клиенты | Только толстый клиент | Толстый, тонкий, веб-, мобильный клиенты |
| Контекст исполнения | Единый, на клиенте | Разделён: клиент и сервер, директивы компиляции |
| Работа с объектами | Прямой доступ к прикладным объектам из модуля формы | Только через данные формы и серверные вызовы |
| Обновление интерфейса | Элементы обновляются вручную или автоматически по привязке | Декларативные связи, отображение перестраивается платформой |
| Актуальность | Устаревший механизм, поддерживается для совместимости | Стандарт разработки на платформе 8.3 |
Ещё одно отличие — событийная модель. В управляемых формах другой набор событий (ПриСозданииНаСервере, ПриОткрытии, ПередЗаписьюНаСервере и другие), и порядок их вызова отличается от привычного ПриОткрытии обычной формы. Код, скопированный из старой формы, часто требует переработки, а не просто переноса.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// доступен контекст данных формы, запросы, менеджеры объектов
КонецПроцедуры
&НаКлиенте
Процедура КомандаРассчитать(Команда)
РассчитатьНаСервере(); // явный серверный вызов
КонецПроцедурыДирективы компиляции и серверные вызовы
В модуле управляемой формы используются четыре директивы: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста и &НаКлиентеНаСервереБезКонтекста. Директива определяет, где компилируется и исполняется метод, и какие возможности платформы ему доступны.
Методы &НаСервереБезКонтекста не имеют доступа к данным формы, зато вызываются быстрее, потому что платформе не нужно сериализовать и передавать состояние формы на сервер. Типовая практика — выносить в такие методы справочные запросы: получение цены, остатка, курса валюты. Методы &НаСервере с контекстом нужны, когда требуется изменить данные формы, например заполнить табличную часть.
Каждый переход «клиент → сервер» — это сетевой обмен. Если в цикле на клиенте сто раз вызывается серверный метод, пользователь получит заметные паузы. Правильный подход — собрать данные на клиенте в структуру или массив и передать на сервер одним вызовом.
Какую форму выбрать для новой разработки
Для любой новой разработки выбор однозначен — управляемая форма. Она работает во всех клиентах, поддерживается всеми современными механизмами платформы (динамические списки, функциональные опции, расширения) и соответствует стандартам разработки фирмы «1С».
Обычная форма оправдана только в одном случае: вы дорабатываете старую конфигурацию, которая запускается исключительно в режиме обычного приложения, и внешняя обработка должна открываться внутри неё. Даже тогда стоит проверить, нельзя ли перевести пользователей на управляемый режим.
Как выбрать действие
Как определить тип формы и проверить совместимость
В конфигураторе тип формы виден в редакторе: управляемая форма открывается в редакторе с панелью реквизитов, команд и деревом элементов, обычная — в визуальном редакторе макета. Программно режим приложения проверяется функцией РежимЗапускаКлиентскогоПриложения() или через свойство конфигурации «Режим использования модальности» и «Основной режим запуска».
Если конфигурация переводится с обычных форм на управляемые, проверяйте три вещи: установлен ли основной режим запуска «Управляемое приложение», созданы ли управляемые формы у всех используемых объектов и нет ли в общих модулях кода, который работает только на толстом клиенте (например, прямой работы с OLE/ActiveX без проверки типа клиента).
Как проверить результат
Форма открывается и работает без ошибок
Ошибка «Обычные формы не поддерживаются» или пустое окно
Один серверный вызов на логическую операцию
Циклические вызовы, заметные паузы при работе
Каждый метод имеет директиву, клиентский код не обращается к БД напрямую
Ошибки компиляции модуля формы при сохранении
Элементы компонуются корректно, форма адаптируется
Наложение элементов, недоступные кнопки
Типичные ошибки при работе с управляемыми формами
Самая распространённая ошибка переноса — попытка вызвать из клиентского обработчика метод, доступный только на сервере, например запрос к базе данных. Платформа выдаст ошибку компиляции или выполнения. Решение — вынести логику в серверный метод формы или в общий серверный модуль.
Вторая ошибка — изменение данных формы в методе &НаСервереБезКонтекста и ожидание, что изменения появятся на клиенте. Без контекста метод не видит реквизиты формы, поэтому результат нужно возвращать значением и присваивать его на клиенте или в контекстном серверном методе.
Миграция с обычных форм на управляемые
Автоматического конвертера обычных форм в управляемые не существует — миграция выполняется вручную. Порядок работы такой: создайте новую управляемую форму объекта, перенесите реквизиты и структуру элементов, затем перепишите обработчики с учётом разделения контекстов. Логику работы с базой выносите на сервер, интерфейсную логику оставляйте на клиенте.
Модальные вызовы вида Вопрос() и Предупреждение() замените на асинхронные аналоги: ПоказатьВопрос(), ПоказатьПредупреждение() с описанием оповещения. Это требование не только управляемых форм, но и режима запрета модальности, который используется в веб-клиенте.
Что важно запомнить
Обычная форма — жёсткий макет и только толстый клиент, управляемая — декларативное описание, разделение клиента и сервера, работа во всех клиентах. Для новой разработки используйте управляемые формы, минимизируйте серверные вызовы и избегайте модальных окон.
Ответы на частые вопросы
Можно ли открыть обычную форму в тонком клиенте?
Нет. Обычные формы поддерживаются только толстым клиентом в режиме обычного приложения. В тонком, веб- и мобильном клиентах открываются исключительно управляемые формы. Если обработка должна работать в тонком клиенте, для неё нужно создать управляемую форму.
Почему в управляемой форме недоступен ДокументОбъект на клиенте?
Клиент и сервер в управляемом приложении — физически разные процессы, часто на разных машинах. Прикладной объект живёт на сервере, а на клиент передаётся только сериализованное представление — данные формы. Чтобы работать с объектом, используйте серверный метод и преобразование РеквизитФормыВЗначение.
Что выбрать: &НаСервере или &НаСервереБезКонтекста?
Если метод не читает и не изменяет данные формы — используйте &НаСервереБезКонтекста: вызов выполняется быстрее, потому что состояние формы не передаётся на сервер. Контекстный серверный метод нужен только для работы с реквизитами и элементами формы.
Сохранятся ли обычные формы при обновлении платформы 8.3?
Да, платформа 8.3 продолжает поддерживать режим обычного приложения и обычные формы для совместимости. Однако новые механизмы (интерфейс «Такси», функциональные опции, мобильный клиент) ориентированы на управляемые формы, поэтому долгосрочно конфигурацию стоит переводить на управляемый режим.
Как из обычной формы открыть управляемую и наоборот?
Из обычного приложения можно программно открыть управляемую форму через ПолучитьФорму() — она откроется в отдельном окне, но обмен данными между формами разных типов ограничен. Обратный сценарий (обычная форма из управляемого приложения) невозможен. Для смешанной работы надёжнее привести все формы к одному типу.