Управляемые формы 1С 8.3 своими руками: от конструктора до кода видимости
Содержание
Интерфейс в 1С 8.3 создают в Конфигураторе: открываете объект в дереве метаданных, на вкладке «Формы» нажимаете кнопку добавления и проходите конструктор формы. Дальше форму собирают из реквизитов, элементов и команд, а поведение задают в модуле формы.
Частое заблуждение новичков — «нарисовать» форму, как в старых версиях, расставляя поля по пикселям. В управляемой форме так не работает . Вы задаёте дерево элементов и группы, а платформа сама раскладывает их под размер окна, веб-клиент и мобильное приложение. Пошаговая инструкция ниже — для разработчиков, которые делают свою конфигурацию или дорабатывают типовую через расширение.
Подготовка: из чего состоит управляемая форма
Прежде чем создавать форму, разберитесь с четырьмя частями редактора. Они связаны между собой, и почти все ошибки начинающих — от путаницы между ними.
- 🧩 Реквизиты — данные формы. Основной реквизит
Объектдаёт доступ к шапке и табличным частям документа или справочника. Можно добавлять свои реквизиты любого типа, в том числе таблицу значений или динамический список. - 🌳 Элементы — то, что видит пользователь: поля, таблицы, группы, кнопки, декорации. Каждый элемент показывает какой-то реквизит или выполняет команду.
- ⚙️ Команды — действия формы. Команда сама по себе невидима, кнопкой она становится, когда её перетащили в командную панель.
- 📜 Модуль — код на встроенном языке с директивами
&НаКлиентеи&НаСервере.
Редактор формы открывается двойным щелчком по форме. Сверху слева — дерево элементов, справа — вкладки реквизитов, команд и параметров. Внизу — вкладки «Форма» и «Модуль» и область предварительного просмотра.
Работаете с типовой конфигурацией на поддержке? Не снимайте её с поддержки ради одной кнопки. Создайте расширение, в контекстном меню формы выберите «Добавить в расширение» и правьте уже заимствованную форму. Обновления типовой тогда не затрут ваши доработки.
Шаг 1. Как создать форму в 1С и выбрать её тип
Форма всегда принадлежит объекту метаданных или существует как общая. Порядок для справочника или документа:
- В дереве конфигурации откройте нужный объект двойным щелчком.
- Перейдите на вкладку «Формы».
- Нажмите кнопку с плюсом рядом с нужной строкой (форма объекта, списка, выбора) или в списке форм.
- В конструкторе выберите тип формы и отметьте флажок назначения основной формой, если она должна открываться по умолчанию.
- На следующих шагах конструктора отметьте реквизиты и табличные части, которые попадут на форму сразу.
- Нажмите «Готово» — откроется редактор.
Тип формы определяет, какой основной реквизит получит форма и где её будет использовать платформа.
| Тип формы | Основной реквизит | Когда открывается |
|---|---|---|
| Форма элемента / документа | Объект нужного типа | При открытии одной записи |
| Форма списка | Список (динамический список) | При открытии списка из раздела |
| Форма выбора | Список | Когда пользователь выбирает значение в поле |
| Форма группы | Объект | Для групп иерархического справочника |
| Общая форма | Задаёте сами | Из кода через ОткрытьФорму() или из команды |
Для обработок и отчётов форма одна, обычно её и делают основной. Общие формы создают в ветке Общие → Общие формы — они подходят для мастеров, настроек, диалогов, которые не привязаны к одному объекту.
Если основная форма не назначена, платформа сгенерирует её автоматически. Для прототипа этого хватает, но кастомизировать автоформу нельзя — её придётся всё равно создать явно.
Шаг 2. Палитра свойств и настройка элементов формы
Палитра свойств — главный инструмент настройки. Выделите элемент в дереве и нажмите Alt+Enter или выберите «Свойства» в контекстном меню. Палитра остаётся открытой и показывает свойства того, что выделено сейчас: элемента, реквизита, команды или самой формы.
Как добавить поле
Самый быстрый способ — перетащить реквизит из правой панели в дерево элементов. Платформа сама создаст поле подходящего вида: для ссылки — поле ввода с кнопкой выбора, для булева — флажок, для табличной части — таблицу.
Вид поля потом можно сменить в свойстве Вид: поле ввода, флажок, переключатель, поле надписи, поле картинки и другие.
Свойства, которые настраивают чаще всего
| Свойство | Что делает | Пример |
|---|---|---|
Заголовок | Подпись поля | «Дата поставки» вместо имени реквизита |
ПоложениеЗаголовка | Где подпись: слева, сверху, нет | Сверху для узких колонок |
Ширина, РастягиватьПоГоризонтали | Размер поля в символах | 10 для даты, растягивать для комментария |
Подсказка, ОтображениеПодсказки | Пояснение под полем или в кнопке «?» | Формат номера договора |
АвтоОтметкаНезаполненного | Красное подчёркивание пустого поля | Обязательные реквизиты |
КнопкаВыбора, КнопкаОчистки | Кнопки справа в поле | Скрыть очистку у обязательного поля |
ТолькоПросмотр | Поле видно, но не редактируется | Сумма, которая считается сама |
Формат | Как выводится значение | ЧДЦ=2 — два знака после запятой |
В палитре же назначают обработчики событий: ПриИзменении, НачалоВыбора, Очистка. Нажмите на лупу рядом с событием — Конфигуратор создаст процедуру в модуле и спросит, где её выполнять.
Свойство ПроверкаЗаполнения задаётся у реквизита объекта метаданных, а не у элемента формы. Отметка незаполненного на форме — только визуальная подсказка, запись она не запрещает.
Шаг 3. Таблицы и динамические списки на форме
Табличные данные выводят тремя способами. Выбор зависит от того, откуда берутся строки и надо ли их записывать.
Табличная часть объекта
Перетащите Объект.Товары из реквизитов в дерево элементов. Получится таблица формы с колонками. Лишние колонки удалите или выключите им Видимость. Колонки можно объединить в группу колонок, чтобы, например, количество и единица шли в одной ячейке друг под другом.
Итоги в подвале включаются свойством таблицы Подвал, а у колонки задаётся ПутьКДаннымПодвала — обычно это реквизит формы с суммой.
Динамический список
Это основа форм списков. Добавьте реквизит формы с типом ДинамическийСписок и откройте его свойства:
- 📌
ОсновнаяТаблица— таблица, из которой берутся строки; - 📌
ПроизвольныйЗапрос— флажок, если нужен свой запрос с соединениями; - 📌 «Настройки списка» — отборы, сортировка и условное оформление по умолчанию.
Динамический список работает на механизме компоновки данных. Он читает строки порциями по мере прокрутки, поэтому нормально держит десятки тысяч записей. Пользователь может настраивать отбор и группировку через Ещё → Настроить список.
Таблица значений в реквизите формы
Нужна для мастеров и обработок: подобрали данные запросом, показали, пользователь отметил строки. Реквизит типа ТаблицаЗначений заполняют на сервере через ЗначениеВРеквизитФормы(), а забирают обратно через РеквизитФормыВЗначение().
| Способ | Источник строк | Записывается в базу | Подходит для |
|---|---|---|---|
| Табличная часть | Объект | Вместе с объектом | Товары в документе |
| Динамический список | Запрос к базе | Нет, только чтение | Формы списков, подборы |
| Таблица значений | Код | Только через ваш код | Обработки, мастера |
Шаг 4. Командный интерфейс формы и кнопки
Кнопка в управляемой форме — это команда, выведенная в командную панель. Порядок создания своей кнопки:
- Откройте вкладку «Команды» → «Команды формы» и добавьте новую команду.
- В палитре задайте
Заголовок, при желанииКартинкаиОтображение(картинка, текст или оба). - В свойстве
Действиенажмите лупу — появится процедура-обработчик. - Перетащите команду в
КоманднаяПанельформы или в свою группу кнопок.
Обработчик создаётся на клиенте. Если для команды нужны данные из базы, вызывайте серверную процедуру:
&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
ЗаполнитьПоОстаткамНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере()
// запрос к регистру остатков и заполнение Объект.Товары
КонецПроцедуры
Стандартные команды («Записать», «Провести», «Удалить») платформа добавляет сама. Их порядок и видимость меняют в той же командной панели, а флажок автозаполнения у панели решает, выводить ли их автоматически.
Командный интерфейс разделов
Интерфейс всей программы — разделы, панель навигации и действий — собирается из подсистем. Объект попадает в раздел, если включён в состав подсистемы. Порядок и видимость команд внутри раздела настраивают в редакторе командного интерфейса подсистемы: контекстное меню подсистемы → «Открыть командный интерфейс». Там же отмечают, каким ролям видна команда.
На уровне формы есть отдельный «Командный интерфейс» — панель навигации и действий открытого объекта. Туда выводят связанные списки, например движения документа или файлы.
Шаг 5. Декорации, группы и оформление формы
Порядок на форме создают группы, а не координаты. Основные виды групп:
- 📦 Обычная группа — свойство
Группировкаопределяет направление: вертикально, горизонтально или горизонтально, если хватает ширины; - 🗂️ Страницы — закладки; внутри каждая страница — отдельная группа;
- 🔘 Командная панель и группа кнопок — для своих команд;
- 📂 Подменю — выпадающий список команд, экономит место.
У группы есть свойство Отображение — обычное, слабое или сильное выделение рамкой. ОтображатьЗаголовок выключают, когда подпись группы не нужна.
Декорации
Декорация не связана с данными. Их два вида:
- ✏️ Надпись — текст-подсказка или заголовок блока. Свойство
Гиперссылкапревращает её в ссылку, а нажатие ловится событиемНажатие. - 🖼️ Картинка — иконка или логотип из общих картинок конфигурации.
В надпись можно вывести форматированную строку: часть текста жирным, часть — ссылкой. Это удобно для предупреждений вида «Не заполнен договор. Выбрать».
Условное оформление
Чтобы подсветить строки или поля по условию, используйте условное оформление формы. Оно настраивается в свойствах формы и работает без кода: задаёте условие, оформляемые поля и параметр — цвет текста, цвет фона, шрифт, текст пустого поля. Для таблиц это быстрее и правильнее, чем красить строки в коде при выводе.
Пример программного добавления — подсветить красным нулевое количество в табличной части:
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеОформления = Элемент.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличество.Имя);
Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Количество");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Отбор.ПравоеЗначение = 0;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
Код ставят в ПриСозданииНаСервере. Цвета и шрифты для единого стиля лучше брать из Общие → Элементы стиля, а не задавать вручную на каждой форме.
Шаг 6. Видимость и доступность элементов из кода
Статические свойства задают в палитре. Когда поле должно появляться в зависимости от данных, меняйте свойства из модуля: Видимость, Доступность, ТолькоПросмотр. К элементу обращаются через коллекцию Элементы по имени.
Рабочий приём — одна процедура, которая вызывается и при открытии, и при изменении поля. Чтобы при изменении не ходить на сервер, процедуру делают без контекста и передают в неё форму:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УправлениеФормой(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
УправлениеФормой(ЭтотОбъект);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УправлениеФормой(Форма)
ЭтоВозврат = (Форма.Объект.ВидОперации =
ПредопределенноеЗначение("Перечисление.ВидыОперацийПоступления.Возврат"));
Форма.Элементы.ДокументОснование.Видимость = ЭтоВозврат;
Форма.Элементы.Склад.Доступность = Не ЭтоВозврат;
КонецПроцедуры
Имена перечисления и элементов здесь условные — подставьте свои.
Элементы, созданные программно
Иногда поле нужно добавить в рантайме: например, по настройке пользователя. Сначала создают реквизит, потом элемент:
&НаСервере
Процедура ДобавитьКомментарийМенеджера()
НовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(Новый РеквизитФормы("КомментарийМенеджера",
Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200)), , "Комментарий менеджера"));
ИзменитьРеквизиты(НовыеРеквизиты);
Поле = Элементы.Добавить("КомментарийМенеджера", Тип("ПолеФормы"), Элементы.ГруппаШапка);
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "КомментарийМенеджера";
КонецПроцедуры
Группа ГруппаШапка должна существовать на форме. Метод ИзменитьРеквизиты() вызывают только на сервере.
Видимость по ролям и функциональным опциям
Не всё нужно решать кодом. У реквизита формы есть свойства «Просмотр» и «Редактирование» с флажками по ролям: без права на просмотр поле просто не покажется. А свойство ФункциональныеОпции у элементов и команд скрывает их целиком, когда опция выключена в настройках программы.
Частые ошибки при создании интерфейса формы
- ❌ Видимость задают в
ПриОткрытии. Форма успевает отрисоваться, и поля мигают. Начальное состояние ставьте вПриСозданииНаСервере. - ❌ На каждое изменение поля — серверный вызов. Если для расчёта видимости хватает данных формы, используйте процедуру
&НаКлиентеНаСервереБезКонтекста. Пользователь в тонком клиенте через интернет это почувствует сразу. - ❌ Обращение к ссылочным реквизитам на клиенте через точку. Выражение
Объект.Контрагент.ИННна клиенте не сработает: данные ссылки нужно получать на сервере. - ❌ Правка формы типовой «в лоб». Снятие с поддержки превращает каждое обновление в ручное сравнение. Расширение решает ту же задачу без этой цены.
- ❌ Подсветка строк в коде при выводе. Для таблиц используйте условное оформление: оно работает и в динамических списках, и быстрее.
- ❌ «Изменения не видны». Пользователь мог раньше сам настроить форму. Попросите его открыть
Ещё → Изменить формуи вернуть стандартные настройки.
Частые вопросы
Можно ли в 8.3 работать с обычными формами?
Чем реквизит формы отличается от реквизита объекта?
Как открыть свою общую форму из другой формы?
ОткрытьФорму("ОбщаяФорма.ИмяФормы", Параметры, ЭтотОбъект). Параметры передают структурой, а в открытой форме читают в ПриСозданииНаСервере через Параметры.