Разработка управляемой формы в 1С 8.3: конструктор и модуль формы
Содержание
Форму в 1С 8.3 создают в конфигураторе: у нужного объекта (справочника, документа, обработки) в дереве конфигурации раскрывают ветку Формы, вызывают контекстное меню и добавляют форму через конструктор. Конструктор за несколько шагов построит готовую управляемую форму с полями — дальше её дорабатывают в редакторе формы и в модуле формы.
Сделать форму в 1С значит описать, какие данные объект показывает на экране и как реагирует на действия пользователя. В 8.3 работают управляемые формы: платформа сама строит интерфейс по описанию, а код делится на клиентскую и серверную части. Ниже — как добавить форму, настроить реквизиты и элементы, привязать события и не наступить на типичные грабли с директивами компиляции.
Какие формы есть у объектов и когда делать свою
У каждого прикладного объекта платформа умеет показывать несколько видов форм. Пока вы не создали свою, 1С генерирует форму автоматически (её называют авто-формой) — она работает, но внешний вид и логику под себя в ней не настроишь.
Основные типы форм:
- 🗂️ Форма объекта (элемента, документа) — карточка одной записи: реквизиты, табличные части, кнопки записи и проведения.
- 📋 Форма списка — список элементов справочника или документов с колонками и отбором.
- ✅ Форма выбора — упрощённый список для подбора значения в поле другого объекта.
- 🔽 Форма группы — карточка группы в иерархическом справочнике.
Для справочника доступны формы объекта, списка, выбора и группы; для документа — формы документа, списка и выбора. Собственную форму делают, когда нужно поменять расположение полей, скрыть лишнее, добавить свои команды или вычисления.
Сделать свою форму и забыть назначить её основной — частая причина того, что изменения «не видны». Авто-форма и ваша форма существуют параллельно; какая откроется, решает назначение основной формы в свойствах объекта.
С чего начать: добавление формы через конструктор
Конструктор формы — самый быстрый старт. Порядок действий:
- Откройте конфигурацию в режиме
Конфигуратор. - В дереве конфигурации найдите объект, например
Справочники → Номенклатура, и раскройте его веткуФормы. - Вызовите контекстное меню ветки
Формыи выберитеДобавить. Запустится конструктор формы. - Выберите тип формы (форма элемента, списка, выбора) и при необходимости задайте имя.
- На следующем шаге конструктор предложит основной реквизит — объект, с данными которого форма связана (
ОбъектСправочника,ДокументОбъект). Оставьте предложенный. - Отметьте, какие реквизиты объекта разместить на форме и в каком порядке. Нажмите
Готово.
Конструктор создаст форму и сразу откроет редактор. Чтобы форма стала той, что открывается по умолчанию, назначьте её основной: в палитре свойств объекта (вкладка Формы или раздел Основные формы) укажите вашу форму как основную для нужного вида.
Если форма нужна у обработки или отчёта — там тоже есть ветка Формы, конструктор работает так же. У обработки основным реквизитом будет сам объект обработки.
Редактор формы: реквизиты, элементы и команды
Редактор формы — рабочее место разработчика. Он разделён на несколько областей:
- Элементы (вверху слева) — дерево того, что видит пользователь: поля, группы, таблицы, кнопки, декорации.
- Реквизиты (вверху справа) — данные формы. Среди них один помечен жирным — это основной реквизит, через него форма связана с объектом.
- Командный интерфейс и Команды — собственные команды формы, из которых делают кнопки.
- Модуль — код формы (отдельная вкладка).
Главное различие, которое нужно усвоить: реквизиты формы — это данные, элементы формы — это их отображение. Одно поле ввода (элемент) показывает один реквизит (данные). Чтобы вывести реквизит на экран, перетащите его из списка реквизитов в дерево элементов — платформа сама создаст поле подходящего вида.
Виды элементов, которые пригодятся чаще всего:
| Элемент | Для чего |
|---|---|
| Поле | Ввод и показ одного реквизита (строка, число, дата, ссылка) |
| Группа | Объединяет элементы: колонки, страницы (закладки), командная панель |
| Таблица | Показывает табличную часть или динамический список |
| Кнопка | Запускает команду формы |
| Декорация | Надпись или картинка без данных |
Свойства выделенного элемента меняют в палитре свойств (F4 или двойной клик). Там задают заголовок, видимость, доступность, только просмотр, ширину. Свою кнопку делают так: в разделе Команды создают команду, пишут её обработчик, затем перетаскивают команду в дерево элементов — появляется кнопка.
Группы, закладки и таблицы: как разложить элементы
Пока на форме два-три поля, расположение не важно. Когда их десяток и есть табличная часть, элементы группируют — иначе форма превращается в сплошную простыню.
Группировкой занимается элемент Группа. У него несколько режимов в свойстве группировки:
- Горизонтальная группа — элементы встают в колонку рядом друг с другом.
- Вертикальная группа — элементы идут сверху вниз.
- Страницы — группа-контейнер с закладками; внутри неё вложенные группы-страницы становятся вкладками формы.
- Командная панель — строка с кнопками команд.
Чтобы разбить форму на вкладки, добавьте группу с видом «Страницы», внутрь неё — несколько групп с видом «Страница», и разложите поля по ним. Так делают карточки с разделами «Основное», «Цены», «Дополнительно».
Табличную часть объекта показывает элемент Таблица. Проще всего перетащить табличную часть из списка реквизитов в дерево элементов — платформа создаст таблицу со всеми колонками. Над таблицей появляется своя командная панель с типовыми командами Добавить, Удалить, Переместить — их включают в свойствах таблицы.
Полезные события таблицы: ПриАктивизацииСтроки (сработает при переходе по строкам), ПередНачаломДобавления, ПередУдалением. Итоги по колонке показывают в подвале таблицы: у колонки включают подвал и указывают, что в нём выводить.
Для списков и форм списка колонки берутся из динамического списка — основного реквизита формы списка. Чтобы добавить в список свою колонку с вычислением, расширяют запрос динамического списка, а не дописывают поле на форму.
Модуль формы: события и директивы компиляции
Логику формы пишут в модуле формы. Каждая процедура помечается директивой компиляции — она говорит платформе, где процедура выполнится:
&НаКлиенте— на клиенте (тонком, веб). Отсюда доступны элементы формы и реакция на действия пользователя, но нет прямого доступа к базе.&НаСервере— на сервере, с полной передачей данных формы туда и обратно. Здесь доступныОбъект, запросы, работа с базой.&НаСервереБезКонтекста— на сервере, но без передачи формы. Самый лёгкий серверный вызов; данные передают через параметры.&НаКлиентеНаСервереБезКонтекста— процедура компилируется и на клиенте, и на сервере; удобна для общих расчётов без обращения к базе.
События привязывают через палитру свойств элемента или формы: рядом со строкой события стоит значок лупы, по нему платформа создаёт заготовку обработчика с правильной директивой. Частые события формы: ПриСозданииНаСервере (заполнить форму при открытии), ПриОткрытии, ПередЗаписью, ПослеЗаписи. У поля — ПриИзменении, НачалоВыбора, ОбработкаВыбора.
Пример: при вводе цены или количества пересчитываем сумму. Данные объекта уже на клиенте, поэтому сервер не нужен:
&НаКлиенте
Процедура ЦенаПриИзменении(Элемент)
ПересчитатьСумму();
КонецПроцедуры
&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
ПересчитатьСумму();
КонецПроцедуры
&НаКлиенте
Процедура ПересчитатьСумму()
Объект.Сумма = Объект.Количество * Объект.Цена;
КонецПроцедуры
А вот заполнение по данным из базы делают на сервере — отсюда доступны запросы:
&НаСервере
Процедура ЗаполнитьОстатокНаСервере(НоменклатураСсылка)
// запрос к регистру остатков, результат кладём в реквизит формы
Объект.ОстатокНаСкладе = ПолучитьОстаток(НоменклатураСсылка);
КонецПроцедуры
Клиент, сервер и производительность формы
В управляемой форме каждый серверный вызов — это пересылка данных формы по сети. Если вызовов много или форма «тяжёлая», интерфейс начинает подтормаживать. Отсюда правила, которые экономят время пользователя:
- 🚀 Не делайте серверных вызовов в цикле. Соберите данные и отправьте на сервер один раз.
- 🪶 Для расчётов, которым не нужны ни база, ни данные формы, берите
&НаКлиентеНаСервереБезКонтекстаили&НаСервереБезКонтекста— лёгкий вызов вместо тяжёлого контекстного. - 🎛️ Видимость и доступность полей меняйте условным оформлением (
УсловноеОформлениеформы) там, где это возможно, а не кодом при каждом изменении — платформа применит его сама. - 📦 Не выводите на форму то, что пользователю не нужно прямо сейчас: лишние реквизиты и колонки увеличивают объём пересылаемых данных.
Контекстный серверный вызов (&НаСервере) передаёт на сервер и обратно всю форму целиком. На больших формах с табличными частями это заметно дороже внеконтекстного вызова. Выбирайте директиву по тому, нужны ли процедуре данные формы.
Динамические формы: добавляем реквизиты и элементы кодом
Иногда набор полей заранее неизвестен — например, форма настроек, где колонки зависят от выбранного режима. Тогда реквизиты и элементы создают программно. Ключевое правило: реквизиты формы добавляют только на сервере методом ИзменитьРеквизиты, с клиента это сделать нельзя.
&НаСервере
Процедура ДобавитьПолеКомментарийНаСервере()
НовыйРеквизит = Новый РеквизитФормы(
"Комментарий", Новый ОписаниеТипов("Строка"));
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
НовыйЭлемент = Элементы.Добавить("Комментарий", Тип("ПолеФормы"));
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Комментарий";
КонецПроцедуры
Сначала создаём реквизит формы и регистрируем его через ИзменитьРеквизиты, затем добавляем элемент Элементы.Добавить и привязываем его к реквизиту через свойство ПутьКДанным. Элементы, в отличие от реквизитов, можно добавлять и перестраивать и в серверной процедуре — главное, чтобы реквизит, на который ссылается ПутьКДанным, уже существовал.
Видимостью целых блоков формы удобно управлять функциональными опциями: привязываете реквизит или элемент к функциональной опции, и платформа показывает его только там, где опция включена — без единой строки кода в форме.
Частые ошибки при разработке форм
&НаСервере недоступны из &НаКлиенте напрямую. Вынесите логику в серверную процедуру и вызовите её из клиентской.ИзменитьРеквизиты работает только на сервере. С клиента реквизит формы добавить нельзя — перенесите вызов в процедуру с &НаСервере или &НаСервереБезКонтекста.ПриИзменении. Соберите данные и сделайте один вызов; лёгкие расчёты держите на клиенте.Ещё две ошибки, которые видно не сразу:
- Обработчик события привязан не к той директиве. Платформа сама подставляет правильную при создании через лупу в палитре свойств — создавайте обработчики так, а не копируйте процедуры вручную.
- Прямое обращение к
Объектв процедуре&НаСервереБезКонтекста. Контекста формы там нет, поэтомуОбъектнедоступен — передавайте нужные значения параметрами.
Частые вопросы
Чем управляемая форма отличается от обычной?
Почему открывается авто-форма, а не моя?
Можно ли изменить форму в типовой конфигурации?
Как открыть нужную форму из кода?
ОткрытьФорму с полным именем формы, например ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента"). Параметры открытия передают вторым аргументом.Что такое основной реквизит формы?
ОбъектСправочника, ДокументОбъект). Он помечен жирным в списке реквизитов, и именно его данные записываются при сохранении формы.