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