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