При разработке на платформе 1С:Предприятие 8.3 (особенно на управляемых формах) программисты часто сталкиваются с задачей динамического построения интерфейса. Одна из классических проблем — ситуация, когда мы программно создаем таблицу, меняем заголовки её колонок в объекте ТаблицаЗначений, но на экране пользователя по-прежнему отображаются технические имена вроде "П1", "П2" или "Колонка1".
В этой статье мы подробно разберем, почему так происходит, и научимся правильно управлять визуальным представлением данных в динамических таблицах.
Проанализируем ситуацию: когда мы пишем код ТЗ.Колонки.Добавить("Товар"), мы создаем структуру в оперативной памяти сервера. Объект ТаблицаЗначений — это чисто программный контейнер для данных. У него действительно есть свойство Заголовок у каждой колонки, но оно предназначено в основном для построителя отчетов или автоматической генерации форм.
Однако на Управляемой форме визуализация работает иначе. То, что видит пользователь — это Элементы формы (тип ПолеФормы), которые связаны с данными через Реквизиты формы. Если мы программно создаем элемент формы вручную через Элементы.Добавить(), система ожидает, что мы так же вручную укажем все его визуальные свойства, включая заголовок.
Важный вывод: Изменение заголовка в объекте ТаблицаЗначений не влечет за собой автоматического обновления заголовка в уже созданном (или создаваемом вручную) элементе ПолеФормы.
Рассмотрим правильный алгоритм создания динамической таблицы на форме. Весь процесс можно разделить на три этапа: создание реквизитов, создание самой таблицы как элемента формы и создание колонок.
Сначала нам нужно добавить саму таблицу и её колонки в состав реквизитов формы. Обратите внимание, что уже на этом этапе мы можем заложить заголовок в метаданные реквизита.
// Создаем массив для новых реквизитов
МассивРеквизитов = Новый Массив;
// 1. Добавляем саму таблицу
МассивРеквизитов.Добавить(Новый РеквизитФормы("ДинамическаяТЗ", Новый ОписаниеТипов("ТаблицаЗначений")));
// 2. Добавляем колонки в массив
// Четвертый параметр конструктора РеквизитФормы — это и есть Заголовок
МассивРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), "ДинамическаяТЗ", "Наименование товара"));
МассивРеквизитов.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число"), "ДинамическаяТЗ", "Остаток на складе"));
// Фиксируем изменения на форме
ИзменитьРеквизиты(МассивРеквизитов);
Теперь добавим саму таблицу на форму. Выясним причину, по которой это делается отдельно: элемент ТаблицаФормы является лишь «рамкой», в которой будут отображаться наши данные.
ТаблицаНаФорме = Элементы.Добавить("ВизуальнаяТаблица", Тип("ТаблицаФормы"), ЭтаФорма);
ТаблицаНаФорме.ПутьКДанным = "ДинамическаяТЗ";
ТаблицаНаФорме.Отображение = ОтображениеТаблицы.Список;
А вот теперь самый ответственный момент. При переборе колонок нашей таблицы (или массива описаний), мы должны явно назначить свойство Заголовок каждому элементу формы. Посмотрим на примере цикла:
// Предположим, у нас есть программная ТЗ, из которой мы берем структуру
Для Каждого КолонкаТЗ Из ОбъектТЗ.Колонки Цикл
// Добавляем элемент формы типа ПолеФормы
НоваяКолонка = Элементы.Добавить("Колонка_" + КолонкаТЗ.Имя, Тип("ПолеФормы"), ТаблицаНаФорме);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
// Указываем путь к данным: ИмяТаблицы.ИмяКолонки
НоваяКолонка.ПутьКДанным = "ДинамическаяТЗ." + КолонкаТЗ.Имя;
// УСТАНАВЛИВАЕМ ЗАГОЛОВОК ЯВНО
// Если мы не сделаем это, пользователь увидит техническое имя
НоваяКолонка.Заголовок = КолонкаТЗ.Заголовок;
// Дополнительные настройки внешнего вида
НоваяКолонка.Ширина = 15;
КонецЦикла;
Проанализируем ситуацию, когда стандартного однострочного заголовка недостаточно. Платформа 1С позволяет сделать интерфейс более дружелюбным.
Символы.ПС. Однако помните: чтобы это сработало, у самой ТаблицыФормы свойство ВысотаШапки должно быть больше 1.Подсказка для колонки. При наведении на заголовок пользователь увидит расшифровку. Это отличный способ разгрузить интерфейс от длинных текстов.ГруппаФормы и видом ГруппаКолонок, а затем создавайте колонки, указывая эту группу в качестве родителя.Рассмотрим подробнее ошибки, которые часто допускают разработчики:
Ошибка №1: Попытка изменить заголовок через объект вместо элемента. Как мы уже выяснили, код ЭтаФорма.РеквизитТЗ.Колонки[0].Заголовок = "Новый" изменит только структуру данных в памяти, но не то, что видит пользователь на экране.
Ошибка №2: Забытое удаление старых элементов. Если ваша процедура вызывается повторно (например, при нажатии кнопки "Обновить структуру"), вы получите ошибку "Имя не уникально". Перед созданием новых колонок всегда проверяйте наличие старых и удаляйте их:
// Пример очистки старых колонок перед созданием новых
МассивДляУдаления = Новый Массив;
Для Каждого Элемент Из Элементы.ВизуальнаяТаблица.ПодчиненныеЭлементы Цикл
МассивДляУдаления.Добавить(Элемент);
КонецЦикла;
Для Каждого ЭлементДляУдаления Из МассивДляУдаления Цикл
Элементы.Удалить(ЭлементДляУдаления);
КонецЦикла;
Для того чтобы визуально изменить название колонки таблицы в 1С, необходимо работать именно с Элементами формы. Порядок действий всегда один: определили структуру данных -> создали реквизиты -> добавили визуальные элементы -> явно прописали свойство Заголовок для каждого ПоляФормы.
Следуя этим правилам, вы сможете создавать гибкие и понятные интерфейсы, которые будут подстраиваться под любые требования бизнеса.