Управляемые формы 1С 8.3 своими руками: от конструктора до кода видимости

· 10 мин

Содержание

Интерфейс в 1С 8.3 создают в Конфигураторе: открываете объект в дереве метаданных, на вкладке «Формы» нажимаете кнопку добавления и проходите конструктор формы. Дальше форму собирают из реквизитов, элементов и команд, а поведение задают в модуле формы.

Частое заблуждение новичков — «нарисовать» форму, как в старых версиях, расставляя поля по пикселям. В управляемой форме так не работает . Вы задаёте дерево элементов и группы, а платформа сама раскладывает их под размер окна, веб-клиент и мобильное приложение. Пошаговая инструкция ниже — для разработчиков, которые делают свою конфигурацию или дорабатывают типовую через расширение.

Подготовка: из чего состоит управляемая форма

Прежде чем создавать форму, разберитесь с четырьмя частями редактора. Они связаны между собой, и почти все ошибки начинающих — от путаницы между ними.

  • 🧩 Реквизиты — данные формы. Основной реквизит Объект даёт доступ к шапке и табличным частям документа или справочника. Можно добавлять свои реквизиты любого типа, в том числе таблицу значений или динамический список.
  • 🌳 Элементы — то, что видит пользователь: поля, таблицы, группы, кнопки, декорации. Каждый элемент показывает какой-то реквизит или выполняет команду.
  • ⚙️ Команды — действия формы. Команда сама по себе невидима, кнопкой она становится, когда её перетащили в командную панель.
  • 📜 Модуль — код на встроенном языке с директивами &НаКлиенте и &НаСервере.

Редактор формы открывается двойным щелчком по форме. Сверху слева — дерево элементов, справа — вкладки реквизитов, команд и параметров. Внизу — вкладки «Форма» и «Модуль» и область предварительного просмотра.

Работаете с типовой конфигурацией на поддержке? Не снимайте её с поддержки ради одной кнопки. Создайте расширение, в контекстном меню формы выберите «Добавить в расширение» и правьте уже заимствованную форму. Обновления типовой тогда не затрут ваши доработки.

Шаг 1. Как создать форму в 1С и выбрать её тип

Форма всегда принадлежит объекту метаданных или существует как общая. Порядок для справочника или документа:

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

Тип формы определяет, какой основной реквизит получит форма и где её будет использовать платформа.

Тип формыОсновной реквизитКогда открывается
Форма элемента / документаОбъект нужного типаПри открытии одной записи
Форма спискаСписок (динамический список)При открытии списка из раздела
Форма выбораСписокКогда пользователь выбирает значение в поле
Форма группыОбъектДля групп иерархического справочника
Общая формаЗадаёте самиИз кода через ОткрытьФорму() или из команды

Для обработок и отчётов форма одна, обычно её и делают основной. Общие формы создают в ветке Общие → Общие формы — они подходят для мастеров, настроек, диалогов, которые не привязаны к одному объекту.

Если основная форма не назначена, платформа сгенерирует её автоматически. Для прототипа этого хватает, но кастомизировать автоформу нельзя — её придётся всё равно создать явно.

Шаг 2. Палитра свойств и настройка элементов формы

Палитра свойств — главный инструмент настройки. Выделите элемент в дереве и нажмите Alt+Enter или выберите «Свойства» в контекстном меню. Палитра остаётся открытой и показывает свойства того, что выделено сейчас: элемента, реквизита, команды или самой формы.

Как добавить поле

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

Вид поля потом можно сменить в свойстве Вид: поле ввода, флажок, переключатель, поле надписи, поле картинки и другие.

Свойства, которые настраивают чаще всего

