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