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