Как программно добавить табличное поле и командную панель на обычную форму?

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

При разработке на платформе 1С:Предприятие 8 в режиме обычных форм программисты часто сталкиваются с необходимостью динамического изменения интерфейса. В отличие от управляемых форм, где мы работаем с реквизитами и схемой компоновки, обычные формы требуют прямого манипулирования объектами метаданных формы. Рассмотрим подробнее, как правильно добавить ТабличноеПоле, связать его с данными и заставить КоманднаяПанель корректно работать с этим полем.

Проблема программного создания элементов на обычных формах

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

Основное ограничение обычных форм заключается в том, что в них невозможно программно создать реквизит формы. Мы можем создать элемент управления (визуальный объект), но не можем добавить новую переменную в структуру ЭтотОбъект или ЭтаФорма, к которой этот элемент мог бы быть привязан через свойство Данные. Именно поэтому попытка присвоить НовыйЭлементФормы.Данные = "ТП_Рег" приводит к ошибке «Данный элемент управления не поддерживает связь с данными».

Пошаговое создание табличного поля

Проанализируем правильный алгоритм действий. Поскольку мы не можем создать реквизит, мы должны использовать свойство Значение самого элемента управления или работать напрямую с объектами метаданных (например, списками регистров).

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


// 1. Находим родительский элемент (например, Панель)
ИмяПанели = "Панель1";
тПанель = ЭлементыФормы.Найти(ИмяПанели);

// Если на панели несколько страниц, выберем нужную
тПанель.ТекущаяСтраница = тПанель.Страницы[1];

// 2. Добавляем само Табличное Поле
// Четвертый параметр - родительский элемент (панель)
НовыйЭлементФормыПТ = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), "ТП_Рег", Истина, тПанель);

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

// 4. Настраиваем внешний вид
НовыйЭлементФормыПТ.Лево    = 6;
НовыйЭлементФормыПТ.Верх    = 50;
НовыйЭлементФормыПТ.Высота  = 300;
НовыйЭлементФормыПТ.Ширина  = 500;

// 5. Генерируем колонки на основе типа значения
НовыйЭлементФормыПТ.СоздатьКолонки();

Связывание Командной панели с Табличным полем

Теперь рассмотрим, как оживить КоманднаяПанель. Для этого используется свойство ИсточникДействий. Важно понимать, что в обычных формах командная панель может автоматически заполняться кнопками (такими как «Добавить», «Изменить», «Удалить»), если она понимает, каким элементом она управляет.


// Добавляем командную панель
НовыйЭлементФормыКП = ЭлементыФормы.Добавить(Тип("КоманднаяПанель"), "КП_Рег", Истина, тПанель);

НовыйЭлементФормыКП.Лево   = 6;
НовыйЭлементФормыКП.Верх   = 10;
НовыйЭлементФормыКП.Высота = 24; // Стандартная высота панели
НовыйЭлементФормыКП.Ширина = 500;

// Ключевой момент: привязка к табличному полю
НовыйЭлементФормыКП.ИсточникДействий = НовыйЭлементФормыПТ;
НовыйЭлементФормыКП.АвтоЗаполнение   = Истина;

Важный нюанс: Чтобы АвтоЗаполнение сработало корректно, ИсточникДействий должен быть назначен после того, как у табличного поля определен ТипЗначения. Если назначить источник действий пустому полю, кнопки могут не появиться, так как система не определит доступный состав команд.

Оживление элементов: Обработка событий

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

  1. В модуле формы должна существовать процедура с соответствующей сигнатурой (набором параметров).
  2. Процедура должна быть доступна (желательно не использовать Приватная).
  3. Мы связываем событие элемента с этой процедурой через объект Действие.

// Создаем связь с процедурой в модуле формы
ДействиеПриВыборе = Новый Действие("ТП_РегПриВыборе");
НовыйЭлементФормыПТ.УстановитьДействие("Выбор", ДействиеПриВыборе);

// В модуле формы должна быть процедура:
// Процедура ТП_РегПриВыборе(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
//     Сообщить("Выбрана строка: " + ВыбраннаяСтрока);
// КонецПроцедуры

Настройка автоматического изменения размера (Привязки)

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

Мы должны «привязать» границы нашего табличного поля к границам родительского контейнера (панели или самой формы):


// Привязываем правую границу ТП к правой границе панели
НовыйЭлементФормыПТ.УстановитьПривязку(ГраницаЭлементаУправления.Правая, тПанель, ГраницаЭлементаУправления.Правая);
// Привязываем нижнюю границу ТП к нижней границе панели
НовыйЭлементФормыПТ.УстановитьПривязку(ГраницаЭлементаУправления.Низ, тПанель, ГраницаЭлементаУправления.Низ);

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

Альтернативный метод: Использование скрытых элементов

Посмотрим на ситуацию с другой стороны. Если программное создание кажется избыточно сложным из-за невозможности добавить реквизиты, часто применяют «хитрость»: создают табличное поле в конфигураторе заранее, настраивают все привязки и типы данных, но устанавливают свойство Видимость = Ложь. В коде же просто меняют владельца (родителя) этого элемента и делают его видимым:


Элемент = ЭлементыФормы.СкрытоеТабличноеПоле;
Элемент.Родитель = тПанель; // Переносим на динамическую панель
Элемент.Видимость = Истина;

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

Работа с произвольными данными (Таблица значений)

Если ваша задача — вывести не список регистра, а произвольную таблицу, рассчитанную в коде, используйте свойство Значение. Рассмотрим пример с ТаблицаЗначений:


// Создаем таблицу значений
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Количество");

// Назначаем таблицу значению поля
НовыйЭлементФормыПТ.Значение = ТЗ;
НовыйЭлементФормыПТ.СоздатьКолонки();

Важно: При работе с ТаблицаЗначений командная панель будет иметь ограниченный набор стандартных команд по сравнению с РегистрСведенийСписок. В этом случае кнопки «Добавить» или «Удалить» могут потребовать ручного описания действий через Кнопки.Добавить() и УстановитьДействие.

Итоги

Подведем итог нашего анализа. Для успешного программного добавления табличного поля на обычную форму необходимо:

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

← На главную