Программирование в 1С

Программное создание элементов управляемой формы в 1С 8.3: поля, группы, кнопки и команды

Коротко

Чтобы создать элемент формы программно в 1С 8.3, используйте методы коллекции Элементы (тип ВсеЭлементыФормы) на сервере — обычно в обработчике ПриСозданииНаСервере: Элементы.Добавить(Имя, Тип("ПолеФормы"), Родитель) или Элементы.Вставить(Имя, Тип("ПолеФормы"), Родитель, ЭлементПередКоторымВставляем). После создания обязательно задайте свойство Вид (например, ВидПоляФормы.ПолеВвода) и привязку к реквизиту через ПутьКДанным.

Для кнопок сначала добавьте команду в коллекцию Команды.Добавить(Имя), укажите в свойстве Действие имя клиентской процедуры с директивой &НаКлиенте, а затем создайте элемент с типом Тип("КнопкаФормы") и заполните ИмяКоманды. Обработчики событий полей и таблиц подключаются методом Элемент.УстановитьДействие(ИмяСобытия, Действие).

Коллекция Элементы (ВсеЭлементыФормы): методы Добавить и Вставить

В управляемой форме 1С 8.3 все визуальные элементы — поля, группы, таблицы, кнопки и декорации — находятся в свойстве формы Элементы, которое имеет платформенный тип ВсеЭлементыФормы. Программное добавление элементов на форму 1С 8.3 доступно только на сервере (в процедурах с директивой &НаСервере), чаще всего в событийном обработчике ПриСозданииНаСервере.

У коллекции ВсеЭлементыФормы есть два метода для создания новых элементов: Добавить() помещает элемент в конец выбранного родителя, а Вставить() размещает его строго перед указанным существующим элементом того же родителя:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // 1. Добавление в конец группы Шапка
    ПолеКомментария = Элементы.Добавить(
        "КомментарийЭкспедитора",
        Тип("ПолеФормы"),
        Элементы.ГруппаШапка);
    ПолеКомментария.Вид = ВидПоляФормы.ПолеВвода;
    ПолеКомментария.ПутьКДанным = "Объект.Комментарий";

    // 2. Вставка перед конкретным элементом внутри той же группы
    ПолеСрочности = Элементы.Вставить(
        "ПризнакСрочности",
        Тип("ПолеФормы"),
        Элементы.ГруппаШапка,
        Элементы.КомментарийЭкспедитора);
    ПолеСрочности.Вид = ВидПоляФормы.ПолеФлажка;
    ПолеСрочности.ПутьКДанным = "Объект.СрочнаяДоставка";
КонецПроцедуры
Элементы.Добавить / Вставить
ИмяСтрока — уникальное имя элемента в пределах формы
ТипТип — Тип("ПолеФормы"), Тип("ГруппаФормы"), Тип("КнопкаФормы"), Тип("ТаблицаФормы"), Тип("ДекорацияФормы")
РодительГруппаФормы или ТаблицаФормы (по умолчанию — корень формы)
Элементтолько для Вставить(): элемент того же родителя, перед которым выполняется вставка
→ ПолеФормы, ГруппаФормы, КнопкаФормы, ТаблицаФормы или ДекорацияФормы

Обратите внимание: при вызове Элементы.Вставить() четвёртый параметр (элемент, перед которым вставляем) обязательно должен быть непосредственно подчинён тому же Родителю, который передан третьим параметром. Если передать элемент из другой группы, платформа выбросит ошибку времени выполнения.

Второй параметр методов Добавить() и Вставить() всегда принимает объект Тип("..."). В зависимости от переданного типа метод возвращает соответствующий объект элемента управляемой формы со своим набором свойств и перечислением Вид:

Тип элемента в Тип("...") Свойство Вид (системное перечисление) Ключевые свойства привязки Для чего используется
ГруппаФормы ВидГруппыФормы (ОбычнаяГруппа, Страницы, Страница, КоманднаяПанель, Подменю, ГруппаКолонок) Группировка, Отображение, ОтображатьЗаголовок Контейнеры компоновки, вкладки (страницы), командные панели и колонки таблиц
ПолеФормы ВидПоляФормы (ПолеВвода, ПолеФлажка, ПолеНадписи, ПолеПереключателя, ПолеКартинки, ПолеHTMLДокумента, ПолеТабличногоДокумента) ПутьКДанным, Заголовок, ТолькоПросмотр Ввод и отображение реквизитов формы, реквизитов объекта и колонок таблиц
КнопкаФормы ВидКнопкиФормы (ОбычнаяКнопка, КнопкаКоманднойПанели, Гиперссылка, ГиперссылкаКоманднойПанели) ИмяКоманды, Заголовок, КнопкаПоУмолчанию Вызов команд формы и стандартных команд на форме или в командной панели
ТаблицаФормы ВидТаблицыФормы (ОбычнаяТаблица, Дерево, Список) ПутьКДанным, ПоложениеКоманднойПанели Отображение табличных частей, ТаблицаЗначений, ДеревоЗначений и динамических списков
ДекорацияФормы ВидДекорацииФормы (Надпись, Картинка) Заголовок, Гиперссылка, Картинка Статические поясняющие подписи, информационные плашки, гиперссылки без данных и иконки

