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

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

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

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

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

Такой подход появился в версии 8.2 и стал основным в 8.3 вместе с таксометрическим (такси) интерфейсом. Все современные типовые конфигурации — «Бухгалтерия предприятия», «Управление торговлей», «Зарплата и управление персоналом» — построены именно на управляемых формах. Обычные формы сохраняются только для совместимости со старыми решениями.

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

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

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

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

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

Обычная и управляемая форма

Обычная форма

Пиксельная разметка, весь код на клиенте, работает только в толстом клиенте. Подходит лишь для поддержки устаревших решений.

Управляемая форма

Декларативное описание, разделение кода на клиент и сервер, работает в тонком, веб- и мобильном клиенте. Стандарт для всех новых разработок.

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

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

Форма объекта (справочника, документа, обработки) создаётся в конфигураторе на закладке «Формы» соответствующего объекта или автоматически платформой, если форма не задана явно. Редактор управляемой формы состоит из нескольких областей: дерево элементов формы, список реквизитов, список команд, панель свойств и модуль формы.

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

Команды формы — это действия, которые отображаются как кнопки в командной панели или в меню «Ещё». Каждой команде назначается обработчик в модуле формы. Часть команд платформа предоставляет автоматически (записать, провести, закрыть), часть разработчик создаёт самостоятельно.

Директивы компиляции: &НаКлиенте и &НаСервере

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

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

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

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

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

Жизненный цикл формы и основные события

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

При записи объекта срабатывают «ПередЗаписью» (клиент, можно отменить запись), «ПередЗаписьюНаСервере», «ПриЗаписиНаСервере» и «ПослеЗаписи» (клиент). При закрытии — «ПередЗакрытием» и «ПриЗакрытии» на клиенте. Размещение логики не в том событии — частая причина того, что данные «не сохраняются» или «теряются при открытии».

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

Программная работа с реквизитами и элементами

Обращение к реквизитам формы в модуле выполняется напрямую по имени: Объект.Номенклатура, СуммаДокумента. Обращение к элементам формы идёт через коллекцию Элементы: Элементы.ГруппаТовары.Видимость = Ложь;. Управлять можно видимостью, доступностью, только просмотром, заголовком и другими свойствами.

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

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

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

Производительность и ограничения

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

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

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

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

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

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

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

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

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

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

Ошибка компиляции модуля или «метод не обнаружен»

Работа команд
Норма

Кнопка выполняет действие, данные обновляются на форме

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

Ничего не происходит или появляется ошибка вызова сервера

Запись объекта
Норма

Объект записывается, данные сохраняются после переоткрытия

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

Данные введены, но после записи пропадают

Скорость работы
Норма

Действия выполняются без заметных пауз

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

Каждый клик вызывает задержку — признак избыточных серверных вызовов

Часто задаваемые вопросы

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

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

Почему запрос в модуле формы выдаёт ошибку?

Скорее всего, запрос выполняется в процедуре с директивой &НаКлиенте. В тонком и веб-клиенте объект «Запрос» недоступен. Перенесите выполнение запроса в процедуру &НаСервере и передавайте на клиент только результат в виде простых типов данных.

Чем &НаСервереБезКонтекста отличается от &НаСервере?

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

Как открыть управляемую форму с параметрами?

Используйте функцию ОткрытьФорму с передачей структуры параметров, например: ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы, ЭтаФорма). В открываемой форме параметры доступны в «ПриСозданииНаСервере» через коллекцию Параметры, если они объявлены как ключевые или стандартные.

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

Если решение работает только в толстом клиенте и не планирует развиваться — не обязательно. Но для перехода на тонкий или веб-клиент, мобильную платформу или современный интерфейс «Такси» перевод форм обязателен: обычные формы в этих клиентах не отображаются.

Почему в веб-клиенте не работает модальный вопрос «Вопрос()»?

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

Итог

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

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