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

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

Из чего состоит управляемая форма

В редакторе формы в конфигураторе четыре главных панели:

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

Важно понимать разницу: реквизит — это данные, элемент — их отображение. Поле Наименование на форме — это элемент, который через свойство ПутьКДанным показывает реквизит Объект.Наименование. Можно удалить элемент, и данные останутся; можно вывести один реквизит в два разных поля.

Элементы формы 1С связаны с реквизитами через путь к данным
Элементы формы 1С связаны с реквизитами через путь к данным

Какие бывают элементы формы

  • Поле формы — показывает реквизит. У поля есть вид: поле ввода, флажок, переключатель, надпись, поле картинки, поле HTML-документа и другие.
  • Группа формы — контейнер для других элементов: обычная группа (выстраивает поля по горизонтали или вертикали), страницы и страница (закладки), командная панель, контекстное меню.
  • Таблица формы — показывает табличную часть, динамический список или таблицу значений.
  • Кнопка формы — запускает команду.
  • Декорация — надпись или картинка без связи с данными.

Как добавить элемент в конфигураторе

Разберу на примере формы элемента справочника.

Если формы ещё нет

  1. В дереве конфигурации раскройте справочник, например «Склады».
  2. Откройте ветку «Формы» и нажмите «Добавить».
  3. В конструкторе выберите «Форма элемента справочника» и отметьте «Назначить форму основной».
  4. Отметьте реквизиты, которые нужны на форме, и нажмите «Готово».

Если форма есть

  1. Откройте форму двойным щелчком.
  2. На панели «Реквизиты» раскройте Объект и найдите нужный реквизит.
  3. Перетащите его мышью в дерево «Элементы» — в нужную группу и на нужное место.
  4. В свойствах нового элемента проверьте «Вид», «Заголовок» и при необходимости «Видимость».

Кнопка добавляется так же: создайте команду на закладке «Команды», задайте ей обработчик (поле «Действие») и перетащите команду в командную панель формы.

В типовых конфигурациях на поддержке так делать не стоит: изменение формы прямо в конфигурации превращает каждое обновление в ручное объединение. Для них есть расширения.

Как добавить элемент через расширение

  1. Создайте расширение конфигурации, как описано в статье как создать расширение в 1С.
  2. В дереве основной конфигурации найдите форму, щёлкните правой кнопкой и выберите «Добавить в расширение».
  3. Откройте заимствованную форму в расширении. Дальше всё как в обычном редакторе: перетаскивайте реквизиты, добавляйте группы и кнопки.
  4. Если нужен новый реквизит справочника, сначала заимствуйте сам справочник и добавьте реквизит в расширение.

Элементы, добавленные в расширении, накладываются на типовую форму. После обновления конфигурации они сохраняются, если разработчики не удалили группу, в которую вы их поместили. Установка готового расширения в базу — в статье как установить расширение в 1С.

Как добавить элемент на форму программно

Программное добавление нужно, когда состав формы зависит от условий: разные поля для разных видов номенклатуры, колонки по числу складов и т. п. Его же иногда используют в расширениях, чтобы меньше зависеть от разметки типовой формы.

Поле для существующего реквизита

1С
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры

Третий параметр — родитель: группа, в которую попадёт поле. ГруппаОсновное здесь для примера — настоящее имя группы посмотрите в дереве элементов своей формы. Если родителя не указать, поле окажется в конце формы. Чтобы поставить поле в конкретное место, используйте Элементы.Вставить: он принимает ещё и элемент, перед которым нужно вставить новый.

Новый реквизит формы и поле для него

Если реквизита нет, сначала создаём его, потом поле:

1С
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

	ЭтотОбъект.Подсказка = "Заполните код поставщика перед записью";

КонецПроцедуры

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

Кнопка и команда

1С
Команда = Команды.Добавить("ПроверитьКод");
Команда.Действие = "ПроверитьКод";
Команда.Заголовок = "Проверить код";

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

В модуле формы должна быть клиентская процедура ПроверитьКод(Команда) — её имя указано в Действие.

В расширении

В расширении тот же код пишут в обработчике, который выполняется после типового:

1С
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	// добавление элементов
КонецПроцедуры

Имена своих элементов и реквизитов лучше начинать с префикса расширения, например Расш_, — так они не столкнутся с типовыми после обновления.

Как программно скрыть или изменить элемент

Добавлять элементы приходится реже, чем управлять уже существующими. Основные свойства, которые меняют из кода:

  • Видимость — показывать элемент или нет;
  • Доступность — можно ли с ним взаимодействовать (недоступное поле выглядит серым);
  • ТолькоПросмотр — значение видно, но изменить нельзя;
  • Заголовок — подпись поля или кнопки;
  • АвтоОтметкаНезаполненного — красное подчёркивание пустого поля.
1С
&НаСервере
Процедура УправлениеЭлементами()

	ЭтоУслуга = (Объект.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга);
	Элементы.ЕдиницаИзмерения.Видимость = Не ЭтоУслуга;
	Элементы.Артикул.АвтоОтметкаНезаполненного = Не ЭтоУслуга;

КонецПроцедуры

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

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

Типовые ошибки

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

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

Итог

  • Элемент формы — то, что видно на экране; реквизит — данные, которые он показывает через ПутьКДанным.
  • Основные виды элементов: поля, группы, таблицы, кнопки и декорации.
  • В конфигураторе элемент добавляют перетаскиванием реквизита в дерево элементов.
  • В типовых конфигурациях форму меняют через расширение, а не напрямую.
  • Программно элемент добавляют через Элементы.Добавить или Элементы.Вставить, новый реквизит — через ИзменитьРеквизиты одним вызовом.
  • Реквизит формы, созданный кодом, в базе не хранится — для хранения нужен реквизит объекта.