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

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

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

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

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

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

Метод Загрузить() — основной способ

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

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

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

ТаблицаПриемник.Колонки.Добавить("Количество");

ТаблицаПриемник.Загрузить(ТаблицаИсточник);

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

Копирование таблицы без изменения структуры

Если нужна полная копия таблицы вместе со структурой колонок, типами и данными, используйте метод Скопировать(). Он возвращает новую независимую таблицу значений.

ТаблицаКопия = ТаблицаИсточник.Скопировать();

// Копия с отбором по условию

Отбор = Новый Структура("Склад", ВыбранныйСклад);

ТаблицаКопия = ТаблицаИсточник.Скопировать(Отбор);

// Копия только с нужными колонками

ТаблицаКопия = ТаблицаИсточник.Скопировать(, "Номенклатура, Количество");

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

Построчный перенос с преобразованием данных

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

Для Каждого СтрокаИсточник Из ТаблицаИсточник Цикл

Если СтрокаИсточник.Количество = 0 Тогда

Продолжить;

КонецЕсли;

НоваяСтрока = ТаблицаПриемник.Добавить();

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

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

КонецЦикла;

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

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

Загрузка одной колонки из другой таблицы

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

МассивЗначений = ТаблицаИсточник.ВыгрузитьКолонку("Номенклатура");

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

Важное ограничение: количество элементов массива должно совпадать с количеством строк приёмника. Если строк в приёмнике меньше, «лишние» значения не попадут в таблицу; если больше — часть строк получит пустые значения. Перед загрузкой колонки убедитесь, что таблица-приёмник уже содержит нужное число строк.

Сравнение способов переноса

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

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

Загрузить()

Быстрый полный перенос при совпадающих структурах; уничтожает текущее содержимое приёмника

Скопировать()

Создаёт новую таблицу с отбором и выбором колонок; не работает с существующим приёмником

Построчный цикл

Максимальный контроль над отбором и преобразованием; требует больше кода и времени на больших таблицах

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

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

ДокументОбъект.Товары.Загрузить(ТаблицаТоваров);

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

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

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

Если ТаблицаПриемник.Количество() <> ТаблицаИсточник.Количество() Тогда

Сообщить("Количество строк не совпадает");

КонецЕсли;

СуммаИсточник = ТаблицаИсточник.Итог("Сумма");

СуммаПриемник = ТаблицаПриемник.Итог("Сумма");

Типичные ошибки
01
Использование Загрузить() вместо добавления строк — существующие данные приёмника теряются
02
Разные имена колонок в источнике и приёмнике — данные молча не переносятся
03
Несовпадение типов колонок — ошибка при загрузке или при последующей записи объекта
04
ЗагрузкаКолонки() в пустую таблицу — значения не попадают ни в одну строку
05
Работа с исходной таблицей вместо копии — непреднамеренное изменение данных, используемых в другом месте кода
Контрольные точки

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

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

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

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

Строк меньше или больше ожидаемого

Итоги по числовым колонкам
Норма

Итог() даёт одинаковые значения у источника и приёмника

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

Итоги расходятся — часть данных потеряна или задублирована

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

Нет пустых значений в обязательных полях

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

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

FAQ

Чем Загрузить() отличается от Скопировать()?

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

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

Используйте цикл по строкам источника с методом Добавить() и ЗаполнитьЗначенияСвойств(). Метод Загрузить() для этого не подходит — он всегда очищает таблицу-приёмник перед переносом.

Почему после Загрузить() часть колонок пустая?

Сопоставление идёт по именам колонок. Если имя колонки в источнике отличается от имени в приёмнике (например, «Товар» и «Номенклатура»), данные не переносятся. Проверьте имена или переносите такие поля построчно вручную.

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

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

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

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

Итог

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

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