Разработка и Конфигурация · 8 мин
1С: как загрузить таблицу значений в таблицу значений
Как в 1С загрузить одну таблицу значений в другую: метод Загрузить, копирование, построчный перенос, загрузка колонки. Примеры кода, ошибки и проверка результата.
Задача загрузить одну таблицу значений в другую встречается при обмене данными между процедурами, при подготовке данных для СКД, при заполнении табличных частей документов и при обработке результатов запросов. В языке 1С для этого есть встроенный метод Загрузить(), а также несколько альтернативных приёмов — копирование, построчный перенос и загрузка отдельной колонки.
Выбор способа зависит от того, совпадают ли структуры таблиц, нужно ли сохранить исходную таблицу неизменной и требуется ли отбор или преобразование данных при переносе. Ниже разобраны все рабочие варианты с примерами кода, ограничениями и типичными ошибками.
Метод Загрузить() — основной способ
Метод Загрузить() объекта «ТаблицаЗначений» переносит все строки из таблицы-источника в таблицу-приёмник. Перед загрузкой содержимое приёмника очищается, поэтому метод не подходит, если нужно добавить строки к уже существующим.
ТаблицаПриемник = Новый ТаблицаЗначений;
ТаблицаПриемник.Колонки.Добавить("Номенклатура");
ТаблицаПриемник.Колонки.Добавить("Количество");
ТаблицаПриемник.Загрузить(ТаблицаИсточник);
Сопоставление колонок выполняется по именам. Если в приёмнике есть колонка, которой нет в источнике, она останется с пустыми значениями. Если в источнике есть колонка, отсутствующая в приёмнике, её данные будут потеряны без какого-либо сообщения об ошибке — это частая причина «тихих» потерь данных.
Копирование таблицы без изменения структуры
Если нужна полная копия таблицы вместе со структурой колонок, типами и данными, используйте метод Скопировать(). Он возвращает новую независимую таблицу значений.
ТаблицаКопия = ТаблицаИсточник.Скопировать();
// Копия с отбором по условию
Отбор = Новый Структура("Склад", ВыбранныйСклад);
ТаблицаКопия = ТаблицаИсточник.Скопировать(Отбор);
// Копия только с нужными колонками
ТаблицаКопия = ТаблицаИсточник.Скопировать(, "Номенклатура, Количество");
Метод Скопировать() удобнее Загрузить(), когда структура приёмника заранее неизвестна или должна полностью повторять источник. Второй параметр позволяет сразу ограничить набор переносимых колонок, а первый — применить отбор строк.
Построчный перенос с преобразованием данных
Когда структуры таблиц различаются, нужен отбор по условию или значения требуется преобразовать, применяется перенос в цикле. Это самый гибкий способ.
Для Каждого СтрокаИсточник Из ТаблицаИсточник Цикл
Если СтрокаИсточник.Количество = 0 Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТаблицаПриемник.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточник);
НоваяСтрока.Сумма = СтрокаИсточник.Количество * СтрокаИсточник.Цена;
КонецЦикла;
Процедура ЗаполнитьЗначенияСвойств() переносит значения одноимённых полей, что избавляет от перечисления каждой колонки вручную. При этом колонки, которых нет в приёмнике, игнорируются, а отсутствующие в источнике остаются незаполненными.
- 1Убедитесь, что в таблице-приёмнике созданы нужные колонки с корректными типами
- 2При необходимости очистите приёмник методом Очистить()
- 3Организуйте цикл по строкам источника с проверкой условий отбора
- 4Добавляйте строку методом Добавить() и заполняйте через ЗаполнитьЗначенияСвойств()
- 5Дозаполните вычисляемые или переименованные колонки вручную
- 6Проверьте количество строк и контрольные итоги после переноса
Загрузка одной колонки из другой таблицы
Иногда требуется перенести не всю таблицу, а только значения одной колонки. Для этого у таблицы значений есть метод ЗагрузитьКолонку(), который принимает массив значений. Массив можно получить методом ВыгрузитьКолонку() у источника.
МассивЗначений = ТаблицаИсточник.ВыгрузитьКолонку("Номенклатура");
ТаблицаПриемник.ЗагрузитьКолонку(МассивЗначений, "Товар");
Важное ограничение: количество элементов массива должно совпадать с количеством строк приёмника. Если строк в приёмнике меньше, «лишние» значения не попадут в таблицу; если больше — часть строк получит пустые значения. Перед загрузкой колонки убедитесь, что таблица-приёмник уже содержит нужное число строк.
Сравнение способов переноса
| Способ | Когда применять | Ограничения |
|---|---|---|
| Загрузить() | Структуры совпадают, приёмник можно полностью заменить | Очищает приёмник; колонки сопоставляются только по именам |
| Скопировать() | Нужна независимая копия с той же структурой, простой отбор | Не подходит для заполнения уже существующей таблицы |
| Цикл с Добавить() | Разные структуры, сложный отбор, преобразование значений | Медленнее на больших объёмах, больше кода |
| ЗагрузитьКолонку() | Перенос значений одной колонки | Требует совпадения числа строк и элементов массива |
Сравнение вариантов
Быстрый полный перенос при совпадающих структурах; уничтожает текущее содержимое приёмника
Создаёт новую таблицу с отбором и выбором колонок; не работает с существующим приёмником
Максимальный контроль над отбором и преобразованием; требует больше кода и времени на больших таблицах
Загрузка в табличную часть документа
Частный и очень частый случай — загрузка таблицы значений в табличную часть документа или обработки. Табличная часть поддерживает тот же метод Загрузить(), поэтому код выглядит аналогично.
ДокументОбъект.Товары.Загрузить(ТаблицаТоваров);
Перед загрузкой проверьте, что имена колонок таблицы значений совпадают с именами реквизитов табличной части, а типы значений совместимы. Несовпадение типов (например, строка вместо ссылки на справочник) приведёт к ошибке либо при загрузке, либо при записи документа.
Проверка результата и типичные ошибки
После переноса данных убедитесь, что результат соответствует ожиданиям. Минимальный набор проверок: количество строк в приёмнике, контрольная сумма по числовой колонке и отсутствие пустых значений в ключевых полях.
Если ТаблицаПриемник.Количество() <> ТаблицаИсточник.Количество() Тогда
Сообщить("Количество строк не совпадает");
КонецЕсли;
СуммаИсточник = ТаблицаИсточник.Итог("Сумма");
СуммаПриемник = ТаблицаПриемник.Итог("Сумма");
Как проверить результат
Совпадает с источником или с ожидаемым числом после отбора
Строк меньше или больше ожидаемого
Итог() даёт одинаковые значения у источника и приёмника
Итоги расходятся — часть данных потеряна или задублирована
Нет пустых значений в обязательных полях
Пустые значения — имена колонок не совпали
FAQ
Чем Загрузить() отличается от Скопировать()?
Загрузить() переносит строки в уже существующую таблицу, сопоставляя колонки по именам и очищая приёмник. Скопировать() создаёт новую таблицу значений с полной структурой источника и возвращает её как результат.
Как добавить строки одной таблицы к другой, не очищая приёмник?
Используйте цикл по строкам источника с методом Добавить() и ЗаполнитьЗначенияСвойств(). Метод Загрузить() для этого не подходит — он всегда очищает таблицу-приёмник перед переносом.
Почему после Загрузить() часть колонок пустая?
Сопоставление идёт по именам колонок. Если имя колонки в источнике отличается от имени в приёмнике (например, «Товар» и «Номенклатура»), данные не переносятся. Проверьте имена или переносите такие поля построчно вручную.
Можно ли загрузить таблицу значений в дерево значений?
Напрямую методом Загрузить() — нет, у дерева значений другая структура со строками-родителями и подчинёнными. Данные переносятся построчно с формированием иерархии либо через преобразование с использованием запроса с итогами.
Что быстрее на больших таблицах — Загрузить() или цикл?
Метод Загрузить() выполняется быстрее, так как реализован на уровне платформы. Построчный цикл медленнее, но незаменим при отборах и преобразованиях. Для больших объёмов с фильтрацией альтернатива — Скопировать() с параметром отбора.
Что важно запомнить
Для полного переноса при совпадающих структурах используйте Загрузить(), для независимой копии — Скопировать(), для отбора и преобразования — цикл с Добавить(). Помните, что Загрузить() очищает приёмник, а колонки сопоставляются строго по именам. После переноса сверяйте количество строк и итоги.