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

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

Как в 1С из массива сделать таблицу значений

Как в 1С преобразовать массив в таблицу значений: создание колонок, заполнение строк, работа с массивом структур, типизация, ошибки и готовые примеры кода.

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

Способ заполнения зависит от того, что лежит в массиве: простые значения (строки, числа, ссылки), структуры с именованными полями или однотипные объекты. Ниже разобраны все три сценария с примерами кода, а также типизация колонок, проверка результата и типичные ошибки, из-за которых таблица получается пустой или с неправильными типами.

Создание пустой таблицы значений и описание колонок

Первый шаг — объявить таблицу и описать её структуру. Колонки добавляются методом Колонки.Добавить(), который принимает имя колонки, описание типа, заголовок и ширину. Минимальный вариант — только имя, но без типа колонка сможет хранить значения любого типа, что часто приводит к проблемам при сортировке и сравнении.

ТаблицаДанных = Новый ТаблицаЗначений;

ТаблицаДанных.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

ТаблицаДанных.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));

ТаблицаДанных.Колонки.Добавить("Комментарий", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200)));

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

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

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

МассивКонтрагентов = Новый Массив;

МассивКонтрагентов.Добавить(Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка"));

МассивКонтрагентов.Добавить(Справочники.Контрагенты.НайтиПоНаименованию("ИП Сидоров"));

ТаблицаКонтрагентов = Новый ТаблицаЗначений;

ТаблицаКонтрагентов.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));

Для Каждого Элемент Из МассивКонтрагентов Цикл

НоваяСтрока = ТаблицаКонтрагентов.Добавить();

НоваяСтрока.Контрагент = Элемент;

КонецЦикла;

Метод Добавить() возвращает новую строку таблицы, и её поля заполняются сразу после создания. Если забыть вызвать Добавить() внутри цикла и присваивать значения одной и той же строке, в таблице окажется только последний элемент массива — типичная ошибка начинающих.

Преобразование массива структур в таблицу с несколькими колонками

На практике чаще встречается массив структур: каждый элемент описывает запись с несколькими полями. Такой массив превращается в полноценную таблицу, где ключи структуры становятся колонками.

МассивДанных = Новый Массив;

СтрокаДанных = Новый Структура("Товар, Цена, Количество");

СтрокаДанных.Товар = Справочники.Номенклатура.НайтиПоКоду("000001");

СтрокаДанных.Цена = 1500;

СтрокаДанных.Количество = 2;

МассивДанных.Добавить(СтрокаДанных);

ТаблицаДанных = Новый ТаблицаЗначений;

ТаблицаДанных.Колонки.Добавить("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

ТаблицаДанных.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));

ТаблицаДанных.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0)));

Для Каждого Элемент Из МассивДанных Цикл

НоваяСтрока = ТаблицаДанных.Добавить();

ЗаполнитьЗначенияСвойств(НоваяСтрока, Элемент);

КонецЦикла;

Метод ЗаполнитьЗначенияСвойств() переносит значения по совпадающим именам полей: ключ структуры должен совпадать с именем колонки. Если в структуре есть лишние ключи, которых нет среди колонок, будет вызвана ошибка — поэтому либо формируйте структуру строго под состав колонок, либо заполняйте поля поимённо через присвоение.

Порядок действий
  1. 1
    Определите, что лежит в массиве: простые значения или структуры с полями
  2. 2
    Создайте объект Новый ТаблицаЗначений
  3. 3
    Добавьте колонки с именами и типами, соответствующими данным массива
  4. 4
    В цикле Для Каждого создавайте строку методом Добавить() и заполняйте её поля
  5. 5
    Проверьте результат: количество строк таблицы должно совпадать с количеством элементов массива

Альтернатива: загрузка массива в колонку через ЗагрузитьКолонку

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

ТаблицаДанных = Новый ТаблицаЗначений;

ТаблицаДанных.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));

ТаблицаДанных.ЗагрузитьКолонку(МассивНаименований, "Наименование");

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

Сравнение вариантов

Цикл Для Каждого с Добавить()

Универсальный способ: подходит для простых значений, структур и сложной логики заполнения. Требует больше кода, но даёт полный контроль.

ЗагрузитьКолонку

Быстро и коротко, но только для одной колонки и однородного массива простых значений.

ЗаполнитьЗначенияСвойств в цикле

