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

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

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

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

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

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

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

Что понадобится перед выгрузкой

Для работы потребуются три объекта: сам запрос с текстом и параметрами, табличный документ-приёмник и, при ручном способе, макет с именованными областями. Запрос создаётся конструктором Новый Запрос, табличный документ — Новый ТабличныйДокумент.

Макет удобнее всего хранить в общем макете или в макете обработки/отчёта. В макете создают области: «Шапка» для заголовков колонок, «Строка» для данных и при необходимости «Подвал» для итогов. Имена областей потом используются в коде при выводе.

Способ 1: ручное заполнение через макет и цикл

Это основной и самый гибкий метод. Вы получаете макет, выводите шапку один раз, затем в цикле по выборке заполняете параметры области «Строка» и выводите её в документ. Полный контроль над форматированием, порядком колонок и итогами остаётся у вас.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Код КАК Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");

ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));

Пока Выборка.Следующий() Цикл
 ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
 ОбластьСтрока.Параметры.Товар = Выборка.Товар;
 ОбластьСтрока.Параметры.Код = Выборка.Код;
 ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

ТабДок.Показать("Результат запроса");

Ключевые моменты кода: область «Строка» получается заново на каждой итерации цикла, иначе параметры будут затираться или строка не выведется. Имена параметров в макете должны совпадать с именами, которые вы присваиваете через ОбластьСтрока.Параметры.

После заполнения документ показывают методом Показать() либо сохраняют: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Формат указывается явно, иначе платформа использует формат по умолчанию.

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

Способ 2: автоматическая выгрузка через построитель отчёта

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

bsl
Построитель = Новый ПостроительОтчета;
Построитель.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Код КАК Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";

Построитель.Выполнить();

ТабДок = Новый ТабличныйДокумент;
Построитель.Вывести(ТабДок);
ТабДок.Показать("Выгрузка запроса");

Метод Вывести() построителя формирует таблицу с итогами и оформлением по умолчанию. Колонки можно настроить через коллекцию Построитель.ВыбранныеПоля: порядок, представление, ширину. Это компромисс между скоростью разработки и управляемостью результата.

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

Ручной цикл с макетом

Полный контроль над оформлением, группировками и итогами. Требует макета и больше кода.

ПостроительОтчета

Минимум кода, автоматические колонки и итоги. Оформление ограничено возможностями построителя.

Выгрузить() в таблицу значений

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

Группировки, итоги и обход результатов

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

Тип записи проверяется свойством Выборка.ТипЗаписи(): детальная запись, итог по группировке или общий итог. Это позволяет выводить разные области макета для групп и строк, например «Группа» и «Строка», — так строят классические отчёты с промежуточными итогами.

Сохранение и вывод результата пользователю

Готовый табличный документ показывают методом Показать(Заголовок) в толстом и тонком клиенте. В управляемых формах документ обычно размещают в реквизите формы типа «ТабличныйДокумент» — тогда он отображается прямо в форме без отдельного окна.

Для сохранения в файл применяют Записать() с указанием типа: XLSX, PDF, MXL, ODS. В серверном коде помните, что интерактивный показ на сервере невозможен — файл формируют на сервере, а открывают или скачивают на клиенте через временное хранилище.

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

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

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

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

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

Равно Выборка.Количество() при плоском обходе

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

Строк меньше — цикл прервался или запрос пуст

Заполнение ячеек
Норма

Все параметры макета выведены

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

Пустые ячейки — имена параметров не совпадают

Сохранение в файл
Норма

Файл открывается, данные читаемы

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

Ошибка Записать() — неверный путь или тип файла

FAQ

Чем отличается Выгрузить() от вывода в табличный документ?

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

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

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

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

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

Почему табличный документ пустой, хотя запрос выполняется?

Чаще всего запрос возвращает ноль строк из-за условий отбора или незаполненных параметров — проверьте Результат.Пустой и Выборка.Количество() в отладчике. Вторая причина — область макета получена, но не выведена методом Вывести(), либо вывод идёт в другой объект документа.

Как сохранить результат запроса сразу в Excel?

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

Работает ли Показать() в фоновом задании или на сервере?

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

Итог

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

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