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

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

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

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

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

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

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

Подготовка запроса и получение результата

Любой вывод начинается с объекта Запрос. Текст запроса задаётся на встроенном языке запросов, параметры передаются через УстановитьПараметр(), выполнение производится методом Выполнить(). Результат — объект РезультатЗапроса, из которого данные извлекаются двумя способами.

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

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Родитель = &Группа";
Запрос.УстановитьПараметр("Группа", ГруппаТоваров);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

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

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

bsl
ТабДок = Новый ТабличныйДокумент;
НомерСтроки = 1;
Пока Выборка.Следующий() Цикл
    ТабДок.Область("R" + НомерСтроки + "C1").Текст = Строка(Выборка.Товар);
    ТабДок.Область("R" + НомерСтроки + "C2").Текст = Выборка.Артикул;
    НомерСтроки = НомерСтроки + 1;
КонецЦикла;
ТабДок.Показать("Результат запроса");

Обратите внимание: свойство Текст ячейки принимает строку, поэтому ссылочные значения нужно явно преобразовывать через Строка(). Для чисел и дат лучше использовать параметры области макета — тогда тип значения сохранится, и в Excel числа останутся числами, а не превратятся в текст.

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

Вывод через макет табличного документа

Для отчётов с оформлением создают макет типа «Табличный документ» в общих макетах или в макете обработки. В макете выделяют именованные области: «Шапка», «Строка», «Подвал». Внутри областей ячейки заполняют параметрами в фигурных скобках — например, [Товар] и [Артикул] с типом заполнения «Параметр».

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

Порядок вывода через макет
  1. 1
    Создайте макет табличного документа с областями Шапка, Строка, Подвал
  2. 2
    В ячейках области Строка задайте параметры в квадратных скобках, например [Товар]
  3. 3
    В коде получите макет: Макет = ПолучитьМакет("МакетОтчета")
  4. 4
    Получите области: ОбластьСтрока = Макет.ПолучитьОбласть("Строка")
  5. 5
    Выведите шапку: ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"))
  6. 6
    В цикле по выборке заполняйте ОбластьСтрока.Параметры.Товар = Выборка.Товар и выводите ТабДок.Вывести(ОбластьСтрока)
  7. 7
    Выведите подвал и покажите документ: ТабДок.Показать()
bsl
Макет = ПолучитьМакет("МакетОтчета");
ТабДок = Новый ТабличныйДокумент;
ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Пока Выборка.Следующий() Цикл
    ОбластьСтрока.Параметры.Заполнить(Выборка);
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
ТабДок.Вывести(Макет.ПолучитьОбласть("Подвал"));
ТабДок.Показать("Отчёт по товарам");

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

Вывод группировок и итогов

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

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

Если группировок больше двух и требуется автоформатирование, рассмотрите систему компоновки данных: СКД сама строит группировки, итоги и оформление, а ручной вывод в табличный документ остаётся оправданным для печатных форм со сложной фиксированной структурой.
ПЗ
Практическое замечание

Сохранение и выгрузка результата

Готовый табличный документ можно не только показать, но и сохранить в файл методом Записать(). Поддерживаются форматы Excel (MXL, XLSX через ТипФайлаТабличногоДокумента.XLSX), PDF, HTML, ODS и другие. На сервере файл пишется во временный каталог, затем передаётся клиенту через ПоместитьВоВременноеХранилище().

bsl
ТабДок.Записать("C:\Temp\report.xlsx", ТипФайлаТабличногоДокумента.XLSX);
// или на сервере с передачей клиенту:
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));

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

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

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

Контрольные точки

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

Количество строк в табличном документе
Норма

Совпадает с числом строк результата запроса в консоли запросов

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

Строк больше — вероятно дублирование из-за соединения в запросе

Числовые ячейки
Норма

Значения выравнены вправо, в Excel распознаются как числа

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

Числа сохранены как текст — значение выводилось через строковое присваивание

Итоговые суммы
Норма

Сходятся с итогом запроса по группировке

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

Итог не сходится — проверьте обход группировок и уровни выборки

Типичные ошибки
01
Имена параметров макета не совпадают с псевдонимами полей запроса — ячейки остаются пустыми без ошибки
02
Вызов Выполнить() внутри цикла вместо одного запроса — резкое падение производительности
03
Вывод ссылочного значения в свойство Текст без преобразования — в ячейке нечитаемое представление
04
Отсутствие проверки РезультатЗапроса.Пустой() — пользователь видит пустой документ без пояснений
05
Формирование табличного документа на сотни тысяч строк — рост памяти и зависание клиента

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

Альтернативы ручному выводу

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

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

Ручной вывод в табличный документ

Полный контроль оформления; подходит для печатных форм. Требует макета и кода обхода, медленнее на больших объёмах

СКД

Автоматические группировки, отборы и оформление; лучший выбор для аналитических отчётов. Сложнее тонкая настройка нестандартных форм

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

Быстро и просто для служебных задач; нет оформления и печатной формы

Прямая запись в Excel/CSV

Подходит для обмена данными; нет интерактивного просмотра внутри 1С

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

Чем отличается Выбрать() от Выгрузить() у результата запроса?

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

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

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

Как вывести результат запроса в Excel без показа пользователю?

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

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

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

Что делать, если табличный документ формируется очень долго?

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

Как сохранить тип числа при выводе, чтобы в Excel можно было считать суммы?

Выводите значения через параметры области макета, а не через строковое свойство Текст ячейки. Параметры сохраняют исходный тип данных, и при записи в XLSX числа и даты остаются числами и датами, доступными для формул.

Итог

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

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