Программное создание групп и вкладок: ГруппаФормы

Чтобы аккуратно разместить новые поля на типовой форме (особенно при доработке в расширении), сначала создают контейнер — Тип("ГруппаФормы"). Сразу после добавления группе задают Вид из перечисления ВидГруппыФормы:

  • ВидГруппыФормы.ОбычнаяГруппа — блок с вертикальной или горизонтальной группировкой (свойство Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная или Вертикальная) и настройкой рамки/сворачивания через Поведение = ПоведениеОбычнойГруппы.Свертываемая;
  • ВидГруппыФормы.Страницы — контейнер вкладок (табов), внутрь которого добавляются только группы с видом Страница;
  • ВидГруппыФормы.Страница — отдельная вкладка внутри группы Страницы.
&НаСервере
Процедура ДобавитьВкладкуДопСведений()
    // Если на форме уже есть группа страниц "ГруппаСтраницы", добавляем в неё новую вкладку
    НоваяСтраница = Элементы.Добавить(
        "СтраницаЛогистика",
        Тип("ГруппаФормы"),
        Элементы.ГруппаСтраницы);
    НоваяСтраница.Вид = ВидГруппыФормы.Страница;
    НоваяСтраница.Заголовок = "Логистика";

    // Внутри вкладки создаём обычную горизонтальную группу без заголовка
    ГруппаРеквизитов = Элементы.Добавить(
        "ГруппаЛогистикаПоля",
        Тип("ГруппаФормы"),
        НоваяСтраница);
    ГруппаРеквизитов.Вид = ВидГруппыФормы.ОбычнаяГруппа;
    ГруппаРеквизитов.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;
    ГруппаРеквизитов.Отображение = ОтображениеОбычнойГруппы.Нет;
    ГруппаРеквизитов.ОтображатьЗаголовок = Ложь;
КонецПроцедуры
ГруппаФормы
ВидВидГруппыФормы.ОбычнаяГруппа, Страницы, Страница, КоманднаяПанель
ГруппировкаГруппировкаПодчиненныхЭлементовФормы (Вертикальная, Горизонтальная, ГоризонтальнаяЕслиВозможно)
ОтображениеОтображениеОбычнойГруппы (Нет, СлабоеВыделение, ОбычноеВыделение)
ОтображатьЗаголовокБулево — показывать ли заголовок группы

Создание полей ввода, флажков и надписей: ПолеФормы и ПутьКДанным

Для отображения данных создают элемент с типом Тип("ПолеФормы"). Чтобы элемент появился на форме и отображал нужный элемент управления, выполните два шага:

  1. Задайте Вид из перечисления ВидПоляФормы (по умолчанию ставится ПолеВвода; для других контролов укажите ПолеФлажка, ПолеНадписи, ПолеПереключателя и т.д.).
  2. Привяжите элемент к существующему реквизиту через ПутьКДанным (например, "Объект.Грузополучатель" для реквизита документа или "ДополнительныйКомментарий" для реквизита формы).

Если самого реквизита на форме ещё нет, его нужно предварительно создать методом формы ИзменитьРеквизиты() и только после этого назначать в ПутьКДанным:

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

    // 2. Поле ввода для строкового реквизита
    ПолеМаршрута = Элементы.Добавить("ПолеКодМаршрута", Тип("ПолеФормы"), Элементы.ГруппаЛогистикаПоля);
    ПолеМаршрута.Вид = ВидПоляФормы.ПолеВвода;
    ПолеМаршрута.ПутьКДанным = "КодМаршрута";
    ПолеМаршрута.Ширина = 15;

    // 3. Поле флажка для булева реквизита
    ПолеПропуска = Элементы.Добавить("ПолеТребуетсяПропуск", Тип("ПолеФормы"), Элементы.ГруппаЛогистикаПоля);
    ПолеПропуска.Вид = ВидПоляФормы.ПолеФлажка;
    ПолеПропуска.ПутьКДанным = "ТребуетсяПропуск";
    ПолеПропуска.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право;
