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