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

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

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

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

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

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

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

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

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

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

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

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

Указывать тип колонки не обязательно — без второго параметра колонка примет значения любого типа. Однако явное описание типов даёт три преимущества: контроль приводимых значений, корректную сортировку и сравнение, а также правильное отображение в табличном поле на форме. Для колонок, по которым планируется поиск через Найти() или индексирование, тип задавать стоит всегда.

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

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

МассивТоваров = Новый Массив;

МассивТоваров.Добавить(Справочники.Номенклатура.НайтиПоКоду("000000001"));

МассивТоваров.Добавить(Справочники.Номенклатура.НайтиПоКоду("000000002"));

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

ТЗ.Колонки.Добавить("Номенклатура");

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

Если колонок несколько, а данные лежат в нескольких параллельных массивах одинаковой длины, вызовите ЗагрузитьКолонку() для каждого массива последовательно. Порядок строк сохранится, потому что метод заполняет строки по индексу. Главное условие — массивы должны быть согласованы по длине и порядку элементов, иначе данные «разъедутся».

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

На практике чаще встречается массив структур: например, результат разбора JSON, строки файла или данные из внешнего источника. Здесь ЗагрузитьКолонку() не поможет — нужен цикл с добавлением строк и заполнением полей.

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

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

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

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

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

КонецЦикла;

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

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

Порядок действий для массива структур
  1. 1
    Создайте таблицу значений и опишите колонки с типами
  2. 2
    Убедитесь, что ключи структур соответствуют именам колонок
  3. 3
    В цикле добавляйте строку через ТЗ.Добавить() и заполняйте поля
  4. 4
    Проверьте результат: ТЗ.Количество() должно равняться МассивСтруктур.Количество()

Загрузка массива массивов и двумерных данных

Двумерные данные — массив, где каждый элемент сам является массивом значений по колонкам — типичны при чтении Excel, CSV или табличных документов. Здесь логика похожа на массив структур, но обращение идёт по индексам.

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

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

НоваяСтрока.Номенклатура = СтрокаДанных[0];

НоваяСтрока.Количество = СтрокаДанных[1];

НоваяСтрока.Комментарий = СтрокаДанных[2];

КонецЦикла;

Перед обращением по индексу проверяйте, что вложенный массив содержит достаточно элементов: строки из файлов могут быть «обрезаны», и обращение к СтрокаДанных[5] при трёх элементах вызовет ошибку «Индекс находится за границами массива». Надёжный шаблон — проверка Если СтрокаДанных.Количество() >= 3 Тогда ... КонецЕсли; или заполнение через цикл по минимальной длине.

При чтении данных из Excel через табличный документ часто выгоднее сразу строить массив структур с именованными полями, а не массив массивов: дальнейший код загрузки в таблицу значений становится короче и устойчивее к перестановке колонок в файле.
ПЗ
Практическое замечание

Обратная задача и проверка результата

Обратное преобразование выполняется встроенными методами: ТЗ.ВыгрузитьКолонку("Номенклатура") вернёт одномерный массив значений колонки. Это удобно для передачи в запрос как параметра для условия В (&Массив). Полного аналога «массив структур из таблицы» нет — его собирают циклом, создавая структуру на каждую строку.

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

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

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

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

ТЗ.Количество() равно числу элементов массива

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

Строк меньше или больше — данные потеряны или продублированы

Ключевые колонки
Норма

Найти(Неопределено) и Найти("") возвращают Неопределено

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

Есть пустые значения там, где они недопустимы

Типы значений
Норма

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

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

Строки вместо чисел, строковые представления ссылок

Типичные ошибки и ограничения

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

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

Типичные ошибки
01
Вызов ЗагрузитьКолонку() без предварительного создания колонки — ошибка «Колонка не найдена»
02
Загрузка строковых представлений ссылок вместо самих ссылок — поиск и сравнение перестают работать
03
Игнорирование длин вложенных массивов — ошибка «Индекс за границами» на неполных строках
04
Построчная загрузка сотен тысяч строк вместо запроса — лишнее время выполнения и расход памяти

Какой способ выбрать в разных сценариях

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

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

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

Одна колонка из одномерного массива. Быстро и кратко, но только одна колонка за вызов

Цикл с Добавить()

Массивы структур и массивов, несколько колонок, гибкая обработка. Требует ручного контроля типов

Запрос с Выгрузить()

Данные из базы большого объёма. Обходит этап массива, но требует источника в виде таблиц БД

Итог

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

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

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

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

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

Что произойдёт, если загрузить колонку в таблицу, где уже есть строки?

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

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

Сначала преобразуйте JSON через ПрочитатьJSON() — на выходе получится массив структур. Затем создайте таблицу значений с колонками, совпадающими по именам с ключами, и в цикле используйте ЗаполнитьЗначенияСвойств(НоваяСтрока, Элемент). Вложенные объекты и массивы внутри JSON потребуют отдельной обработки.

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

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

Что быстрее для больших объёмов: цикл по массиву или запрос?

Запрос с последующим Выгрузить() практически всегда быстрее, потому что выборка и формирование таблицы выполняются на уровне СУБД без построчного обхода в коде. Цикл оправдан, когда источник данных — не база (файл, внешний сервис, результаты вычислений) или когда каждую строку нужно сложно обработать перед добавлением.