Разработка управляемой формы в 1С 8.3: конструктор и модуль формы

· 9 мин

Содержание

Форму в 1С 8.3 создают в конфигураторе: у нужного объекта (справочника, документа, обработки) в дереве конфигурации раскрывают ветку Формы, вызывают контекстное меню и добавляют форму через конструктор. Конструктор за несколько шагов построит готовую управляемую форму с полями — дальше её дорабатывают в редакторе формы и в модуле формы.

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

Какие формы есть у объектов и когда делать свою

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

Основные типы форм:

  • 🗂️ Форма объекта (элемента, документа) — карточка одной записи: реквизиты, табличные части, кнопки записи и проведения.
  • 📋 Форма списка — список элементов справочника или документов с колонками и отбором.
  • ✅ Форма выбора — упрощённый список для подбора значения в поле другого объекта.
  • 🔽 Форма группы — карточка группы в иерархическом справочнике.

Для справочника доступны формы объекта, списка, выбора и группы; для документа — формы документа, списка и выбора. Собственную форму делают, когда нужно поменять расположение полей, скрыть лишнее, добавить свои команды или вычисления.

Сделать свою форму и забыть назначить её основной — частая причина того, что изменения «не видны». Авто-форма и ваша форма существуют параллельно; какая откроется, решает назначение основной формы в свойствах объекта.

С чего начать: добавление формы через конструктор

Конструктор формы — самый быстрый старт. Порядок действий:

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

Конструктор создаст форму и сразу откроет редактор. Чтобы форма стала той, что открывается по умолчанию, назначьте её основной: в палитре свойств объекта (вкладка Формы или раздел Основные формы) укажите вашу форму как основную для нужного вида.

Если форма нужна у обработки или отчёта — там тоже есть ветка Формы, конструктор работает так же. У обработки основным реквизитом будет сам объект обработки.

Редактор формы: реквизиты, элементы и команды

Редактор формы — рабочее место разработчика. Он разделён на несколько областей:

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

Главное различие, которое нужно усвоить: реквизиты формы — это данные, элементы формы — это их отображение. Одно поле ввода (элемент) показывает один реквизит (данные). Чтобы вывести реквизит на экран, перетащите его из списка реквизитов в дерево элементов — платформа сама создаст поле подходящего вида.

Виды элементов, которые пригодятся чаще всего:

ЭлементДля чего
ПолеВвод и показ одного реквизита (строка, число, дата, ссылка)
ГруппаОбъединяет элементы: колонки, страницы (закладки), командная панель
ТаблицаПоказывает табличную часть или динамический список
КнопкаЗапускает команду формы
ДекорацияНадпись или картинка без данных

Свойства выделенного элемента меняют в палитре свойств (F4 или двойной клик). Там задают заголовок, видимость, доступность, только просмотр, ширину. Свою кнопку делают так: в разделе Команды создают команду, пишут её обработчик, затем перетаскивают команду в дерево элементов — появляется кнопка.

Группы, закладки и таблицы: как разложить элементы

Пока на форме два-три поля, расположение не важно. Когда их десяток и есть табличная часть, элементы группируют — иначе форма превращается в сплошную простыню.

Группировкой занимается элемент Группа. У него несколько режимов в свойстве группировки:

  • Горизонтальная группа — элементы встают в колонку рядом друг с другом.
  • Вертикальная группа — элементы идут сверху вниз.
  • Страницы — группа-контейнер с закладками; внутри неё вложенные группы-страницы становятся вкладками формы.
  • Командная панель — строка с кнопками команд.

Чтобы разбить форму на вкладки, добавьте группу с видом «Страницы», внутрь неё — несколько групп с видом «Страница», и разложите поля по ним. Так делают карточки с разделами «Основное», «Цены», «Дополнительно».

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

Полезные события таблицы: ПриАктивизацииСтроки (сработает при переходе по строкам), ПередНачаломДобавления, ПередУдалением. Итоги по колонке показывают в подвале таблицы: у колонки включают подвал и указывают, что в нём выводить.

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

Модуль формы: события и директивы компиляции

Логику формы пишут в модуле формы. Каждая процедура помечается директивой компиляции — она говорит платформе, где процедура выполнится:

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

События привязывают через палитру свойств элемента или формы: рядом со строкой события стоит значок лупы, по нему платформа создаёт заготовку обработчика с правильной директивой. Частые события формы: ПриСозданииНаСервере (заполнить форму при открытии), ПриОткрытии, ПередЗаписью, ПослеЗаписи. У поля — ПриИзменении, НачалоВыбора, ОбработкаВыбора.

