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

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

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

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

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

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

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

Массив хранит элементы по числовому индексу от нуля и не знает ни имён полей, ни типов колонок. Таблица значений, напротив, требует заранее описанных колонок: у каждой есть имя, тип и, при необходимости, заголовок. Из-за этой разницы платформа не может «угадать» структуру будущей таблицы по содержимому массива — разработчик обязан описать колонки явно через Таблица.Колонки.Добавить().

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

Способ 1. Построчное копирование простого массива циклом

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

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

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

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

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

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

КонецЦикла;

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

Цикл удобен ещё и тем, что в нём легко выполнить сопутствующую обработку: отбросить дубликаты, обрезать строки, преобразовать тип. Это самый гибкий способ, и именно его стоит брать за основу, когда логика переноса не сводится к простому «один элемент — одна строка».

Способ 2. Быстрая загрузка через ЗагрузитьКолонку()

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

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

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

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

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

Способ 3. Перенос массива структур в многоколоночную таблицу

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

Сравнение способов и условия выбора

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

СпособКогда подходитОграничения
Цикл с Добавить()Любой массив, нужна обработка или фильтрация элементовБольше кода, медленнее на очень больших объёмах
ЗагрузитьКолонку()Однородный массив простых значений, одна колонкаОдна колонка за вызов, не очищает таблицу, требует готовой колонки
ЗаполнитьЗначенияСвойств()Массив структур с фиксированным набором ключейОшибка при лишних ключах, имена должны совпадать с колонками

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

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

Универсальный вариант с полным контролем; выбирайте, когда нужна фильтрация, преобразование типов или пропуск элементов

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

Самый короткий код для однородного массива; не подходит для массива структур и требует предварительно созданной колонки

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

Стандарт для массива структур; требует точного совпадения ключей структуры с именами колонок

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

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

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

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

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

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

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

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

Значения контрольных строк
Норма

Первая и последняя строки совпадают с крайними элементами массива

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

Значения сдвинуты или пустые — ошибка в цикле или типах

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

Значения имеют ожидаемый тип, итоги считаются

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

Числа стали строками, итог равен нулю или падает сортировка

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

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

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

Альтернативы: когда таблица значений не нужна

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

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

Маршрут решения

Как выбрать действие

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

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

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

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

Что будет, если тип колонки не совпадает со значениями массива?

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

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

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

Нужно ли очищать таблицу перед повторным копированием?

Да. Ни цикл с Добавить(), ни ЗагрузитьКолонку() не удаляют существующие строки. Вызовите ТЗ.Очистить() перед повторным переносом, иначе старые и новые данные смешаются.

Что быстрее: цикл или ЗагрузитьКолонку()?

На больших однородных массивах ЗагрузитьКолонку() обычно работает быстрее, так как перенос выполняется одним вызовом на уровне платформы. Разница заметна на десятках тысяч элементов; на небольших массивах она несущественна, и выбирать стоит по удобству кода.

Можно ли потом выгрузить таблицу обратно в массив?

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

Итог

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

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