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

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

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

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

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

Универсальной встроенной функции «МассивВТаблицуЗначений» в платформе нет, поэтому преобразование пишут вручную. Способ зависит от того, что лежит в массиве: простые значения (строки, числа, ссылки) или структуры с набором полей. Ниже разобраны оба сценария с готовым кодом, вопросы типизации колонок, типичные ошибки и способы проверить результат.

Когда массив нужно превращать в таблицу значений

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

Типичные ситуации, когда преобразование необходимо:

  • данные прочитаны из файла CSV, JSON или Excel и лежат в массиве строк, а дальше их нужно загрузить в документ или регистр;
  • результат работы веб-сервиса вернул список объектов, который надо вывести в отчёт на СКД;
  • массив ссылок нужно свернуть, отсортировать и передать параметром в запрос через временную таблицу;
  • требуется сгруппировать данные с итогами — метод Свернуть() есть только у таблицы значений.

Базовый способ: массив простых значений

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

Функция МассивВТаблицу(МассивДанных)

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

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

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

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Значение = Элемент;

КонецЦикла;

Возврат ТЗ;

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

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

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

Массив структур: перенос нескольких полей

Чаще на практике массив содержит структуры — например, строки, разобранные из JSON. Каждая структура становится строкой таблицы, а её ключи — колонками. Имена колонок удобно взять из первой структуры массива.

Функция МассивСтруктурВТаблицу(МассивСтруктур)

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

Если МассивСтруктур.Количество() = 0 Тогда

Возврат ТЗ;

КонецЕсли;

ПерваяСтрока = МассивСтруктур[0];

Для Каждого КлючЗначение Из ПерваяСтрока Цикл

ТЗ.Колонки.Добавить(КлючЗначение.Ключ);

КонецЦикла;

Для Каждого СтруктураСтроки Из МассивСтруктур Цикл

НоваяСтрока = ТЗ.Добавить();

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

КонецЦикла;

Возврат ТЗ;

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

Метод ЗаполнитьЗначенияСвойств() переносит значения по совпадающим именам свойств, поэтому он идеально подходит для пары «структура → строка таблицы». Но у него есть ограничение: если в какой-то структуре отсутствует ключ, колонка останется пустой, а если есть лишний ключ, которого нет в колонках, возникнет ошибка. Поэтому важно, чтобы все структуры в массиве имели одинаковый набор ключей.

Если наборы ключей различаются, либо формируйте структуры единообразно на этапе заполнения массива, либо собирайте полный список колонок заранее — пройдя по всем структурам и добавив недостающие имена, а заполнение выполняйте через обращение НоваяСтрока[ИмяКолонки] с проверкой наличия свойства.

Типизация колонок и заполнение значений

Тип колонки определяет, как таблица будет себя вести при сортировке, сравнении и передаче в запрос. Описание типов строится конструктором Новый ОписаниеТипов(), куда передаётся строка с именами типов или массив типов, а также квалификаторы для строк, чисел и дат.

Примеры типовых описаний:

  • строка ограниченной длины: Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150));
  • число с точностью: Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
  • дата без времени: Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата));
  • ссылка: Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
  • составной тип: Новый ОписаниеТипов("СправочникСсылка.Номенклатура,СправочникСсылка.Услуги").

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

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

Что делать с таблицей после преобразования

Полученная таблица значений открывает операции, недоступные массиву. Наиболее востребованные:

  • ТЗ.Сортировать("Сумма Убыв, Наименование Возр") — сортировка по одной или нескольким колонкам;
  • ТЗ.Свернуть("Контрагент", "Сумма") — группировка с суммированием, аналог GROUP BY;
  • ТЗ.Найти(Значение, "ИмяКолонки") и ТЗ.НайтиСтроки(ПараметрыОтбора) — поиск строк;
  • ТЗ.Скопировать(Отбор) — получение подмножества строк;
  • передача в запрос: Запрос.УстановитьПараметр("ТЗ", ТЗ) с конструкцией ПОМЕСТИТЬ ВТ ИЗ &ТЗ КАК ТЗ;
  • вывод в отчёт на СКД через НаборДанныхОбъектСхемыКомпоновкиДанных и внешний источник данных.

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

Сравнение подходов

Цикл с Добавить() и заполнением вручную

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

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

Короткий код для массива однотипных структур. Требует строго одинакового набора ключей

Загрузка через запрос и временную таблицу

Когда конечная цель — соединение с данными ИБ: таблицу передают параметром и обрабатывают запросом, минуя построчный обход в коде

Проверка результата и ограничения

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

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

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

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

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

ТЗ.Количество() равно размеру исходного массива

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

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

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

ТЗ.Колонки.ИмяКолонки.ТипЗначения содержит ожидаемый тип

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

Тип произвольный или значения записаны строками вместо чисел и дат

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

Обязательные колонки заполнены в каждой строке

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

Пустые значения там, где структуры не содержали ключ

Передача в запрос
Норма

Запрос с параметром-таблицей выполняется без ошибок типов

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

Ошибка несовместимости типов при соединении временной таблицы

FAQ

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

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

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

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

Почему ЗаполнитьЗначенияСвойств выдаёт ошибку при переносе структуры?

Ошибка возникает, если в структуре есть ключ, для которого не создана колонка в таблице. Проверьте, что все структуры массива имеют одинаковый состав ключей и что колонки созданы по полному списку имён. Лишние ключи можно отфильтровать, передав в ЗаполнитьЗначенияСвойств третьим параметром список заполняемых свойств.

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

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

Что делать, если массив содержит значения разных типов?

Либо объявите колонку составного типа, перечислив нужные типы в ОписанииТипов, либо оставьте колонку без ограничения типа. Но учтите, что смешанные типы ломают сортировку, сравнение в запросах и итоги — надёжнее привести значения к одному типу ещё на этапе заполнения массива.

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

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

Итог

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

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