К статье
Практический материал

Разработка и Конфигурация · 12 мин

ДанныеФормыКоллекция в 1С: как получить список колонок

Как получить колонки объекта ДанныеФормыКоллекция в 1С: обход через реквизиты формы, ПолучитьРеквизиты, выгрузка в таблицу значений и типичные ошибки разработчиков.

Объект ДанныеФормыКоллекция — это программное представление табличной части или таблицы значений, размещённой в реквизитах управляемой формы. В отличие от обычной таблицы значений, у него нет свойства Колонки, поэтому прямой вызов МояТаблица.Колонки вызовет ошибку. Получить перечень колонок можно несколькими обходными путями: через реквизиты формы, через выгрузку в таблицу значений или через анализ первой строки коллекции.

Выбор способа зависит от задачи. Если нужно динамически построить обход всех колонок в универсальной процедуре, подойдёт метод ПолучитьРеквизиты() формы. Если требуется полноценная работа с колонками (типы, заголовки, ширина), проще выгрузить данные в таблицу значений и работать с её коллекцией колонок. Ниже разобраны оба подхода с готовым кодом и ограничениями каждого.

Что такое ДанныеФормыКоллекция и почему у неё нет свойства «Колонки»

Когда в управляемой форме создаётся реквизит типа «ТаблицаЗначений» или отображается табличная часть объекта, на сервере данные хранятся в специальном объекте — ДанныеФормыКоллекция. Это не самостоятельная таблица, а обёртка, оптимизированная для передачи между клиентом и сервером и для отображения в элементе формы «Таблица».

Платформа сознательно не предоставляет у этого объекта коллекцию колонок: структура описывается не данными, а деревом реквизитов формы. Поэтому попытка обратиться к Колонки приводит к ошибке «Поле объекта не обнаружено». Это не дефект кода, а особенность архитектуры управляемых форм.

Понимание этого момента важно: все способы получения колонок сводятся к трём вариантам — чтение структуры реквизитов формы, преобразование в таблицу значений или косвенный анализ через строки коллекции. Каждый вариант имеет свою цену по производительности и свои ограничения.

Способ 1. Получить колонки через ПолучитьРеквизиты()

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

&НаСервере

Функция ПолучитьИменаКолонок(ИмяРеквизитаТаблицы)

МассивКолонок = Новый Массив;

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

Для Каждого Реквизит Из Реквизиты Цикл

МассивКолонок.Добавить(Реквизит.Имя);

КонецЦикла;

Возврат МассивКолонок;

КонецФункции

У объекта РеквизитФормы доступны свойства Имя, Путь, Заголовок, ТипЗначения. Этого достаточно, чтобы построить универсальный обход колонок, сформировать структуру для поиска или динамически создать одноимённую таблицу значений.

Важно: метод вызывается у объекта формы (ЭтаФорма), а не у самой коллекции. Параметр — путь к реквизиту-владельцу, например "Объект.Товары" для табличной части документа или "ТаблицаНаФорме" для самостоятельного реквизита. Если передать пустую строку, вернутся реквизиты верхнего уровня формы.

Порядок действий
  1. 1
    Определите путь к реквизиту таблицы: имя реквизита формы или «Объект.ИмяТабличнойЧасти»
  2. 2
    Вызовите ЭтаФорма.ПолучитьРеквизиты(Путь) и сохраните массив
  3. 3
    Обойдите массив циклом и прочитайте свойства Имя, Заголовок, ТипЗначения каждого реквизита
  4. 4
    Проверьте результат: выведите имена в сообщение или журнал для контроля

Способ 2. Выгрузка в таблицу значений и работа с ТЗ.Колонки

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

&НаСервере

Процедура ПоказатьКолонки()

ТЗ = РеквизитФормыВЗначение("ТаблицаНаФорме");

Для Каждого Колонка Из ТЗ.Колонки Цикл

Сообщить(Колонка.Имя + " — " + Колонка.ТипЗначения);

КонецЦикла;

КонецПроцедуры

