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

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

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

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

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

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

Именно управляемые формы используются во всех современных типовых конфигурациях — «1С:Бухгалтерия 8», «1С:Управление торговлей 11», «1С:Зарплата и управление персоналом 3». Обычные формы остались как режим совместимости для старых решений, работающих только в толстом клиенте.

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

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

Управляемая форма устроена иначе. Разработчик описывает дерево элементов (группы, поля, таблицы, команды) и их свойства, а визуальное построение, привязки и выравнивание выполняет платформа. За счёт этого одна и та же форма корректно отображается на разных клиентах и разрешениях экрана.

ПараметрОбычная формаУправляемая форма
Построение интерфейсаВручную, по координатамАвтоматически, по декларативному описанию
Исполнение кодаВсё на клиентеРазделено: клиент и сервер
Поддерживаемые клиентыТолько толстый клиентТонкий, веб-клиент, мобильный клиент
Доступ к данным из формыНапрямуюТолько через серверные вызовы
Контекст объектаЕсть прямой доступ к объектуДанные хранятся как реквизиты формы

Как устроено выполнение кода: клиент и сервер

Главное, что нужно понять при работе с управляемыми формами, — это модель «клиент–сервер внутри одной формы». Модуль формы компилируется в двух контекстах, и каждая процедура должна быть явно помечена директивой компиляции.

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

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

Пример структуры обработчика

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

&НаКлиенте

Процедура Рассчитать(Команда)

Результат = РассчитатьНаСервере(Контрагент);

ПоказатьОповещениеПользователя("Расчёт выполнен: " + Результат);

КонецПроцедуры

&НаСервереБезКонтекста

Функция РассчитатьНаСервере(Контрагент)

// здесь запрос к базе данных

Возврат СуммаЗадолженности;

КонецФункции

Данные формы и реквизиты формы

В управляемой форме нет прямого доступа к объекту базы данных. Вместо этого данные объекта представлены в виде реквизитов формы. Основной реквизит (например, Объект типа ДанныеФормыСтруктура для документа) содержит всё содержимое записываемого объекта.

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

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

Типичные ошибки
01
Вызов запроса из процедуры &НаКлиенте — код не скомпилируется, нужно перенести запрос на сервер
02
Множество мелких серверных вызовов в цикле — каждый вызов это сетевой обмен, форма начинает тормозить; объединяйте операции в один серверный вызов
03
Использование контекстной серверной процедуры там, где хватит &НаСервереБезКонтекста — лишняя сериализация всей формы замедляет работу
04
Изменение данных формы напрямую в обход объекта без понимания механизма — при записи изменения теряются

Когда форма создаётся и какие события срабатывают

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

При записи объекта последовательность такая: клиентский ПередЗаписью (можно задать вопрос и отменить запись), затем серверные ПередЗаписьюНаСервере, ПриЗаписиНаСервере, ПослеЗаписиНаСервере, и в конце клиентский ПослеЗаписи.

Как разместить код правильно
  1. 1
    Определите, нужен ли коду доступ к базе данных или только к интерфейсу
  2. 2
    Работа с данными (запросы, запись, проведение) — в процедуры &НаСервере или &НаСервереБезКонтекста
  3. 3
    Диалоги, оповещения, работа с файлами пользователя — только в &НаКлиенте
  4. 4
    Начальное заполнение формы — в ПриСозданииНаСервере, а не в ПриОткрытии
  5. 5
    Проверьте форму в тонком клиенте и при необходимости в веб-клиенте

Производительность управляемых форм

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

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

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

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

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

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

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

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

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

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

Управляемая форма — декларативно описанный интерфейс, который платформа строит сама и который работает в тонком, веб- и мобильном клиентах. Код делится на клиентский и серверный директивами компиляции, данные объекта представлены реквизитами формы, а скорость работы зависит прежде всего от количества серверных вызовов.

Частые вопросы об управляемых формах

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

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

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

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

Как из клиентского кода выполнить запрос к базе?

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

Откроется ли обычная форма в тонком клиенте?

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

Чем отличается ПриСозданииНаСервере от ПриОткрытии?

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

Почему форма с большой табличной частью работает медленно?

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