Разработка и Конфигурация · 10 мин
Управляемые формы в 1С: что это такое и как с ними работать
Что значит управляемые формы в 1С: принцип работы, отличия от обычных форм, директивы &НаКлиенте и &НаСервере, типичные ошибки и советы разработчику.
Управляемая форма — это тип формы в платформе 1С:Предприятие 8.3, которая описывается декларативно и автоматически строится системой при открытии. В отличие от обычных форм, разработчик не рисует интерфейс попиксельно, а задаёт структуру элементов, а платформа сама решает, как их отобразить — в тонком клиенте, веб-клиенте или мобильном приложении.
Ключевая особенность управляемых форм — жёсткое разделение кода на клиентскую и серверную части. Любое обращение к данным базы (запросы, чтение объектов, проведение документов) возможно только на сервере, а на клиенте работает только интерфейсная логика. Это сделано осознанно: форма должна одинаково функционировать через интернет-браузер, где никакого прямого доступа к базе нет.
Именно управляемые формы используются во всех современных типовых конфигурациях — «1С:Бухгалтерия 8», «1С:Управление торговлей 11», «1С:Зарплата и управление персоналом 3». Обычные формы остались как режим совместимости для старых решений, работающих только в толстом клиенте.
Чем управляемая форма отличается от обычной
Обычная форма — это режим, при котором разработчик рисовал интерфейс вручную, размещая элементы по координатам, а весь код выполнялся на клиенте с прямым доступом к базе данных. Такой подход работал только в толстом клиенте и не мог быть перенесён в браузер.
Управляемая форма устроена иначе. Разработчик описывает дерево элементов (группы, поля, таблицы, команды) и их свойства, а визуальное построение, привязки и выравнивание выполняет платформа. За счёт этого одна и та же форма корректно отображается на разных клиентах и разрешениях экрана.
| Параметр | Обычная форма | Управляемая форма |
|---|---|---|
| Построение интерфейса | Вручную, по координатам | Автоматически, по декларативному описанию |
| Исполнение кода | Всё на клиенте | Разделено: клиент и сервер |
| Поддерживаемые клиенты | Только толстый клиент | Тонкий, веб-клиент, мобильный клиент |
| Доступ к данным из формы | Напрямую | Только через серверные вызовы |
| Контекст объекта | Есть прямой доступ к объекту | Данные хранятся как реквизиты формы |
Как устроено выполнение кода: клиент и сервер
Главное, что нужно понять при работе с управляемыми формами, — это модель «клиент–сервер внутри одной формы». Модуль формы компилируется в двух контекстах, и каждая процедура должна быть явно помечена директивой компиляции.
Директива &НаКлиенте означает, что код выполняется на рабочем месте пользователя: здесь доступны элементы формы, оповещения, диалоги, работа с файлами на компьютере пользователя. Директива &НаСервере выполняется на сервере 1С: здесь доступны запросы, запись объектов, обращения к менеджерам объектов.
Дополнительно существуют варианты &НаСервереБезКонтекста и &НаКлиентеНаСервереБезКонтекста. Серверные процедуры без контекста не имеют доступа к данным формы как к объекту — в них нужно передавать параметры явно. Зато они выполняются быстрее, потому что платформе не нужно сериализовать весь контекст формы для передачи на сервер.
Пример структуры обработчика
Типичный сценарий: пользователь нажимает кнопку на форме, нужно выполнить расчёт с обращением к базе. Клиентский обработчик собирает параметры и вызывает серверную процедуру, которая делает запрос и возвращает результат.
&НаКлиенте
Процедура Рассчитать(Команда)
Результат = РассчитатьНаСервере(Контрагент);
ПоказатьОповещениеПользователя("Расчёт выполнен: " + Результат);
КонецПроцедуры
&НаСервереБезКонтекста
Функция РассчитатьНаСервере(Контрагент)
// здесь запрос к базе данных
Возврат СуммаЗадолженности;
КонецФункции
Данные формы и реквизиты формы
В управляемой форме нет прямого доступа к объекту базы данных. Вместо этого данные объекта представлены в виде реквизитов формы. Основной реквизит (например, Объект типа ДанныеФормыСтруктура для документа) содержит всё содержимое записываемого объекта.
Когда нужно обратиться к объекту как к прикладному типу — например, вызвать его метод или записать — используется преобразование реквизита в объект с помощью метода РеквизитФормыВЗначение("Объект"). Обратное преобразование выполняется методом ЗначениеВРеквизитФормы(). Эти операции доступны только на сервере.
Частая ошибка начинающих — попытка обратиться к табличной части объекта как к объекту базы напрямую из клиентского кода. Правильный подход: работать с реквизитом формы Объект.Товары как с данными формы, а серверные операции выполнять через преобразование.
Когда форма создаётся и какие события срабатывают
Управляемая форма проходит предсказуемый жизненный цикл, и понимание его упрощает отладку. Сначала на сервере срабатывает ПриСозданииНаСервере — здесь формируются начальные данные, заполняются списки выбора, настраивается условное оформление. Затем на клиенте вызывается ПриОткрытии — здесь выполняются интерактивные действия: предупреждения, вопросы пользователю, подключение оборудования.
При записи объекта последовательность такая: клиентский ПередЗаписью (можно задать вопрос и отменить запись), затем серверные ПередЗаписьюНаСервере, ПриЗаписиНаСервере, ПослеЗаписиНаСервере, и в конце клиентский ПослеЗаписи.
- 1Определите, нужен ли коду доступ к базе данных или только к интерфейсу
- 2Работа с данными (запросы, запись, проведение) — в процедуры &НаСервере или &НаСервереБезКонтекста
- 3Диалоги, оповещения, работа с файлами пользователя — только в &НаКлиенте
- 4Начальное заполнение формы — в ПриСозданииНаСервере, а не в ПриОткрытии
- 5Проверьте форму в тонком клиенте и при необходимости в веб-клиенте
Производительность управляемых форм
Основной фактор скорости управляемой формы — количество серверных вызовов. Каждый вызов серверной процедуры с клиента — это обмен данными по сети, а при контекстном вызове ещё и передача всего содержимого формы. Если форма при открытии делает десятки серверных обращений, пользователь будет ждать несколько секунд даже на быстром сервере.
Практические приёмы оптимизации: объединяйте несколько операций с данными в одну серверную процедуру, используйте &НаСервереБезКонтекста там, где не нужен доступ к реквизитам формы, не заполняйте большие динамические списки без отбора. Для тяжёлых операций рассмотрите фоновое выполнение через длительные операции вместо блокировки формы.
Если форма документа с большой табличной частью открывается медленно, чаще всего виноват не сам объём данных, а обработчики ПриИзменении, которые на каждую строку вызывают сервер. Переведите пересчёт в одну серверную процедуру, обрабатывающую всю таблицу сразу, — ускорение обычно заметно сразу.
Когда какие формы использовать
Выбор между управляемой и обычной формой сегодня практически не стоит: для любой новой разработки применяются только управляемые формы. Обычные формы оправданы лишь при доработке старых конфигураций, которые целиком работают в режиме обычного приложения и не планируют переход на тонкий или веб-клиент.
Если конфигурация работает в режиме совместимости и использует оба типа форм, учитывайте, что обычная форма не откроется в тонком клиенте. Поэтому при постепенной миграции первыми переводят на управляемые формы те объекты, которыми пользуются сотрудники на тонких и веб-клиентах.
Как выбрать действие
Что важно запомнить
Управляемая форма — декларативно описанный интерфейс, который платформа строит сама и который работает в тонком, веб- и мобильном клиентах. Код делится на клиентский и серверный директивами компиляции, данные объекта представлены реквизитами формы, а скорость работы зависит прежде всего от количества серверных вызовов.
Частые вопросы об управляемых формах
Можно ли в управляемой форме нарисовать элемент в точных координатах?
Нет, управляемая форма не поддерживает пиксельное позиционирование. Разработчик управляет расположением через группы (горизонтальные и вертикальные), порядок элементов и свойства растягивания. Финальную геометрию определяет платформа под конкретный клиент и размер окна.
Почему серверная процедура не видит реквизиты формы?
Скорее всего, она объявлена с директивой &НаСервереБезКонтекста. Такие процедуры не получают контекст формы — данные нужно передавать через параметры и возвращать через результат. Если нужен доступ к реквизитам формы, используйте &НаСервере.
Как из клиентского кода выполнить запрос к базе?
Напрямую — никак, это ограничение платформы. Создайте серверную функцию, которая выполнит запрос и вернёт результат простыми типами (число, строка, структура, массив), и вызовите её из клиентской процедуры.
Откроется ли обычная форма в тонком клиенте?
Нет. Обычные формы работают только в толстом клиенте в режиме обычного приложения. Если конфигурация должна запускаться в тонком или веб-клиенте, все используемые формы нужно перевести на управляемые.
Чем отличается ПриСозданииНаСервере от ПриОткрытии?
ПриСозданииНаСервере срабатывает на сервере до передачи формы клиенту — здесь готовятся данные и настройки. ПриОткрытии выполняется уже на клиенте, когда форма показана пользователю, — здесь уместны вопросы, предупреждения и работа с локальными ресурсами. Запрос к базе в ПриОткрытии выполнить нельзя.
Почему форма с большой табличной частью работает медленно?
Типичные причины: серверные вызовы из обработчиков изменения каждой строки, контекстные серверные процедуры там, где достаточно бесконтекстных, и заполнение связанных данных по одной строке вместо пакетной обработки. Оптимизация почти всегда сводится к сокращению числа серверных вызовов.