У объекта КолонкаТаблицыЗначений доступны Имя, ТипЗначения, Заголовок, Ширина. Полученную таблицу можно сериализовать, передать в другую процедуру или использовать метод ТЗ.ВыгрузитьКолонку("Имя") для получения массива значений конкретной колонки.

Обратная загрузка выполняется методом ЗначениеВРеквизитФормы(ТЗ, "ТаблицаНаФорме"). Это типовой приём, когда структуру или данные нужно изменить массово: выгрузили, обработали привычными методами таблицы значений, загрузили обратно.

Способ 3. Выгрузка через метод Выгрузить() самой коллекции

У ДанныеФормыКоллекция есть собственный метод Выгрузить(), который возвращает таблицу значений без обращения к механизму реквизитов формы. Синтаксис похож на аналогичный метод табличной части.

&НаСервере

Процедура ПоказатьКолонкиЧерезВыгрузку()

ТЗ = ЭтаФорма.ТаблицаНаФорме.Выгрузить();

Для Каждого Колонка Из ТЗ.Колонки Цикл

Сообщить(Колонка.Имя);

КонецЦикла;

КонецПроцедуры

Метод поддерживает параметры: можно передать массив строк для выгрузки и строку с перечнем колонок, например Таблица.Выгрузить(, "Номенклатура, Количество"). Если нужна структура без данных, передайте пустой массив строк — получите таблицу с колонками, но без строк, что дешевле полной выгрузки.

Этот способ особенно удобен для табличных частей объектов, когда реквизит формы называется Объект и прямой вызов РеквизитФормыВЗначение вернул бы весь объект целиком.

Способ 4. Определить колонки по первой строке коллекции

Строка ДанныеФормыКоллекция — это объект ДанныеФормыЭлементКоллекции, к полям которого можно обращаться по имени. Формального списка полей у строки тоже нет, но в толстом клиенте и при отладке структуру можно проанализировать, а в коде — обойти через выгрузку одной строки.

&НаСервере

Функция КолонкиПоПервойСтроке()

Если ЭтаФорма.ТаблицаНаФорме.Количество() = 0 Тогда

Возврат Новый Массив;

КонецЕсли;

Строки = Новый Массив;

Строки.Добавить(ЭтаФорма.ТаблицаНаФорме[0]);

ТЗ = ЭтаФорма.ТаблицаНаФорме.Выгрузить(Строки);

Возврат ТЗ.Колонки;

КонецФункции

Приём рабочий, но имеет очевидное ограничение: при пустой коллекции структуру так не получить. Поэтому для универсальных механизмов он уступает ПолучитьРеквизиты(), который возвращает состав колонок независимо от наличия данных.

Сравнение способов и рекомендации по выбору

СпособЧто возвращаетРаботает при пустой таблицеКогда применять
ПолучитьРеквизиты()Массив РеквизитФормыДаУниверсальные обходчики, динамическое построение структуры
РеквизитФормыВЗначение()ТаблицаЗначений с КолонкиДаНужна полная работа с колонками и данными
Выгрузить()ТаблицаЗначений с КолонкиДа (пустая ТЗ)Табличные части, выборочная выгрузка колонок
Анализ первой строкиКолонки через выгрузку строкиНетБыстрые разовые проверки при наличии данных

Для большинства задач оптимален первый способ: он не копирует данные, работает на клиенте в контексте формы (через ЭтаФорма в серверных вызовах) и даёт доступ к типам колонок. Выгрузку в таблицу значений оставьте для случаев, когда нужно реально манипулировать данными или структурой.

Маршрут решения

Как выбрать действие

Нужны только имена и типы колонок без данныхИспользуйте ЭтаФорма.ПолучитьРеквизиты(Путь)
Нужно изменить структуру или массово обработать данныеВыгрузите в таблицу значений и загрузите обратно
Работаете с табличной частью объектаИспользуйте Объект.ТабличнаяЧасть.Выгрузить() или путь «Объект.ИмяТЧ» в ПолучитьРеквизиты
Таблица может быть пустойНе полагайтесь на анализ первой строки — берите структуру из реквизитов формы

Типичные ошибки и ограничения

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

