Как программно добавить элементы на обычную форму 1С и настроить их отображение

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие 8 на базе обычных форм (например, в конфигурациях «Бухгалтерия предприятия 2.0» или «Управление производственным предприятием 1.3») часто возникает необходимость динамического изменения интерфейса. Программное добавление элементов позволяет избежать лишних правок в визуальном редакторе конфигуратора, что иногда упрощает процесс обновления сильно кастомизированных систем; для автоматизации обслуживания и пакетной установки релизов в таких базах применяется программа для пакетного архивирования и обновления баз. Однако этот процесс требует четкого понимания иерархии элементов формы и механизмов привязки данных.

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

Определение родительского контейнера для элемента

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

Проанализируем метод Добавить() коллекции ЭлементыФормы. Четвертый параметр этого метода отвечает за то, где именно появится новый объект. Рассмотрим пример добавления надписи на конкретную панель:


// Добавляем надпись на Панель
НоваяНадпись = ЭтаФорма.ЭлементыФормы.Добавить(Тип("Надпись"), "НадписьПроверен", Истина, ЭтаФорма.ЭлементыФормы.ОсновнаяПанель);
НоваяНадпись.Заголовок = "Проверен:";

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

Позиционирование и установка координат

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

  1. Найдем эталонный элемент (например, ЗатратыВТабличнойЧасти).
  2. Считаем его свойства Верх, Лево, Ширина и Высота.
  3. Установим координаты для нового элемента с учетом необходимых отступов.

// Пример установки координат флажка рядом с существующим полем
ЭлементФлажок = ЭтаФорма.ЭлементыФормы.Добавить(Тип("Флажок"), "ФЛ_Проверен", Истина,);
// Смещаем чуть ниже или вровень с существующим элементом
ЭлементФлажок.Верх = ЭтаФорма.ЭлементыФормы.ИмяДругогоЭлемента.Верх + 1;
// Устанавливаем положение по горизонтали
ЭлементФлажок.Лево = 600; 
ЭлементФлажок.Ширина = 20;
ЭлементФлажок.Высота = 19;

Привязка элемента к данным документа

Просто создать визуальный объект недостаточно — он должен быть связан с реквизитом объекта (документа или справочника), чтобы изменения сохранялись в базе данных. Часто начинающие разработчики забывают про свойство Данные. Рассмотрим, как правильно связать программно созданный флажок с реквизитом документа:

Важный момент: Реквизит (например, ФЛ_Проверен с типом Булево) должен быть предварительно создан в конфигураторе в метаданных объекта.


// Связываем флажок с данными документа
ЭлементФлажок.Данные = "Объект.ФЛ_Проверен"; 
// Для документов обычно используется путь через переменную "ЭтотОбъект" или "ДокументОбъект"
// В контексте модуля формы это выглядит так:
ЭлементФлажок.Данные = "ЭтотОбъект.ФЛ_Проверен";

Если вы не укажете путь к данным, флажок будет работать как независимая переменная формы, и при закрытии документа его состояние будет утеряно. Для сохранения и переноса накопленных в подобных реквизитах данных между базами можно использовать инструмент миграции с произвольными полями поиска.

Отображение флажка в списке документов

Когда требуется вывести признак (булево значение) в колонку списка (табличное поле), часто вместо красивой «галочки» пользователь видит текст «Да» или «Нет». Чтобы превратить текст в визуальный флажок, необходимо правильно настроить колонку табличного поля. Для перехода на современные версии программ, где подобные интерфейсные задачи решаются проще, доступен подбор решений для перехода из УПП в новые конфигурации.

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


ЭлементСписок = ЭлементыФормы.ДокументСписок;
НовКолонка = ЭлементСписок.Колонки.Вставить(1);
НовКолонка.Имя = "Проверен";
// ВАЖНО: используем ДанныеФлажка вместо Данные
НовКолонка.ДанныеФлажка = "ФЛ_Проверен";
НовКолонка.ТекстШапки = "Проверен";
// Чтобы флажок можно было изменять прямо в списке
НовКолонка.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;

После такой настройки в колонке появится стандартный интерфейсный флажок. Если же вам нужно убрать текст рядом с флажком, можно дополнительно установить свойство Данные в пустую строку или использовать обработчик ПриВыводеСтроки для тонкой настройки оформления через ОформлениеСтроки.Ячейки.Проверен.ОтображатьТекст = Ложь.

Работа с привязками (Anchors)

Программное добавление элементов — это только половина задачи. Чтобы при изменении размеров формы элементы не накладывались друг на друга, необходимо настроить привязки. В обычных формах это делается через метод УстановитьПривязку().

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


// Привязываем правую границу элемента к правой границе формы
ЭлементыФормы.НадписьПроверен.УстановитьПривязку(ГраницаЭлемента.Правая, ЭтаФорма.Панель, ГраницаЭлемента.Правая);
// Привязываем левую границу, чтобы элемент перемещался вместе с краем формы
ЭлементыФормы.НадписьПроверен.УстановитьПривязку(ГраницаЭлемента.Лево, ЭтаФорма.Панель, ГраницаЭлемента.Правая);

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

← На главную