Как получить заголовки колонок таблицы ДанныеФормыКоллекция

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

В процессе разработки на платформе 1С:Предприятие 8.3 (Управляемые формы) программисты часто сталкиваются с необходимостью программно обработать данные, хранящиеся в реквизитах формы типа ДанныеФормыКоллекция. Одна из типовых задач — получение «человеческих» заголовков колонок, например, для формирования печатной формы, выгрузки в Excel или построения динамических диалогов. Однако стандартные методы преобразования данных часто приводят к потере этой информации.

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

Почему обычные методы не работают?

Разберем типичную ситуацию: у нас есть реквизит формы ТаблицаМатериалы. Мы пытаемся преобразовать её в обычную таблицу значений, чтобы получить структуру колонок. Для этого часто используется код:


Таблица = ДанныеФормыВЗначение(ТаблицаМатериалы, Тип("ТаблицаЗначений"));
Для Каждого Колонка Из Таблица.Колонки Цикл
    Сообщить(Колонка.Имя); // Имя мы получим, но где заголовок?
КонецЦикла;

Проблема заключается в архитектуре платформы. Объект КолонкаТаблицыЗначений имеет свойство Имя, но у него отсутствует свойство Заголовок. Когда мы выполняем преобразование через ДанныеФормыВЗначение, система переносит структуру данных и типы, но визуальные свойства (синонимы, заголовки, ширину колонок), заданные в редакторе формы, она игнорирует, так как в объекте ТаблицаЗначений для них просто нет места.

Проанализируем основные способы, которые позволяют обойти это ограничение.

Способ 1: Использование метода ПолучитьРеквизиты()

Это наиболее правильный и надежный способ получения метаданных реквизитов формы «на лету», не привязываясь к тому, выведена ли таблица на экран пользователя или нет. Метод ПолучитьРеквизиты() возвращает массив объектов типа РеквизитФормы, которые содержат полную информацию о колонках таблицы.

Рассмотрим по шагам, как реализовать этот алгоритм:

  1. Вызываем метод ПолучитьРеквизиты(), передавая в качестве параметра путь к нашей таблице.
  2. Обходим полученный массив циклом.
  3. Извлекаем свойства Имя и Заголовок.

Пример программного кода:


// Указываем имя реквизита таблицы на форме
ИмяТаблицы = "ТаблицаМатериалы"; 

// Получаем массив описаний колонок
РеквизитыТаблицы = ЭтаФорма.ПолучитьРеквизиты(ИмяТаблицы);

Для каждого Реквизит Из РеквизитыТаблицы Цикл
    // Свойство Имя — это технический идентификатор (например, "Номенклатура")
    // Свойство Заголовок — это то, что видит пользователь (например, "Товарно-материальные ценности")
    
    Если ЗначениеЗаполнено(Реквизит.Заголовок) Тогда
        Сообщить("Колонка: " + Реквизит.Имя + " (Заголовок: " + Реквизит.Заголовок + ")");
    Иначе
        // Если заголовок не задан явно, платформа обычно отображает Имя
        Сообщить("Колонка: " + Реквизит.Имя + " (Заголовок не задан)");
    КонецЕсли;
КонецЦикла;

Важный нюанс: Если в редакторе формы в дереве реквизитов поле «Заголовок» у конкретной колонки оставлено пустым, метод вернет пустую строку. В этом случае 1С в интерфейсе будет отображать либо имя колонки, либо синоним из метаданных объекта, на котором основана таблица. Если вам нужен именно тот текст, который видит пользователь, может потребоваться дополнительная проверка.

Способ 2: Обращение к элементам формы (UI)

Если ваша таблица размещена на форме и визуализирована, заголовки можно вытащить напрямую из элементов управления. Этот способ удобен, когда заголовки колонок могут меняться программно в процессе работы формы (например, через свойство Элементы.ИмяКолонки.Заголовок).

Выясним, как это реализовать:


// Предположим, имя элемента таблицы на форме — "ТаблицаМатериалы"
КолонкиЭлемента = Элементы.ТаблицаМатериалы.ПодчиненныеЭлементы;

Для Каждого Элемент Из КолонкиЭлемента Цикл
    // Проверяем, что это именно колонка (ПолеФормы), а не группа колонок
    Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда
        ТекстЗаголовка = Элемент.Заголовок;
        
        // Если заголовок элемента пустой, 1С берет заголовок из реквизита
        Если ПустаяСтрока(ТекстЗаголовка) Тогда
            ТекстЗаголовка = Элемент.Имя; // Или логика получения из метаданных
        КонецЕсли;
        
        Сообщить("Элемент: " + Элемент.Имя + " -> Заголовок: " + ТекстЗаголовка);
    КонецЕсли;
КонецЦикла;

Преимущество: Вы получаете актуальный заголовок, который видит пользователь в данный момент, даже если он был изменен программно кодом Элементы.Колонка.Заголовок = "Новое имя".

Недостаток: Если реквизит ДанныеФормыКоллекция существует, но не выведен на форму в виде элемента, этот способ работать не будет.

Способ 3: Получение синонимов через метаданные объекта

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

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


СинонимКолонки = Метаданные.Документы.РеализацияТоваровУслуг.ТабличныеЧасти.Товары.Реквизиты.Количество.Синоним;
Сообщить(СинонимКолонки); // Вернет "Количество"

Этот метод является самым «глубоким», но требует знания того, к какому объекту привязана таблица. Если таблица создана вручную как произвольный реквизит формы, метаданные конфигурации о ней ничего не знают.

Сводная таблица методов

Для выбора оптимального решения воспользуемся следующей логикой:

  1. Если таблица — это реквизит формы (независимо от видимости): Используем ЭтаФорма.ПолучитьРеквизиты(). Это универсальный программный интерфейс.
  2. Если нужно именно то, что видит глаз пользователя на экране: Перебираем Элементы.ИмяТаблицы.ПодчиненныеЭлементы.
  3. Если нужно получить описание "по умолчанию" из конфигурации: Обращаемся к Метаданные объекта-владельца.

Практический совет по динамическим колонкам

Если вы создаете колонки программно с помощью метода ИзменитьРеквизиты(), обязательно заполняйте поле заголовка в объекте РеквизитФормы. Рассмотрим пример:


МассивДобавляемыхРеквизитов = Новый Массив;
// Правильное создание с указанием заголовка
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("СпецЦена", Новый ОписаниеТипов("Число"), "ТаблицаМатериалы", "Специальная цена"));

ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

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

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

← На главную