Оптимально для массива структур, если имена ключей совпадают с именами колонок. Лишние ключи вызовут ошибку.

Типизация колонок и работа с составными типами

Если тип колонки не указан, 1С создаёт колонку произвольного типа. Такая таблица работает, но сортировка смешанных значений (например, строк и чисел) может дать неожиданный порядок, а передача таблицы в запрос как параметра потребует явного приведения типов в тексте запроса через ВЫРАЗИТЬ().

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

Проверка результата и типичные ошибки

После заполнения убедитесь, что таблица содержит ожидаемые данные. Простейшая проверка — сравнить количество строк таблицы с количеством элементов массива и вывести несколько строк в сообщение или журнал.

Если ТаблицаДанных.Количество() <> МассивДанных.Количество() Тогда

ВызватьИсключение "Потеряны данные при преобразовании массива в таблицу";

КонецЕсли;

Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл

Сообщить(Строка(СтрокаТЗ.Товар) + " — " + Строка(СтрокаТЗ.Количество));

КонецЦикла;

Типичные ошибки
01
Забыли вызвать Добавить() внутри цикла — в таблице остаётся только последняя строка или она вообще пустая
02
Ключи структуры не совпадают с именами колонок — ЗаполнитьЗначенияСвойств завершается ошибкой или поля остаются пустыми
03
Колонка без типа получила смешанные значения — сортировка и поиск работают непредсказуемо
04
Пустой массив не проверен — код отработал без ошибок, но таблица пустая, и причина ищется не там
05
Использование ЗагрузитьКолонку для массива структур — в колонку попадают сами структуры, а не их поля

Отдельная ситуация — преобразование на сервере в управляемом приложении. Таблица значений, созданная в серверной процедуре, не возвращается на клиент напрямую в тонком клиенте без сериализации: для передачи используйте реквизит формы типа «ТаблицаЗначений» или возвращайте массив структур и стройте таблицу уже на клиенте, если это допустимо по контексту.

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

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

Количество строк
Норма

ТаблицаДанных.Количество() равно МассивДанных.Количество()

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

Строк меньше — часть элементов потеряна или цикл устроен неверно

Типы значений в колонках
Норма

ТипЗнч(СтрокаТЗ.Поле) соответствует описанию типа колонки

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

Значения неопределённого типа или Неопределено там, где ожидалась ссылка

Заполненность полей
Норма

Все поля строк содержат значения из массива

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

Поля пустые — имена ключей структуры не совпадают с именами колонок

Частые вопросы

Можно ли преобразовать массив в таблицу значений одной командой?

Нет, во встроенном языке 1С нет готового метода такого преобразования. Ближайший вариант — ЗагрузитьКолонку, но она заполняет только одну колонку из однородного массива. Для массива структур или нескольких колонок нужен цикл с добавлением строк.

Что делать, если структуры в массиве имеют разный набор ключей?

Перед заполнением проверяйте наличие ключа методом Свойство() структуры: Элемент.Свойство("Цена", ЗначениеЦены). Если ключа нет, присваивайте значение по умолчанию. ЗаполнитьЗначенияСвойств в этом случае не подойдёт — используйте поимённое заполнение полей строки.

Как вывести полученную таблицу на управляемую форму?

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

Можно ли передать таблицу значений в запрос?

Да. Поместите таблицу в параметр запроса и выберите её во временную таблицу через конструкцию ВЫБРАТЬ ... ПОМЕСТИТЬ ... ИЗ &Таблица КАК Таблица. Для корректной работы соединений колонки таблицы должны быть типизированы, а строковые колонки — иметь ограниченную длину.

Чем таблица значений отличается от массива структур и когда что выбрать?

Массив структур легче сериализуется и передаётся между клиентом и сервером, но не поддерживает поиск, сортировку, итоги и вывод в табличное поле. Таблица значений даёт Найти(), НайтиСтроки(), Сортировать(), Итог() и отображение на форме. Правило простое: промежуточный обмен — массив, обработка и показ пользователю — таблица значений.

Почему после заполнения таблицы сортировка работает неправильно?

Чаще всего причина в колонке без описания типа, куда попали значения разных типов — например, числа и строки. 1С сортирует такие значения по правилам сравнения разнотипных данных, и порядок выглядит неожиданным. Решение — задать колонке строгий тип при создании или привести значения к одному типу перед заполнением.

Итог

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

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