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

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

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

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

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

Главное, что нужно понять сразу: прямого метода «ЗагрузитьМассив» у таблицы значений нет. Есть метод ЗагрузитьКолонку, который переносит одномерный массив в одну колонку, и есть классический перебор массива в цикле с добавлением строк. Выбор зависит от структуры исходного массива: одномерный он или массив структур, совпадают ли типы данных, нужна ли дополнительная обработка значений при переносе.

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

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

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

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

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

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

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

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

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

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

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

МассивАртикулов = Новый Массив;

МассивАртикулов.Добавить("АРТ-001");

МассивАртикулов.Добавить("АРТ-002");

МассивАртикулов.Добавить("АРТ-003");

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

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

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

После выполнения в таблице будет три строки, колонка «Артикул» заполнена. Остальные колонки, если они есть, останутся пустыми — их можно заполнить вторым вызовом ЗагрузитьКолонку другим массивом той же длины.

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

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

Загрузка массива структур циклом

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

Третий распространённый случай — массив, элементами которого являются другие массивы. Так выглядят данные после построчного чтения CSV-файла, разбора строки по разделителю или чтения табличного документа. Здесь обращение к полям идёт по индексу, а не по имени.

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

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

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

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

КонецЦикла;

Главный риск этого подхода — жёсткая привязка к порядку колонок источника. Если в файле поменяют местами колонки, код молча запишет артикул в количество или упадёт с ошибкой преобразования. Защита — проверка длины вложенного массива перед обращением по индексу и, при возможности, чтение заголовков из первой строки файла с построением соответствия «имя колонки → индекс».

Все значения из текстового файла приходят строками. Явное преобразование через Число(), Дата() или приведение типов колонкой таблицы обязательно, иначе дальнейшие сравнения и итоги по таблице будут работать некорректно: строки «10» и «9» сортируются не так, как числа 10 и 9.

Сравнение способов загрузки

У каждого подхода есть своя область применения. Выбор зависит от структуры исходного массива и требований к обработке данных при переносе.

СпособСтруктура массиваСкоростьКонтроль над данными
ЗагрузитьКолонкуОдномерныйМаксимальнаяНет обработки, перенос «как есть»
Цикл + ЗаполнитьЗначенияСвойствМассив структур с совпадающими именамиСредняяБазовый, через список свойств
Цикл с ручным заполнениемЛюбаяСредняяПолный: валидация, преобразование, поиск ссылок

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

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

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

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

Оптимален для массива структур с именами полей, совпадающими с колонками. Ограничение: лишние поля структуры вызывают ошибку без списка допустимых свойств.

Цикл с ручным заполнением

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

Проверка результата после загрузки

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

Если ТЗ.Количество() <> МассивДанных.Количество() Тогда

ВызватьИсключение "Количество строк таблицы не совпадает с размером массива";

КонецЕсли;

Для визуальной проверки в отладке таблицу значений можно посмотреть через «Вычислить выражение» — платформа покажет её в табличном виде. В управляемых формах таблицу выводят в реквизит формы типа «ТаблицаЗначений» с динамическим созданием колонок, что удобно для тестирования обработок загрузки.

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

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

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

Равно количеству элементов исходного массива

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

Строк меньше (часть данных потеряна) или больше (таблица не была очищена)

Типы значений в колонках
Норма

Числа хранятся как числа, даты как даты — сортировка и итоги работают правильно

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

Числа и даты лежат строками, итоги и сравнения дают неверный результат

Обязательные колонки
Норма

Все ключевые поля заполнены в каждой строке

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

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

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

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

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

Третья типичная проблема — передача таблицы значений между клиентом и сервером в управляемом приложении. Таблица значений не сериализуется напрямую для передачи с сервера на клиент в тонком клиенте в общем случае; для обмена между контекстами используют ЗначениеВСтрокуВнутр, передачу через хранилище значений или преобразование в массив структур.

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

FAQ

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

Только если массив одномерный — методом ЗагрузитьКолонку. Для массива структур или массива массивов штатного «однострочного» метода нет, нужен цикл. Альтернатива — сформировать запрос с конструкцией ВЫБРАТЬ и объединениями, но это оправдано только в особых случаях.

Как загрузить массив в существующую таблицу, не удаляя текущие строки?

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

Что делать, если имена полей структуры не совпадают с именами колонок?

Либо заполняйте поля строки вручную в цикле с явным соответствием «поле структуры → колонка», либо постройте соответствие имён и используйте его при переносе. ЗаполнитьЗначенияСвойств без совпадения имён не сработает.

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

Используйте метод Свернуть с указанием колонок группировки — он объединит одинаковые строки. Если нужно сохранить суммы по числовым полям, передайте их имена вторым параметром. Альтернатива — выгрузить таблицу во временную таблицу запроса и применить ВЫБРАТЬ РАЗЛИЧНЫЕ.

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

Напрямую в тонком клиенте таблица значений не передаётся между контекстами. Рабочие варианты: преобразовать таблицу в массив структур, использовать реквизит формы типа ТаблицаЗначений или ДинамическийСписок, либо сериализовать через ЗначениеВСтрокуВнутр с последующим восстановлением.

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

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

Итог

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

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