СвойствоЧто делаетПример
ЗаголовокПодпись поля«Дата поставки» вместо имени реквизита
ПоложениеЗаголовкаГде подпись: слева, сверху, нетСверху для узких колонок
Ширина, РастягиватьПоГоризонталиРазмер поля в символах10 для даты, растягивать для комментария
Подсказка, ОтображениеПодсказкиПояснение под полем или в кнопке «?»Формат номера договора
АвтоОтметкаНезаполненногоКрасное подчёркивание пустого поляОбязательные реквизиты
КнопкаВыбора, КнопкаОчисткиКнопки справа в полеСкрыть очистку у обязательного поля
ТолькоПросмотрПоле видно, но не редактируетсяСумма, которая считается сама
ФорматКак выводится значениеЧДЦ=2 — два знака после запятой

В палитре же назначают обработчики событий: ПриИзменении, НачалоВыбора, Очистка. Нажмите на лупу рядом с событием — Конфигуратор создаст процедуру в модуле и спросит, где её выполнять.

Свойство ПроверкаЗаполнения задаётся у реквизита объекта метаданных, а не у элемента формы. Отметка незаполненного на форме — только визуальная подсказка, запись она не запрещает.

Шаг 3. Таблицы и динамические списки на форме

Табличные данные выводят тремя способами. Выбор зависит от того, откуда берутся строки и надо ли их записывать.

Табличная часть объекта

Перетащите Объект.Товары из реквизитов в дерево элементов. Получится таблица формы с колонками. Лишние колонки удалите или выключите им Видимость. Колонки можно объединить в группу колонок, чтобы, например, количество и единица шли в одной ячейке друг под другом.

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

Динамический список

Это основа форм списков. Добавьте реквизит формы с типом ДинамическийСписок и откройте его свойства:

  • 📌 ОсновнаяТаблица — таблица, из которой берутся строки;
  • 📌 ПроизвольныйЗапрос — флажок, если нужен свой запрос с соединениями;
  • 📌 «Настройки списка» — отборы, сортировка и условное оформление по умолчанию.

Динамический список работает на механизме компоновки данных. Он читает строки порциями по мере прокрутки, поэтому нормально держит десятки тысяч записей. Пользователь может настраивать отбор и группировку через Ещё → Настроить список.

Таблица значений в реквизите формы

Нужна для мастеров и обработок: подобрали данные запросом, показали, пользователь отметил строки. Реквизит типа ТаблицаЗначений заполняют на сервере через ЗначениеВРеквизитФормы(), а забирают обратно через РеквизитФормыВЗначение().

СпособИсточник строкЗаписывается в базуПодходит для
Табличная частьОбъектВместе с объектомТовары в документе
Динамический списокЗапрос к базеНет, только чтениеФормы списков, подборы
Таблица значенийКодТолько через ваш кодОбработки, мастера

Шаг 4. Командный интерфейс формы и кнопки

Кнопка в управляемой форме — это команда, выведенная в командную панель. Порядок создания своей кнопки:

  1. Откройте вкладку «Команды» → «Команды формы» и добавьте новую команду.
  2. В палитре задайте Заголовок, при желании Картинка и Отображение (картинка, текст или оба).
  3. В свойстве Действие нажмите лупу — появится процедура-обработчик.
  4. Перетащите команду в КоманднаяПанель формы или в свою группу кнопок.

Обработчик создаётся на клиенте. Если для команды нужны данные из базы, вызывайте серверную процедуру:

&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
	ЗаполнитьПоОстаткамНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере()
	// запрос к регистру остатков и заполнение Объект.Товары
КонецПроцедуры

Стандартные команды («Записать», «Провести», «Удалить») платформа добавляет сама. Их порядок и видимость меняют в той же командной панели, а флажок автозаполнения у панели решает, выводить ли их автоматически.

Командный интерфейс разделов

Интерфейс всей программы — разделы, панель навигации и действий — собирается из подсистем. Объект попадает в раздел, если включён в состав подсистемы. Порядок и видимость команд внутри раздела настраивают в редакторе командного интерфейса подсистемы: контекстное меню подсистемы → «Открыть командный интерфейс». Там же отмечают, каким ролям видна команда.

На уровне формы есть отдельный «Командный интерфейс» — панель навигации и действий открытого объекта. Туда выводят связанные списки, например движения документа или файлы.

