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