При разработке на платформе 1С:Предприятие 8 в режиме обычных форм программисты часто сталкиваются с необходимостью динамического изменения интерфейса. В отличие от управляемых форм, где мы работаем с реквизитами и схемой компоновки, обычные формы требуют прямого манипулирования объектами метаданных формы. Рассмотрим подробнее, как правильно добавить ТабличноеПоле, связать его с данными и заставить КоманднаяПанель корректно работать с этим полем.
Разберем типичную ситуацию: разработчик добавляет элемент типа ТабличноеПоле через коллекцию ЭлементыФормы, устанавливает его координаты и тип значения, а затем пытается создать КоманднаяПанель. Однако командная панель отказывается видеть табличное поле как источник действий, а свойство Данные вызывает ошибку. Выясним причину этого поведения.
Основное ограничение обычных форм заключается в том, что в них невозможно программно создать реквизит формы. Мы можем создать элемент управления (визуальный объект), но не можем добавить новую переменную в структуру ЭтотОбъект или ЭтаФорма, к которой этот элемент мог бы быть привязан через свойство Данные. Именно поэтому попытка присвоить НовыйЭлементФормы.Данные = "ТП_Рег" приводит к ошибке «Данный элемент управления не поддерживает связь с данными».
Проанализируем правильный алгоритм действий. Поскольку мы не можем создать реквизит, мы должны использовать свойство Значение самого элемента управления или работать напрямую с объектами метаданных (например, списками регистров).
Рассмотрим пример добавления табличного поля, которое будет отображать список записей регистра сведений, на уже существующую панель формы:
// 1. Находим родительский элемент (например, Панель)
ИмяПанели = "Панель1";
тПанель = ЭлементыФормы.Найти(ИмяПанели);
// Если на панели несколько страниц, выберем нужную
тПанель.ТекущаяСтраница = тПанель.Страницы[1];
// 2. Добавляем само Табличное Поле
// Четвертый параметр - родительский элемент (панель)
НовыйЭлементФормыПТ = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), "ТП_Рег", Истина, тПанель);
// 3. Устанавливаем тип значения.
// Для отображения регистра используем "РегистрСведенийСписок"
НовыйЭлементФормыПТ.ТипЗначения = Новый ОписаниеТипов("РегистрСведенийСписок.СостояниеВыпускаБанковскихКартБТБ");
// 4. Настраиваем внешний вид
НовыйЭлементФормыПТ.Лево = 6;
НовыйЭлементФормыПТ.Верх = 50;
НовыйЭлементФормыПТ.Высота = 300;
НовыйЭлементФормыПТ.Ширина = 500;
// 5. Генерируем колонки на основе типа значения
НовыйЭлементФормыПТ.СоздатьКолонки();
Теперь рассмотрим, как оживить КоманднаяПанель. Для этого используется свойство ИсточникДействий. Важно понимать, что в обычных формах командная панель может автоматически заполняться кнопками (такими как «Добавить», «Изменить», «Удалить»), если она понимает, каким элементом она управляет.
// Добавляем командную панель
НовыйЭлементФормыКП = ЭлементыФормы.Добавить(Тип("КоманднаяПанель"), "КП_Рег", Истина, тПанель);
НовыйЭлементФормыКП.Лево = 6;
НовыйЭлементФормыКП.Верх = 10;
НовыйЭлементФормыКП.Высота = 24; // Стандартная высота панели
НовыйЭлементФормыКП.Ширина = 500;
// Ключевой момент: привязка к табличному полю
НовыйЭлементФормыКП.ИсточникДействий = НовыйЭлементФормыПТ;
НовыйЭлементФормыКП.АвтоЗаполнение = Истина;
Важный нюанс: Чтобы АвтоЗаполнение сработало корректно, ИсточникДействий должен быть назначен после того, как у табличного поля определен ТипЗначения. Если назначить источник действий пустому полю, кнопки могут не появиться, так как система не определит доступный состав команд.
Программно созданные элементы по умолчанию не реагируют на действия пользователя. Чтобы заставить форму реагировать, например, на двойной клик по строке, нужно использовать метод УстановитьДействие. Разберем, как это сделать:
Приватная).Действие.
// Создаем связь с процедурой в модуле формы
ДействиеПриВыборе = Новый Действие("ТП_РегПриВыборе");
НовыйЭлементФормыПТ.УстановитьДействие("Выбор", ДействиеПриВыборе);
// В модуле формы должна быть процедура:
// Процедура ТП_РегПриВыборе(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
// Сообщить("Выбрана строка: " + ВыбраннаяСтрока);
// КонецПроцедуры
Если мы просто добавим элементы, при растягивании окна пользователем они останутся неподвижными в левом верхнем углу. Проанализируем, как настроить динамическое изменение размера с помощью метода УстановитьПривязку. Это критично для создания удобного интерфейса.
Мы должны «привязать» границы нашего табличного поля к границам родительского контейнера (панели или самой формы):
// Привязываем правую границу ТП к правой границе панели
НовыйЭлементФормыПТ.УстановитьПривязку(ГраницаЭлементаУправления.Правая, тПанель, ГраницаЭлементаУправления.Правая);
// Привязываем нижнюю границу ТП к нижней границе панели
НовыйЭлементФормыПТ.УстановитьПривязку(ГраницаЭлементаУправления.Низ, тПанель, ГраницаЭлементаУправления.Низ);
// Аналогично для командной панели (только правую границу)
НовыйЭлементФормыКП.УстановитьПривязку(ГраницаЭлементаУправления.Правая, тПанель, ГраницаЭлементаУправления.Правая);
Посмотрим на ситуацию с другой стороны. Если программное создание кажется избыточно сложным из-за невозможности добавить реквизиты, часто применяют «хитрость»:
создают табличное поле в конфигураторе заранее, настраивают все привязки и типы данных, но устанавливают свойство Видимость = Ложь. В коде же просто меняют владельца (родителя) этого элемента и делают его видимым:
Элемент = ЭлементыФормы.СкрытоеТабличноеПоле;
Элемент.Родитель = тПанель; // Переносим на динамическую панель
Элемент.Видимость = Истина;
Этот метод позволяет избежать проблем с отсутствием связи с данными, так как реквизит под это поле уже создан в конфигураторе.
Если ваша задача — вывести не список регистра, а произвольную таблицу, рассчитанную в коде, используйте свойство Значение. Рассмотрим пример с ТаблицаЗначений:
// Создаем таблицу значений
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Количество");
// Назначаем таблицу значению поля
НовыйЭлементФормыПТ.Значение = ТЗ;
НовыйЭлементФормыПТ.СоздатьКолонки();
Важно: При работе с ТаблицаЗначений командная панель будет иметь ограниченный набор стандартных команд по сравнению с РегистрСведенийСписок. В этом случае кнопки «Добавить» или «Удалить» могут потребовать ручного описания действий через Кнопки.Добавить() и УстановитьДействие.
Подведем итог нашего анализа. Для успешного программного добавления табличного поля на обычную форму необходимо:
ИсточникДействий для связи командной панели и таблицы.ТипЗначения или прямую инициализацию через Значение.УстановитьПривязку для корректного отображения при масштабировании формы.Действие для обработки событий пользователя.Соблюдение этих правил позволит создавать гибкие и динамичные интерфейсы даже в рамках ограничений старой платформы 1С.