Ещё одна ловушка — путь к реквизиту. Для табличной части документа путь "Товары" не сработает, если данные лежат в реквизите Объект: правильный путь — "Объект.Товары". При вложенных структурах (например, дерево значений) уточняйте путь по дереву реквизитов в редакторе формы.

Также помните о контексте: РеквизитФормыВЗначение доступен только на сервере, а ПолучитьРеквизиты работает и в клиентском контексте формы, но всё равно требует объекта формы. Во внешних обработках без формы эти методы недоступны — там работайте напрямую с таблицами значений.

Типичные ошибки
01
Обращение к свойству Колонки у ДанныеФормыКоллекция — ошибка «Поле объекта не обнаружено», используйте ПолучитьРеквизиты или выгрузку
02
Вызов ПолучитьРеквизиты у коллекции вместо формы — метод принадлежит объекту УправляемаяФорма
03
Неверный путь к реквизиту («Товары» вместо «Объект.Товары») — пустой результат или ошибка
04
Выгрузка большой таблицы ради одних имён колонок — лишний расход памяти и времени сервера

Проверка результата

После получения списка колонок убедитесь, что состав совпадает с ожиданиями: количество совпадает с числом колонок в редакторе формы, типы соответствуют заявленным (например, колонка «Количество» имеет числовой тип). Для отладки достаточно вывести имена через Сообщить() или в журнал регистрации.

Если часть колонок «пропала», проверьте, не добавлены ли они программно в другом месте кода после вашего вызова, и не смотрите ли вы на другой реквизит формы. Динамически добавленные колонки видны через ПолучитьРеквизиты() только после выполнения ИзменитьРеквизиты().

Контрольные точки

Как проверить результат

Число полученных колонок
Норма

Совпадает с числом колонок реквизита в редакторе формы

Тревожный признак

Меньше — проверьте путь к реквизиту и динамическое добавление колонок

Типы колонок
Норма

ТипЗначения соответствует ожидаемому (число, строка, ссылка)

Тревожный признак

Тип неопределён или пустой — колонка создана без типизации

Работа при пустой таблице
Норма

ПолучитьРеквизиты возвращает полный список

Тревожный признак

Код падает на пустой коллекции — используется анализ первой строки

FAQ

Можно ли получить колонки ДанныеФормыКоллекции на клиенте без вызова сервера?

Частично. Метод ПолучитьРеквизиты() доступен в клиентском контексте формы, поэтому имена и пути колонок получить можно. А вот РеквизитФормыВЗначение и Выгрузить требуют серверного контекста — для них нужен серверный вызов.

Как получить не только имена, но и типы колонок?

Через ПолучитьРеквизиты() у каждого элемента массива есть свойство ТипЗначения. Либо выгрузите коллекцию в таблицу значений и читайте ТипЗначения у объектов КолонкаТаблицыЗначений — там же доступны заголовок и ширина.

Почему ПолучитьРеквизиты("Товары") возвращает пустой массив?

Скорее всего, неверный путь. Если табличная часть принадлежит реквизиту «Объект» (типовая форма документа), правильный путь — «Объект.Товары». Проверить структуру можно, вызвав ПолучитьРеквизиты() без параметра и просмотрев реквизиты верхнего уровня.

Как получить колонки динамически созданной таблицы на форме?

Так же — через ПолучитьРеквизиты(), но только после того, как выполнен метод ИзменитьРеквизиты(), добавивший таблицу и её колонки. До этого момента структура в дереве реквизитов отсутствует.

Чем отличается Выгрузить() у ДанныеФормыКоллекции от РеквизитФормыВЗначение?

Выгрузить() — метод самой коллекции, он позволяет выгрузить выборочные строки и колонки и работает с конкретной таблицей. РеквизитФормыВЗначение — метод формы, преобразующий реквизит целиком; для реквизита «Объект» он вернёт весь объект со всеми табличными частями.

Можно ли получить колонки таблицы формы вне контекста формы, например в общем модуле?

Нет, ДанныеФормыКоллекция существует только внутри формы. Решение — передать в общий модуль выгруженную таблицу значений (результат Выгрузить()) и работать с её коллекцией Колонки уже без привязки к форме.

Итог

Что важно запомнить

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