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

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

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

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

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

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

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

Архитектурные различия: как устроена каждая форма

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

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

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

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

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

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

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

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

&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере()
    Запрос = Новый Запрос("ВЫБРАТЬ ...");
    // выполнение запроса и заполнение табличной части
КонецПроцедуры

Данные формы: реквизиты вместо объектов

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

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

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

Сравнение по ключевым параметрам

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

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

Модальность и асинхронность

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

Вместо модальных вызовов применяются асинхронные аналоги с описанием оповещения: ПоказатьВопрос(), ПоказатьПредупреждение(), ОткрытьФорму() с обработчиком оповещения. Логика «спросить — получить ответ — продолжить» разбивается на две процедуры: одна показывает вопрос, вторая обрабатывает результат. Это требует перестройки мышления, но делает интерфейс отзывчивым.

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

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

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

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

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

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

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

Как проверить, что форма работает правильно

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

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

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

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

Компиляция модуля формы
Норма

Нет ошибок ни в клиентском, ни в серверном контексте

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

Ошибки вида «Процедура или функция не определена» — обращение к серверному методу из клиентского контекста

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

Форма открывается и работает так же, как в тонком клиенте

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

Ошибки модальности или неподдерживаемых методов

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

Форма открывается быстро, один-два серверных вызова

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

Длительное открытие, десятки обращений к серверу

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

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

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

Почему в управляемой форме не работает метод Вопрос()?

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

Что быстрее: обычная или управляемая форма?

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

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

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

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

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

Почему серверная процедура не видит реквизиты формы?

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

Итог

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

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