Пример: при вводе цены или количества пересчитываем сумму. Данные объекта уже на клиенте, поэтому сервер не нужен:

&НаКлиенте
Процедура ЦенаПриИзменении(Элемент)
    ПересчитатьСумму();
КонецПроцедуры

&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
    ПересчитатьСумму();
КонецПроцедуры

&НаКлиенте
Процедура ПересчитатьСумму()
    Объект.Сумма = Объект.Количество * Объект.Цена;
КонецПроцедуры

А вот заполнение по данным из базы делают на сервере — отсюда доступны запросы:

&НаСервере
Процедура ЗаполнитьОстатокНаСервере(НоменклатураСсылка)
    // запрос к регистру остатков, результат кладём в реквизит формы
    Объект.ОстатокНаСкладе = ПолучитьОстаток(НоменклатураСсылка);
КонецПроцедуры
Проверьте себя
Где выполнится процедура с директивой &НаСервереБезКонтекста?
В какой директиве можно напрямую обратиться к реквизиту Объект?
Можно ли добавить новый реквизит формы прямо с клиента?

Клиент, сервер и производительность формы

В управляемой форме каждый серверный вызов — это пересылка данных формы по сети. Если вызовов много или форма «тяжёлая», интерфейс начинает подтормаживать. Отсюда правила, которые экономят время пользователя:

  • 🚀 Не делайте серверных вызовов в цикле. Соберите данные и отправьте на сервер один раз.
  • 🪶 Для расчётов, которым не нужны ни база, ни данные формы, берите &НаКлиентеНаСервереБезКонтекста или &НаСервереБезКонтекста — лёгкий вызов вместо тяжёлого контекстного.
  • 🎛️ Видимость и доступность полей меняйте условным оформлением (УсловноеОформление формы) там, где это возможно, а не кодом при каждом изменении — платформа применит его сама.
  • 📦 Не выводите на форму то, что пользователю не нужно прямо сейчас: лишние реквизиты и колонки увеличивают объём пересылаемых данных.

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

Динамические формы: добавляем реквизиты и элементы кодом

Иногда набор полей заранее неизвестен — например, форма настроек, где колонки зависят от выбранного режима. Тогда реквизиты и элементы создают программно. Ключевое правило: реквизиты формы добавляют только на сервере методом ИзменитьРеквизиты, с клиента это сделать нельзя.

&НаСервере
Процедура ДобавитьПолеКомментарийНаСервере()
    НовыйРеквизит = Новый РеквизитФормы(
        "Комментарий", Новый ОписаниеТипов("Строка"));

    ДобавляемыеРеквизиты = Новый Массив;
    ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);

    НовыйЭлемент = Элементы.Добавить("Комментарий", Тип("ПолеФормы"));
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ПутьКДанным = "Комментарий";
КонецПроцедуры

Сначала создаём реквизит формы и регистрируем его через ИзменитьРеквизиты, затем добавляем элемент Элементы.Добавить и привязываем его к реквизиту через свойство ПутьКДанным. Элементы, в отличие от реквизитов, можно добавлять и перестраивать и в серверной процедуре — главное, чтобы реквизит, на который ссылается ПутьКДанным, уже существовал.

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

Частые ошибки при разработке форм

Диагностика: выберите симптом

Ещё две ошибки, которые видно не сразу:

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

Частые вопросы

Чем управляемая форма отличается от обычной?
Обычные формы остались в версии 8.2 и работают только в толстом клиенте. В 8.3 основной тип — управляемая форма: интерфейс строит платформа, код делится на клиент и сервер, форма работает и в тонком, и в веб-клиенте.
Почему открывается авто-форма, а не моя?
Своя форма создана, но не назначена основной. Откройте свойства объекта и в разделе основных форм укажите вашу форму для нужного вида (элемента, списка, выбора).
Можно ли изменить форму в типовой конфигурации?
Да, но прямое редактирование снимает конфигурацию с поддержки и усложняет обновления. Правильнее добавить свою форму или доработку через расширение конфигурации — оно не трогает исходные объекты.
Как открыть нужную форму из кода?
Методом ОткрытьФорму с полным именем формы, например ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента"). Параметры открытия передают вторым аргументом.
Что такое основной реквизит формы?
Это реквизит, через который форма связана с данными объекта (ОбъектСправочника, ДокументОбъект). Он помечен жирным в списке реквизитов, и именно его данные записываются при сохранении формы.