КонецПроцедуры
ПолеФормы
ВидВидПоляФормы.ПолеВвода, ПолеФлажка, ПолеНадписи, ПолеПереключателя
ПутьКДаннымСтрока — имя реквизита формы или путь через точку ("Объект.Контрагент")
ЗаголовокСтрока — если не задан, берётся из заголовка реквизита
ТолькоПросмотрБулево — запрет редактирования поля

Когда вы добавляете колонку в существующую таблицу формы (например, Элементы.Товары), в качестве родителя в Элементы.Добавить() передавайте саму таблицу Элементы.Товары, а в ПутьКДанным указывайте путь через табличную часть: "Объект.Товары.АртикулПоставщика".

В ИИ Консоли кода 1С не нужно вручную сверять имена существующих групп и путей к данным в типовой форме ERP или БП 3.0: агент видит дерево элементов и реквизитов формы в вашей базе и сразу генерирует код ПриСозданииНаСервере для расширения.

Программное создание команды и кнопки: Команды.Добавить и КнопкаФормы

В управляемой форме 1С 8.3 кнопка не вызывает процедуру модуля напрямую. Между кнопкой и кодом всегда стоит объект КомандаФормы из коллекции Команды (тип КомандыФормы). Поэтому программное добавление кнопки состоит из двух шагов:

  1. Создать команду методом Команды.Добавить(ИмяКоманды) и записать в её свойство Действие имя существующей в модуле формы клиентской процедуры с директивой &НаКлиенте.
  2. Создать визуальный элемент через Элементы.Добавить(ИмяКнопки, Тип("КнопкаФормы"), Родитель), задать Вид (ВидКнопкиФормы.ОбычнаяКнопка для размещения среди полей или ВидКнопкиФормы.КнопкаКоманднойПанели для командной панели) и связать с командой через ИмяКоманды.
&НаСервере
Процедура ДобавитьКнопкуПроверкиНаСервере()
    // 1. Создаём команду формы и связываем с клиентским обработчиком
    НоваяКоманда = Команды.Добавить("КомандаПроверитьМаршрут");
    НоваяКоманда.Заголовок = "Проверить маршрут";
    НоваяКоманда.Действие = "ПодключитьПроверкуМаршрута";
    НоваяКоманда.Картинка = БиблиотекаКартинок.ВыполнитьПроверку;
    НоваяКоманда.Отображение = ОтображениеКнопки.КартинкаИТекст;
    НоваяКоманда.ИзменяетСохраняемыеДанные = Ложь;

    // 2. Размещаем кнопку в командной панели формы
    Кнопка = Элементы.Добавить(
        "КнопкаПроверитьМаршрут",
        Тип("КнопкаФормы"),
        Элементы.ФормаКоманднаяПанель);
    Кнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
    Кнопка.ИмяКоманды = "КомандаПроверитьМаршрут";
КонецПроцедуры

&НаКлиенте
Процедура ПодключитьПроверкуМаршрута(Команда)
    Сообщить("Проверка маршрута запущена: " + КодМаршрута);
КонецПроцедуры
Команды.Добавить + КнопкаФормы
Команды.Добавить(Имя)создаёт объект КомандаФормы в коллекции КомандыФормы
Команда.ДействиеСтрока — имя процедуры &НаКлиенте в модуле формы
Кнопка.ВидВидКнопкиФормы.ОбычнаяКнопка или КнопкаКоманднойПанели
Кнопка.ИмяКомандыСтрока — имя команды из коллекции Команды
→ КомандаФормы / КнопкаФормы

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

Подключение обработчиков событий: УстановитьДействие

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

&НаСервере
Процедура НастроитьСобытияПоляМаршрута()
    Поле = Элементы.ПолеКодМаршрута;

    // Привязываем клиентские процедуры к событиям элемента
    Поле.УстановитьДействие("ПриИзменении", "ПолеКодМаршрутаПриИзменении");
    Поле.УстановитьДействие("НачалоВыбора", "ПолеКодМаршрутаНачалоВыбора");
    Поле.КнопкаВыбора = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПолеКодМаршрутаПриИзменении(Элемент)
    КодМаршрута = ВРег(СокрЛП(КодМаршрута));
КонецПроцедуры

&НаКлиенте
Процедура ПолеКодМаршрутаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // Логика открытия подбора маршрута
КонецПроцедуры
УстановитьДействие
ИмяСобытияСтрока — стандартное имя события ("ПриИзменении", "НачалоВыбора", "Очистка", "Открытие")
ДействиеСтрока — имя клиентской процедуры в модуле формы
→ не возвращает значение

Сигнатура клиентской процедуры в модуле формы должна точно соответствовать выбранному событию из Синтаксис-помощника: например, для "ПриИзменении" это (Элемент), а для "НачалоВыбора" — (Элемент, ДанныеВыбора, СтандартнаяОбработка).

