Разработка и Конфигурация · 11 мин
Как в 1С из массива сделать таблицу значений
Как в 1С преобразовать массив в таблицу значений: создание колонок, заполнение строк, работа с массивом структур, типизация, ошибки и готовые примеры кода.
Массив в 1С — удобная структура для промежуточного хранения данных, но у него нет колонок, сортировки, поиска по значениям и возможности вывода в табличное поле формы. Когда данные нужно показать пользователю, передать в запрос или обработать построчно, массив преобразуют в таблицу значений. Готового метода «МассивВТаблицуЗначений» во встроенном языке нет, поэтому преобразование выполняется кодом: создаётся таблица, описываются колонки и в цикле переносятся элементы массива.
Способ заполнения зависит от того, что лежит в массиве: простые значения (строки, числа, ссылки), структуры с именованными полями или однотипные объекты. Ниже разобраны все три сценария с примерами кода, а также типизация колонок, проверка результата и типичные ошибки, из-за которых таблица получается пустой или с неправильными типами.
Создание пустой таблицы значений и описание колонок
Первый шаг — объявить таблицу и описать её структуру. Колонки добавляются методом Колонки.Добавить(), который принимает имя колонки, описание типа, заголовок и ширину. Минимальный вариант — только имя, но без типа колонка сможет хранить значения любого типа, что часто приводит к проблемам при сортировке и сравнении.
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТаблицаДанных.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ТаблицаДанных.Колонки.Добавить("Комментарий", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200)));
Описание типа стоит задавать всегда, когда тип данных известен заранее. Для ссылочных типов указывайте конкретный вид справочника или документа — это позволит использовать таблицу в запросах с соединениями и в параметрах виртуальных таблиц. Если колонка может содержать несколько типов, перечислите их через запятую: Новый ОписаниеТипов("СправочникСсылка.Номенклатура,СправочникСсылка.Контрагенты").
Перенос массива простых значений в одну колонку
Самый простой случай — массив содержит однотипные значения: строки, числа или ссылки. Тогда создаётся таблица с одной колонкой, и каждый элемент массива становится отдельной строкой.
МассивКонтрагентов = Новый Массив;
МассивКонтрагентов.Добавить(Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка"));
МассивКонтрагентов.Добавить(Справочники.Контрагенты.НайтиПоНаименованию("ИП Сидоров"));
ТаблицаКонтрагентов = Новый ТаблицаЗначений;
ТаблицаКонтрагентов.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
Для Каждого Элемент Из МассивКонтрагентов Цикл
НоваяСтрока = ТаблицаКонтрагентов.Добавить();
НоваяСтрока.Контрагент = Элемент;
КонецЦикла;
Метод Добавить() возвращает новую строку таблицы, и её поля заполняются сразу после создания. Если забыть вызвать Добавить() внутри цикла и присваивать значения одной и той же строке, в таблице окажется только последний элемент массива — типичная ошибка начинающих.
Преобразование массива структур в таблицу с несколькими колонками
На практике чаще встречается массив структур: каждый элемент описывает запись с несколькими полями. Такой массив превращается в полноценную таблицу, где ключи структуры становятся колонками.
МассивДанных = Новый Массив;
СтрокаДанных = Новый Структура("Товар, Цена, Количество");
СтрокаДанных.Товар = Справочники.Номенклатура.НайтиПоКоду("000001");
СтрокаДанных.Цена = 1500;
СтрокаДанных.Количество = 2;
МассивДанных.Добавить(СтрокаДанных);
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТаблицаДанных.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
ТаблицаДанных.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0)));
Для Каждого Элемент Из МассивДанных Цикл
НоваяСтрока = ТаблицаДанных.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Элемент);
КонецЦикла;
Метод ЗаполнитьЗначенияСвойств() переносит значения по совпадающим именам полей: ключ структуры должен совпадать с именем колонки. Если в структуре есть лишние ключи, которых нет среди колонок, будет вызвана ошибка — поэтому либо формируйте структуру строго под состав колонок, либо заполняйте поля поимённо через присвоение.
- 1Определите, что лежит в массиве: простые значения или структуры с полями
- 2Создайте объект Новый ТаблицаЗначений
- 3Добавьте колонки с именами и типами, соответствующими данным массива
- 4В цикле Для Каждого создавайте строку методом Добавить() и заполняйте её поля
- 5Проверьте результат: количество строк таблицы должно совпадать с количеством элементов массива
Альтернатива: загрузка массива в колонку через ЗагрузитьКолонку
Если массив уже сформирован и нужно поместить его в уже заполненную таблицу (или создать таблицу из одного массива без цикла), используется метод ЗагрузитьКолонку(). Он принимает массив значений и имя колонки — таблица при этом автоматически дополняется строками, если их меньше, чем элементов массива.
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));
ТаблицаДанных.ЗагрузитьКолонку(МассивНаименований, "Наименование");
Обратный метод — ВыгрузитьКолонку() — превращает колонку таблицы обратно в массив. Пара этих методов удобна для обмена данными между массивами и таблицами без явных циклов. Ограничение: ЗагрузитьКолонку() заполняет только одну колонку, поэтому для массива структур с несколькими полями цикл всё равно потребуется.
Сравнение вариантов
Универсальный способ: подходит для простых значений, структур и сложной логики заполнения. Требует больше кода, но даёт полный контроль.
Быстро и коротко, но только для одной колонки и однородного массива простых значений.
Оптимально для массива структур, если имена ключей совпадают с именами колонок. Лишние ключи вызовут ошибку.
Типизация колонок и работа с составными типами
Если тип колонки не указан, 1С создаёт колонку произвольного типа. Такая таблица работает, но сортировка смешанных значений (например, строк и чисел) может дать неожиданный порядок, а передача таблицы в запрос как параметра потребует явного приведения типов в тексте запроса через ВЫРАЗИТЬ().
Для колонок, которые будут участвовать в запросах, типизация обязательна на практике: без неё временная таблица создаётся с неопределёнными типами полей, и соединения могут работать медленнее или с ошибками. Для строк всегда указывайте длину через КвалификаторыСтроки — строка неограниченной длины не может использоваться в некоторых операциях сравнения и группировки.
Проверка результата и типичные ошибки
После заполнения убедитесь, что таблица содержит ожидаемые данные. Простейшая проверка — сравнить количество строк таблицы с количеством элементов массива и вывести несколько строк в сообщение или журнал.
Если ТаблицаДанных.Количество() <> МассивДанных.Количество() Тогда
ВызватьИсключение "Потеряны данные при преобразовании массива в таблицу";
КонецЕсли;
Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
Сообщить(Строка(СтрокаТЗ.Товар) + " — " + Строка(СтрокаТЗ.Количество));
КонецЦикла;
Отдельная ситуация — преобразование на сервере в управляемом приложении. Таблица значений, созданная в серверной процедуре, не возвращается на клиент напрямую в тонком клиенте без сериализации: для передачи используйте реквизит формы типа «ТаблицаЗначений» или возвращайте массив структур и стройте таблицу уже на клиенте, если это допустимо по контексту.
Как проверить результат
ТаблицаДанных.Количество() равно МассивДанных.Количество()
Строк меньше — часть элементов потеряна или цикл устроен неверно
ТипЗнч(СтрокаТЗ.Поле) соответствует описанию типа колонки
Значения неопределённого типа или Неопределено там, где ожидалась ссылка
Все поля строк содержат значения из массива
Поля пустые — имена ключей структуры не совпадают с именами колонок
Частые вопросы
Можно ли преобразовать массив в таблицу значений одной командой?
Нет, во встроенном языке 1С нет готового метода такого преобразования. Ближайший вариант — ЗагрузитьКолонку, но она заполняет только одну колонку из однородного массива. Для массива структур или нескольких колонок нужен цикл с добавлением строк.
Что делать, если структуры в массиве имеют разный набор ключей?
Перед заполнением проверяйте наличие ключа методом Свойство() структуры: Элемент.Свойство("Цена", ЗначениеЦены). Если ключа нет, присваивайте значение по умолчанию. ЗаполнитьЗначенияСвойств в этом случае не подойдёт — используйте поимённое заполнение полей строки.
Как вывести полученную таблицу на управляемую форму?
Создайте реквизит формы типа ТаблицаЗначений с нужными колонками, добавьте на форму табличное поле, связанное с этим реквизитом, и в коде скопируйте данные: РеквизитТаблица.Загрузить(ТаблицаДанных). Если состав колонок формируется динамически, потребуется программное изменение реквизитов формы через ИзменитьРеквизиты().
Можно ли передать таблицу значений в запрос?
Да. Поместите таблицу в параметр запроса и выберите её во временную таблицу через конструкцию ВЫБРАТЬ ... ПОМЕСТИТЬ ... ИЗ &Таблица КАК Таблица. Для корректной работы соединений колонки таблицы должны быть типизированы, а строковые колонки — иметь ограниченную длину.
Чем таблица значений отличается от массива структур и когда что выбрать?
Массив структур легче сериализуется и передаётся между клиентом и сервером, но не поддерживает поиск, сортировку, итоги и вывод в табличное поле. Таблица значений даёт Найти(), НайтиСтроки(), Сортировать(), Итог() и отображение на форме. Правило простое: промежуточный обмен — массив, обработка и показ пользователю — таблица значений.
Почему после заполнения таблицы сортировка работает неправильно?
Чаще всего причина в колонке без описания типа, куда попали значения разных типов — например, числа и строки. 1С сортирует такие значения по правилам сравнения разнотипных данных, и порядок выглядит неожиданным. Решение — задать колонке строгий тип при создании или привести значения к одному типу перед заполнением.
Что важно запомнить
Преобразование массива в таблицу значений в 1С делается вручную: создаётся таблица, описываются типизированные колонки, затем в цикле добавляются строки. Для массива структур используйте ЗаполнитьЗначенияСвойств при совпадении имён ключей и колонок, для однородного массива — ЗагрузитьКолонку. Всегда проверяйте совпадение количества строк и типов значений после заполнения.