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