Шаг 5. Декорации, группы и оформление формы

Порядок на форме создают группы, а не координаты. Основные виды групп:

  • 📦 Обычная группа — свойство Группировка определяет направление: вертикально, горизонтально или горизонтально, если хватает ширины;
  • 🗂️ Страницы — закладки; внутри каждая страница — отдельная группа;
  • 🔘 Командная панель и группа кнопок — для своих команд;
  • 📂 Подменю — выпадающий список команд, экономит место.

У группы есть свойство Отображение — обычное, слабое или сильное выделение рамкой. ОтображатьЗаголовок выключают, когда подпись группы не нужна.

Декорации

Декорация не связана с данными. Их два вида:

  • ✏️ Надпись — текст-подсказка или заголовок блока. Свойство Гиперссылка превращает её в ссылку, а нажатие ловится событием Нажатие.
  • 🖼️ Картинка — иконка или логотип из общих картинок конфигурации.

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

Условное оформление

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

Пример программного добавления — подсветить красным нулевое количество в табличной части:

Элемент = УсловноеОформление.Элементы.Добавить();

ПолеОформления = Элемент.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличество.Имя);

Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Количество");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Отбор.ПравоеЗначение = 0;

Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);

Код ставят в ПриСозданииНаСервере. Цвета и шрифты для единого стиля лучше брать из Общие → Элементы стиля, а не задавать вручную на каждой форме.

Шаг 6. Видимость и доступность элементов из кода

Статические свойства задают в палитре. Когда поле должно появляться в зависимости от данных, меняйте свойства из модуля: Видимость, Доступность, ТолькоПросмотр. К элементу обращаются через коллекцию Элементы по имени.

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	УправлениеФормой(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
	УправлениеФормой(ЭтотОбъект);
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УправлениеФормой(Форма)
	ЭтоВозврат = (Форма.Объект.ВидОперации =
		ПредопределенноеЗначение("Перечисление.ВидыОперацийПоступления.Возврат"));
	Форма.Элементы.ДокументОснование.Видимость = ЭтоВозврат;
	Форма.Элементы.Склад.Доступность = Не ЭтоВозврат;
КонецПроцедуры

Имена перечисления и элементов здесь условные — подставьте свои.

Элементы, созданные программно

Иногда поле нужно добавить в рантайме: например, по настройке пользователя. Сначала создают реквизит, потом элемент:

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

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

Группа ГруппаШапка должна существовать на форме. Метод ИзменитьРеквизиты() вызывают только на сервере.

Видимость по ролям и функциональным опциям

Не всё нужно решать кодом. У реквизита формы есть свойства «Просмотр» и «Редактирование» с флажками по ролям: без права на просмотр поле просто не покажется. А свойство ФункциональныеОпции у элементов и команд скрывает их целиком, когда опция выключена в настройках программы.

Где менять интерфейс в вашем случае?

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

  • ❌ Видимость задают в ПриОткрытии. Форма успевает отрисоваться, и поля мигают. Начальное состояние ставьте в ПриСозданииНаСервере.
  • ❌ На каждое изменение поля — серверный вызов. Если для расчёта видимости хватает данных формы, используйте процедуру &НаКлиентеНаСервереБезКонтекста. Пользователь в тонком клиенте через интернет это почувствует сразу.
  • ❌ Обращение к ссылочным реквизитам на клиенте через точку. Выражение Объект.Контрагент.ИНН на клиенте не сработает: данные ссылки нужно получать на сервере.
  • ❌ Правка формы типовой «в лоб». Снятие с поддержки превращает каждое обновление в ручное сравнение. Расширение решает ту же задачу без этой цены.
  • ❌ Подсветка строк в коде при выводе. Для таблиц используйте условное оформление: оно работает и в динамических списках, и быстрее.
  • ❌ «Изменения не видны». Пользователь мог раньше сам настроить форму. Попросите его открыть Ещё → Изменить форму и вернуть стандартные настройки.

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

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