Разработка и Конфигурация · 9 мин
Как выгрузить запрос в табличный документ в 1С
Как выгрузить результат запроса в табличный документ 1С: методы Выгрузить(), построитель отчёта, заполнение по образцу, примеры кода и типичные ошибки.
Выгрузка результата запроса в табличный документ — типовая задача при разработке отчётов, печатных форм и обменов данными в 1С. Разработчик получает данные запросом, а затем переносит их в объект ТабличныйДокумент, который можно показать пользователю, сохранить в Excel или отправить на печать.
Существует два принципиально разных подхода. Первый — прямое заполнение: вы обходите выборку запроса в цикле и построчно выводите области табличного документа. Второй — автоматический: платформа сама строит таблицу по результату запроса через построитель отчёта или метод Выгрузить() с последующим преобразованием. Выбор зависит от того, нужен ли вам строгий контроль над макетом или достаточно «сырой» таблицы с данными.
Ниже разобраны оба способа с рабочими примерами кода, особенностями группировок, итогов и типичными ошибками, из-за которых табличный документ оказывается пустым или заполненным некорректно.
Что понадобится перед выгрузкой
Для работы потребуются три объекта: сам запрос с текстом и параметрами, табличный документ-приёмник и, при ручном способе, макет с именованными областями. Запрос создаётся конструктором Новый Запрос, табличный документ — Новый ТабличныйДокумент.
Макет удобнее всего хранить в общем макете или в макете обработки/отчёта. В макете создают области: «Шапка» для заголовков колонок, «Строка» для данных и при необходимости «Подвал» для итогов. Имена областей потом используются в коде при выводе.
Способ 1: ручное заполнение через макет и цикл
Это основной и самый гибкий метод. Вы получаете макет, выводите шапку один раз, затем в цикле по выборке заполняете параметры области «Строка» и выводите её в документ. Полный контроль над форматированием, порядком колонок и итогами остаётся у вас.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Код КАК Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));
Пока Выборка.Следующий() Цикл
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьСтрока.Параметры.Товар = Выборка.Товар;
ОбластьСтрока.Параметры.Код = Выборка.Код;
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
ТабДок.Показать("Результат запроса");Ключевые моменты кода: область «Строка» получается заново на каждой итерации цикла, иначе параметры будут затираться или строка не выведется. Имена параметров в макете должны совпадать с именами, которые вы присваиваете через ОбластьСтрока.Параметры.
После заполнения документ показывают методом Показать() либо сохраняют: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Формат указывается явно, иначе платформа использует формат по умолчанию.
- 1Создайте макет с областями Шапка и Строка, задайте параметры в ячейках
- 2Сформируйте запрос и выполните его, получив выборку через Выбрать()
- 3Создайте ТабличныйДокумент и выведите шапку один раз
- 4В цикле получайте область строки, заполняйте параметры и выводите
- 5Покажите документ методом Показать() или сохраните через Записать()
Способ 2: автоматическая выгрузка через построитель отчёта
Если оформление не критично и нужно просто «сбросить» результат запроса в таблицу, используйте объект ПостроительОтчета. Он сам создаст колонки по полям запроса, расставит заголовки и выведет данные без единой строки цикла.
Построитель = Новый ПостроительОтчета;
Построитель.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Код КАК Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Построитель.Выполнить();
ТабДок = Новый ТабличныйДокумент;
Построитель.Вывести(ТабДок);
ТабДок.Показать("Выгрузка запроса");Метод Вывести() построителя формирует таблицу с итогами и оформлением по умолчанию. Колонки можно настроить через коллекцию Построитель.ВыбранныеПоля: порядок, представление, ширину. Это компромисс между скоростью разработки и управляемостью результата.
Сравнение способов
Полный контроль над оформлением, группировками и итогами. Требует макета и больше кода.
Минимум кода, автоматические колонки и итоги. Оформление ограничено возможностями построителя.
Данные без оформления; подходит как промежуточный шаг для обработки, но не для показа пользователю напрямую.
Группировки, итоги и обход результатов
Метод Выбрать() по умолчанию возвращает плоскую детальную выборку. Если запрос содержит итоги (ИТОГИ ПО), для вывода иерархии используют обход по группировкам: Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам). Тогда в цикле доступны записи группировок, а вложенные детальные строки получают через Выборка.Выбрать() внутри внешнего цикла.
Тип записи проверяется свойством Выборка.ТипЗаписи(): детальная запись, итог по группировке или общий итог. Это позволяет выводить разные области макета для групп и строк, например «Группа» и «Строка», — так строят классические отчёты с промежуточными итогами.
Сохранение и вывод результата пользователю
Готовый табличный документ показывают методом Показать(Заголовок) в толстом и тонком клиенте. В управляемых формах документ обычно размещают в реквизите формы типа «ТабличныйДокумент» — тогда он отображается прямо в форме без отдельного окна.
Для сохранения в файл применяют Записать() с указанием типа: XLSX, PDF, MXL, ODS. В серверном коде помните, что интерактивный показ на сервере невозможен — файл формируют на сервере, а открывают или скачивают на клиенте через временное хранилище.
Проверка результата и типичные ошибки
После формирования проверьте: количество выведенных строк совпадает с количеством записей выборки, итоги сходятся с данными запроса, колонки не обрезаны и числа выводятся с нужной точностью. Пустой документ почти всегда означает, что запрос вернул ноль строк или цикл не выполнился.
Как проверить результат
Равно Выборка.Количество() при плоском обходе
Строк меньше — цикл прервался или запрос пуст
Все параметры макета выведены
Пустые ячейки — имена параметров не совпадают
Файл открывается, данные читаемы
Ошибка Записать() — неверный путь или тип файла
FAQ
Чем отличается Выгрузить() от вывода в табличный документ?
Метод Результат.Выгрузить() возвращает таблицу значений или дерево значений — структуру данных в памяти без оформления. Табличный документ — это визуальное представление с форматированием, которое можно показать или напечатать. Часто используют оба: выгружают в таблицу значений для обработки, затем выводят в табличный документ для пользователя.
Можно ли выгрузить запрос в табличный документ без макета?
Да, через ПостроительОтчета: он сам создаёт колонки по полям запроса и выводит данные методом Вывести(). Альтернатива — заполнять ячейки табличного документа напрямую через ТабДок.Область(Строка, Колонка).Текст, но это трудоёмко и подходит только для простых случаев.
Как вывести в табличный документ иерархический запрос с итогами?
Используйте Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам). Внешний цикл обходит группы, внутренний — детальные записи через вложенный Выбрать(). Для групп и строк выводите разные области макета, а тип записи контролируйте методом ТипЗаписи().
Почему табличный документ пустой, хотя запрос выполняется?
Чаще всего запрос возвращает ноль строк из-за условий отбора или незаполненных параметров — проверьте Результат.Пустой и Выборка.Количество() в отладчике. Вторая причина — область макета получена, но не выведена методом Вывести(), либо вывод идёт в другой объект документа.
Как сохранить результат запроса сразу в Excel?
Сформируйте табличный документ любым способом и вызовите ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). На сервере файл записывается во временный каталог, затем передаётся клиенту через ПоместитьВоВременноеХранилище и ПолучитьФайл на клиенте.
Работает ли Показать() в фоновом задании или на сервере?
Нет, интерактивные методы (Показать, Открыть) доступны только на клиенте. В серверном или фоновом коде документ формируют и сохраняют в файл или временное хранилище, а отображение выполняет клиентская часть после завершения серверного вызова.
Что важно запомнить
Для контролируемого вывода используйте макет, цикл по выборке и метод Вывести(); для быстрой выгрузки без оформления — ПостроительОтчета. Проверяйте объём данных перед выводом, получайте области макета внутри цикла и помните, что интерактивный показ возможен только на клиенте.