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