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

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

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

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

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

Типовой сценарий выглядит так: ТЗ = ДокументОбъект.Товары.Выгрузить();. После этого переменная ТЗ содержит полноценную таблицу значений с теми же колонками, что и табличная часть, и с ней доступны сортировка, свёртка, поиск, итоги и выгрузка в запрос. Это стандартный приём при формировании отчётов, обработках обмена, проведении документов и печатных формах.

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

Базовый синтаксис метода Выгрузить()

Метод Выгрузить() доступен у любой табличной части объекта: документа, справочника, плана видов характеристик. Минимальный вызов без параметров копирует все строки и все колонки:

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

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

Результат — объект типа «ТаблицаЗначений». Он существует только в оперативной памяти сеанса и исчезает после завершения выполнения кода, если не сохранить его в хранилище значений, файл или реквизит обработки.

Выгрузка только нужных колонок

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

ТЗ = ДокументОбъект.Товары.Выгрузить(, "Номенклатура, Количество, Цена");

Обратите внимание на запятую перед строкой колонок: она означает, что первый параметр (отбор) пропущен. Имена колонок должны точно совпадать с именами реквизитов табличной части в конфигураторе, иначе платформа выдаст ошибку «Поле объекта не обнаружено».

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

Выгрузка строк по отбору

Первый параметр метода — структура, где ключи совпадают с именами колонок, а значения задают фильтр. Выгружаются только строки, удовлетворяющие всем условиям одновременно:

Отбор = Новый Структура("Склад", Справочники.Склады.НайтиПоНаименованию("Основной"));

ТЗ = ДокументОбъект.Товары.Выгрузить(Отбор, "Номенклатура, Количество");

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

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

Способы получить данные табличной части

Выгрузить()

Быстро и просто, работает с объектом в памяти. Ограничение: отбор только на равенство, нужен полученный объект.

Запрос к табличной части

Гибкие условия, соединения, итоги. Ограничение: работает по ссылке на записанный объект, требует текста запроса.

Цикл по табличной части

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

Выгрузка на сервере и в управляемых формах

В управляемом приложении данные объекта на клиенте представлены типом «ДанныеФормыКоллекция», у которого метода Выгрузить() нет в том же виде. Поэтому выгрузку выполняют в серверной процедуре: получают объект из ссылки, выгружают табличную часть и возвращают результат.

&НаСервере

Функция ПолучитьТовары()

ОбъектДок = РеквизитФормыВЗначение("Объект");

Возврат ОбъектДок.Товары.Выгрузить();

КонецФункции

Нюанс: таблица значений не сериализуется напрямую для передачи на клиент в произвольной форме. Возвращайте её через помещение во временное хранилище (ПоместитьВоВременноеХранилище) либо преобразуйте в массив структур, если данных немного. Для реквизита формы типа «ТаблицаЗначений» используйте ЗначениеВРеквизитФормы.

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

Что делать с таблицей значений дальше

После выгрузки открываются типовые операции. Сортировка: ТЗ.Сортировать("Номенклатура Возр"). Свёртка с группировкой и суммированием: ТЗ.Свернуть("Номенклатура", "Количество, Сумма") — частый приём для агрегации строк с одинаковым товаром.

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

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

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

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

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

Ещё одна ловушка — выгрузка из незаписанного объекта на сервере через запрос: запрос видит только данные, сохранённые в базе. Если документ изменён в форме, но не записан, запрос к его табличной части вернёт старые данные, а Выгрузить() из объекта формы — актуальные.

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

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

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

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

ТЗ.Количество() равно числу строк табличной части (или числу строк по отбору)

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

Строк меньше или больше — проверьте отбор и источник объекта

Итоги
Норма

ТЗ.Итог("Сумма") совпадает с итогом табличной части

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

Итоги расходятся — выгружены не все колонки или применён отбор

Состав колонок
Норма

Все нужные для обработки поля присутствуют в ТЗ

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

Колонки нет — добавьте её в строку выгрузки или уберите ограничение колонок

Итог

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

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

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

Можно ли выгрузить табличную часть по ссылке, не получая объект?

Напрямую нет: метод Выгрузить() принадлежит объекту. Варианты — получить объект через Ссылка.ПолучитьОбъект() и выгрузить, либо выполнить запрос к табличной части по ссылке, что не требует чтения всего объекта и обычно быстрее.

Как выгрузить табличную часть в дерево значений?

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

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

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

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

Отбор метода Выгрузить() работает только на равенство, поэтому условие «количество не равно нулю» напрямую не задать. Выгрузите всё и удалите лишние строки циклом, либо используйте запрос с условием ГДЕ Количество > 0.

Сохраняются ли типы колонок при выгрузке?

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