Перемещение, поиск и удаление элементов: Переместить, Найти, Удалить

Помимо создания, коллекция Элементы позволяет безопасно проверять наличие элемента через Элементы.Найти(Имя), менять его положение в иерархии методом Элементы.Переместить() и полностью удалять элемент с формы методом Элементы.Удалить():

&НаСервере
Процедура ПерестроитьЭлементыФормыНаСервере()
    // 1. Безопасный поиск элемента по имени
    НайденноеПоле = Элементы.Найти("ПолеКодМаршрута");
    Если НайденноеПоле = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // 2. Перемещение элемента в другую группу перед указанным полем
    Элементы.Переместить(
        НайденноеПоле,
        Элементы.ГруппаШапка,
        Элементы.Организация);

    // 3. Удаление ненужного программного элемента
    ЛишнийЭлемент = Элементы.Найти("ПолеТребуетсяПропуск");
    Если ЛишнийЭлемент <> Неопределено Тогда
        Элементы.Удалить(ЛишнийЭлемент);
    КонецЕсли;
КонецПроцедуры
Переместить / Удалить
Элементссылка на перемещаемый или удаляемый элемент формы
Родительдля Переместить(): новый родитель элемента (по умолчанию — корень формы)
ПередЭлементомдля Переместить(): элемент внутри нового родителя, перед которым ставится перемещаемый
→ не возвращает значение

В типовых конфигурациях на БСП скрыть штатный элемент почти всегда безопаснее через Элементы.ИмяЭлемента.Видимость = Ложь, чем вызывать Элементы.Удалить(). Если физически удалить типовое поле, к которому обращаются другие процедуры модуля формы по имени Элементы.ИмяЭлемента, при открытии или записи документа возникнет ошибка обращения к несуществующему свойству.

Если нужно быстро собрать внешнюю обработку .epf или расширение .cfe с динамической генерацией вкладок, таблиц и кнопок, поставьте задачу агенту в ИИ Консоли кода 1С — он напишет серверные и клиентские процедуры и проверит форму в вашей базе.

Частые ошибки при программном создании элементов управляемой формы

  • Вызов Элементы.Добавить() на клиенте. Методы модификации коллекции ВсеЭлементыФормы (Добавить, Вставить, Переместить, Удалить) и метод УстановитьДействие() доступны только на сервере. В клиентском коде можно менять лишь свойства уже существующих элементов (например, Видимость, Доступность, ТолькоПросмотр, Заголовок).
  • Не заполнено или неверно указано свойство ПутьКДанным у ПолеФормы. В отличие от групп, декораций и кнопок, объект ПолеФормы или ТаблицаФормы обязан быть связан с данными формы. Если забыть указать ПутьКДанным или сослаться на несуществующий реквизит, элемент либо не отобразится на форме, либо вызовет исключение при открытии.
  • Создание кнопки без объекта КомандаФормы. Нельзя прописать имя процедуры напрямую в кнопку. Сначала создайте команду через Команды.Добавить(), назначьте ей Действие, а у кнопки укажите ИмяКоманды.
  • Попытка передать в Действие серверную процедуру. И свойство Команда.Действие, и второй параметр Элемент.УстановитьДействие() принимают имя процедуры, объявленной в модуле формы строго с директивой &НаКлиенте.
  • Несовпадение родителя при вызове Элементы.Вставить(). Четвёртый параметр (элемент-ориентир) должен находиться непосредственно внутри той же группы, которая передана третьим параметром Родитель.
  • Дублирование имени элемента при повторном серверном вызове. Имя каждого элемента в коллекции Элементы должно быть уникальным во всей форме. Если процедура генерации может вызываться повторно (не только в ПриСозданииНаСервере), проверяйте существование через Элементы.Найти("ИмяЭлемента") = Неопределено.

Частые вопросы о программном создании элементов формы в 1С 8.3

В каком обработчике нужно программно создавать элементы управляемой формы?

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

Почему программно добавленное ПолеФормы не появляется на экране?

Самая частая причина — у элемента ПолеФормы не заполнено свойство ПутьКДанным или указан путь к реквизиту, которого нет в реквизитах формы. Вторая причина — поле добавлено в группу со свойством Видимость = Ложь или без указания родителя попало в самый низ формы.

Как программно привязать процедуру к нажатию кнопки или изменению поля?

Для кнопки сначала создайте команду через Команды.Добавить("ИмяКоманды"), укажите в её свойстве Действие имя клиентской процедуры &НаКлиенте, а у кнопки заполните ИмяКоманды. Для события поля ввода или таблицы используйте серверный метод Элемент.УстановитьДействие("ПриИзменении", "ИмяКлиентскойПроцедуры").

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 0,1 млн токенов на 2 дн.

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка