Разработка и Конфигурация · 12 мин
ДанныеФормыКоллекция в 1С: как получить список колонок
Как получить колонки объекта ДанныеФормыКоллекция в 1С: обход через реквизиты формы, ПолучитьРеквизиты, выгрузка в таблицу значений и типичные ошибки разработчиков.
Объект ДанныеФормыКоллекция — это программное представление табличной части или таблицы значений, размещённой в реквизитах управляемой формы. В отличие от обычной таблицы значений, у него нет свойства Колонки, поэтому прямой вызов МояТаблица.Колонки вызовет ошибку. Получить перечень колонок можно несколькими обходными путями: через реквизиты формы, через выгрузку в таблицу значений или через анализ первой строки коллекции.
Выбор способа зависит от задачи. Если нужно динамически построить обход всех колонок в универсальной процедуре, подойдёт метод ПолучитьРеквизиты() формы. Если требуется полноценная работа с колонками (типы, заголовки, ширина), проще выгрузить данные в таблицу значений и работать с её коллекцией колонок. Ниже разобраны оба подхода с готовым кодом и ограничениями каждого.
Что такое ДанныеФормыКоллекция и почему у неё нет свойства «Колонки»
Когда в управляемой форме создаётся реквизит типа «ТаблицаЗначений» или отображается табличная часть объекта, на сервере данные хранятся в специальном объекте — ДанныеФормыКоллекция. Это не самостоятельная таблица, а обёртка, оптимизированная для передачи между клиентом и сервером и для отображения в элементе формы «Таблица».
Платформа сознательно не предоставляет у этого объекта коллекцию колонок: структура описывается не данными, а деревом реквизитов формы. Поэтому попытка обратиться к Колонки приводит к ошибке «Поле объекта не обнаружено». Это не дефект кода, а особенность архитектуры управляемых форм.
Понимание этого момента важно: все способы получения колонок сводятся к трём вариантам — чтение структуры реквизитов формы, преобразование в таблицу значений или косвенный анализ через строки коллекции. Каждый вариант имеет свою цену по производительности и свои ограничения.
Способ 1. Получить колонки через ПолучитьРеквизиты()
Самый «правильный» с точки зрения платформы способ — запросить у формы описание подчинённых реквизитов. Метод ПолучитьРеквизиты(Путь) возвращает массив объектов РеквизитФормы, каждый из которых соответствует одной колонке.
&НаСервере
Функция ПолучитьИменаКолонок(ИмяРеквизитаТаблицы)
МассивКолонок = Новый Массив;
Реквизиты = ЭтаФорма.ПолучитьРеквизиты(ИмяРеквизитаТаблицы);
Для Каждого Реквизит Из Реквизиты Цикл
МассивКолонок.Добавить(Реквизит.Имя);
КонецЦикла;
Возврат МассивКолонок;
КонецФункции
У объекта РеквизитФормы доступны свойства Имя, Путь, Заголовок, ТипЗначения. Этого достаточно, чтобы построить универсальный обход колонок, сформировать структуру для поиска или динамически создать одноимённую таблицу значений.
Важно: метод вызывается у объекта формы (ЭтаФорма), а не у самой коллекции. Параметр — путь к реквизиту-владельцу, например "Объект.Товары" для табличной части документа или "ТаблицаНаФорме" для самостоятельного реквизита. Если передать пустую строку, вернутся реквизиты верхнего уровня формы.
- 1Определите путь к реквизиту таблицы: имя реквизита формы или «Объект.ИмяТабличнойЧасти»
- 2Вызовите ЭтаФорма.ПолучитьРеквизиты(Путь) и сохраните массив
- 3Обойдите массив циклом и прочитайте свойства Имя, Заголовок, ТипЗначения каждого реквизита
- 4Проверьте результат: выведите имена в сообщение или журнал для контроля
Способ 2. Выгрузка в таблицу значений и работа с ТЗ.Колонки
Если нужна полноценная коллекция колонок с типами, шириной и возможностью добавлять или удалять колонки, удобнее преобразовать реквизит формы в обычную таблицу значений. Для этого служит метод формы РеквизитФормыВЗначение().
&НаСервере
Процедура ПоказатьКолонки()
ТЗ = РеквизитФормыВЗначение("ТаблицаНаФорме");
Для Каждого Колонка Из ТЗ.Колонки Цикл
Сообщить(Колонка.Имя + " — " + Колонка.ТипЗначения);
КонецЦикла;
КонецПроцедуры
У объекта КолонкаТаблицыЗначений доступны Имя, ТипЗначения, Заголовок, Ширина. Полученную таблицу можно сериализовать, передать в другую процедуру или использовать метод ТЗ.ВыгрузитьКолонку("Имя") для получения массива значений конкретной колонки.
Обратная загрузка выполняется методом ЗначениеВРеквизитФормы(ТЗ, "ТаблицаНаФорме"). Это типовой приём, когда структуру или данные нужно изменить массово: выгрузили, обработали привычными методами таблицы значений, загрузили обратно.
Способ 3. Выгрузка через метод Выгрузить() самой коллекции
У ДанныеФормыКоллекция есть собственный метод Выгрузить(), который возвращает таблицу значений без обращения к механизму реквизитов формы. Синтаксис похож на аналогичный метод табличной части.
&НаСервере
Процедура ПоказатьКолонкиЧерезВыгрузку()
ТЗ = ЭтаФорма.ТаблицаНаФорме.Выгрузить();
Для Каждого Колонка Из ТЗ.Колонки Цикл
Сообщить(Колонка.Имя);
КонецЦикла;
КонецПроцедуры
Метод поддерживает параметры: можно передать массив строк для выгрузки и строку с перечнем колонок, например Таблица.Выгрузить(, "Номенклатура, Количество"). Если нужна структура без данных, передайте пустой массив строк — получите таблицу с колонками, но без строк, что дешевле полной выгрузки.
Этот способ особенно удобен для табличных частей объектов, когда реквизит формы называется Объект и прямой вызов РеквизитФормыВЗначение вернул бы весь объект целиком.
Способ 4. Определить колонки по первой строке коллекции
Строка ДанныеФормыКоллекция — это объект ДанныеФормыЭлементКоллекции, к полям которого можно обращаться по имени. Формального списка полей у строки тоже нет, но в толстом клиенте и при отладке структуру можно проанализировать, а в коде — обойти через выгрузку одной строки.
&НаСервере
Функция КолонкиПоПервойСтроке()
Если ЭтаФорма.ТаблицаНаФорме.Количество() = 0 Тогда
Возврат Новый Массив;
КонецЕсли;
Строки = Новый Массив;
Строки.Добавить(ЭтаФорма.ТаблицаНаФорме[0]);
ТЗ = ЭтаФорма.ТаблицаНаФорме.Выгрузить(Строки);
Возврат ТЗ.Колонки;
КонецФункции
Приём рабочий, но имеет очевидное ограничение: при пустой коллекции структуру так не получить. Поэтому для универсальных механизмов он уступает ПолучитьРеквизиты(), который возвращает состав колонок независимо от наличия данных.
Сравнение способов и рекомендации по выбору
| Способ | Что возвращает | Работает при пустой таблице | Когда применять |
|---|---|---|---|
| ПолучитьРеквизиты() | Массив РеквизитФормы | Да | Универсальные обходчики, динамическое построение структуры |
| РеквизитФормыВЗначение() | ТаблицаЗначений с Колонки | Да | Нужна полная работа с колонками и данными |
| Выгрузить() | ТаблицаЗначений с Колонки | Да (пустая ТЗ) | Табличные части, выборочная выгрузка колонок |
| Анализ первой строки | Колонки через выгрузку строки | Нет | Быстрые разовые проверки при наличии данных |
Для большинства задач оптимален первый способ: он не копирует данные, работает на клиенте в контексте формы (через ЭтаФорма в серверных вызовах) и даёт доступ к типам колонок. Выгрузку в таблицу значений оставьте для случаев, когда нужно реально манипулировать данными или структурой.
Как выбрать действие
Типичные ошибки и ограничения
Самая частая ошибка — прямое обращение ТаблицаФормы.Колонки, скопированное из кода для обычной таблицы значений. Вторая по частоте — попытка вызвать ПолучитьРеквизиты() у самой коллекции вместо объекта формы. Обе ошибки диагностируются сразу, но в тонком клиенте сообщение об ошибке может быть менее информативным.
Ещё одна ловушка — путь к реквизиту. Для табличной части документа путь "Товары" не сработает, если данные лежат в реквизите Объект: правильный путь — "Объект.Товары". При вложенных структурах (например, дерево значений) уточняйте путь по дереву реквизитов в редакторе формы.
Также помните о контексте: РеквизитФормыВЗначение доступен только на сервере, а ПолучитьРеквизиты работает и в клиентском контексте формы, но всё равно требует объекта формы. Во внешних обработках без формы эти методы недоступны — там работайте напрямую с таблицами значений.
Проверка результата
После получения списка колонок убедитесь, что состав совпадает с ожиданиями: количество совпадает с числом колонок в редакторе формы, типы соответствуют заявленным (например, колонка «Количество» имеет числовой тип). Для отладки достаточно вывести имена через Сообщить() или в журнал регистрации.
Если часть колонок «пропала», проверьте, не добавлены ли они программно в другом месте кода после вашего вызова, и не смотрите ли вы на другой реквизит формы. Динамически добавленные колонки видны через ПолучитьРеквизиты() только после выполнения ИзменитьРеквизиты().
Как проверить результат
Совпадает с числом колонок реквизита в редакторе формы
Меньше — проверьте путь к реквизиту и динамическое добавление колонок
ТипЗначения соответствует ожидаемому (число, строка, ссылка)
Тип неопределён или пустой — колонка создана без типизации
ПолучитьРеквизиты возвращает полный список
Код падает на пустой коллекции — используется анализ первой строки
FAQ
Можно ли получить колонки ДанныеФормыКоллекции на клиенте без вызова сервера?
Частично. Метод ПолучитьРеквизиты() доступен в клиентском контексте формы, поэтому имена и пути колонок получить можно. А вот РеквизитФормыВЗначение и Выгрузить требуют серверного контекста — для них нужен серверный вызов.
Как получить не только имена, но и типы колонок?
Через ПолучитьРеквизиты() у каждого элемента массива есть свойство ТипЗначения. Либо выгрузите коллекцию в таблицу значений и читайте ТипЗначения у объектов КолонкаТаблицыЗначений — там же доступны заголовок и ширина.
Почему ПолучитьРеквизиты("Товары") возвращает пустой массив?
Скорее всего, неверный путь. Если табличная часть принадлежит реквизиту «Объект» (типовая форма документа), правильный путь — «Объект.Товары». Проверить структуру можно, вызвав ПолучитьРеквизиты() без параметра и просмотрев реквизиты верхнего уровня.
Как получить колонки динамически созданной таблицы на форме?
Так же — через ПолучитьРеквизиты(), но только после того, как выполнен метод ИзменитьРеквизиты(), добавивший таблицу и её колонки. До этого момента структура в дереве реквизитов отсутствует.
Чем отличается Выгрузить() у ДанныеФормыКоллекции от РеквизитФормыВЗначение?
Выгрузить() — метод самой коллекции, он позволяет выгрузить выборочные строки и колонки и работает с конкретной таблицей. РеквизитФормыВЗначение — метод формы, преобразующий реквизит целиком; для реквизита «Объект» он вернёт весь объект со всеми табличными частями.
Можно ли получить колонки таблицы формы вне контекста формы, например в общем модуле?
Нет, ДанныеФормыКоллекция существует только внутри формы. Решение — передать в общий модуль выгруженную таблицу значений (результат Выгрузить()) и работать с её коллекцией Колонки уже без привязки к форме.
Что важно запомнить
У ДанныеФормыКоллекция нет свойства «Колонки». Состав колонок получают через ЭтаФорма.ПолучитьРеквизиты(Путь) — быстро и без копирования данных, либо выгрузкой в таблицу значений (Выгрузить или РеквизитФормыВЗначение) — когда нужна полноценная работа со структурой и данными. Следите за правильным путём к реквизиту и помните о серверном контексте методов преобразования.