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

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

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

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

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

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

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

Подготовка: запрос, результат и табличный документ

Перед выводом нужны три объекта: сформированный запрос с текстом и параметрами, результат его выполнения и сам табличный документ, куда пойдут данные. Табличный документ создаётся конструктором Новый ТабличныйДокумент либо берётся из реквизита формы с типом «ТабличныйДокумент».

Типовой фрагмент подготовки выглядит так:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Товар,

| Номенклатура.Код КАК Код

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления";

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

ТабДок = Новый ТабличныйДокумент;

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

Быстрый способ: метод Вывести() табличного документа

У объекта «ТабличныйДокумент» есть метод Вывести(), который принимает результат запроса напрямую. Платформа сама строит шапку из имён колонок и выводит все строки результата. Это самый короткий путь, когда оформление не критично.

ТабДок = Новый ТабличныйДокумент;

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

ТабДок.ОтображатьСетку = Истина;

Имена колонок в шапке берутся из псевдонимов полей запроса (то, что указано после КАК). Поэтому задавайте осмысленные псевдонимы на русском языке — они станут заголовками колонок без дополнительной работы.

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

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

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

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

Макет = ПолучитьМакет("МакетОтчета");

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

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

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

Пока Выборка.Следующий() Цикл

ОбластьСтрока.Параметры.Заполнить(Выборка);

ТабДок.Вывести(ОбластьСтрока);

КонецЦикла;

Метод Параметры.Заполнить(Выборка) автоматически сопоставляет параметры макета с полями выборки по именам. Если параметр в макете назван иначе, чем поле запроса, заполняйте его явно: ОбластьСтрока.Параметры.Товар = Выборка.Товар;.

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

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

Если в запросе используется ИТОГИ ПО, выборку следует обходить иерархически: сначала группы, затем детальные записи внутри каждой группы. Для этого в макете добавляются области «Группа» и «Итог».

ВыборкаГруппы = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаГруппы.Следующий() Цикл

ОбластьГруппа.Параметры.Заполнить(ВыборкаГруппы);

ТабДок.Вывести(ОбластьГруппа);

ВыборкаДетали = ВыборкаГруппы.Выбрать();

Пока ВыборкаДетали.Следующий() Цикл

ОбластьСтрока.Параметры.Заполнить(ВыборкаДетали);

ТабДок.Вывести(ОбластьСтрока);

КонецЦикла;

КонецЦикла;

Итоговые значения (суммы, количества) доступны в строках группировки автоматически — их можно выводить в область «Группа» или отдельную область «Подвал» после цикла по детальным записям. Общий итог по документу берите из запроса с ОБЩИЕ итоги либо накапливайте в переменной внутри цикла.

Альтернатива: построитель отчёта и СКД

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

Построитель = Новый ПостроительОтчета;

Построитель.Текст = ТекстЗапроса;

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

Построитель.Вывести(ТабДок);

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

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

ТабДок.Вывести(РезультатЗапроса)

Минимум кода, шапка из псевдонимов. Нет управления форматом и группировками — только служебные выгрузки.

Макет + выборка в цикле

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

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

Автогруппировки и итоги без макета, но ориентирован на обычные формы, в управляемом приложении применяется ограниченно.

СКД

Гибкие настройки для пользователя, стандарт для управляемых форм. Требует схемы компоновки и более объёмного кода вывода.

Типичные ошибки и их устранение

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

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

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

Проверка результата

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

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

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

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

Высота таблицы соответствует числу строк выборки плюс шапка

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

Строк меньше — часть выборки потеряна, или больше — документ не очищен

Заполненность ячеек
Норма

Все колонки содержат значения, даты и числа в правильном формате

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

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

Итоги
Норма

Сумма в подвале равна итогу по запросу с ОБЩИЕ

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

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

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

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

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

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

Да. Метод ТабличныйДокумент.Вывести(РезультатЗапроса) формирует таблицу автоматически: шапка строится из псевдонимов полей запроса, далее выводятся все строки. Оформление при этом минимальное, настроить форматы и ширину колонок нельзя.

Почему параметры в макете выводятся пустыми?

Чаще всего имя параметра в ячейке макета не совпадает с псевдонимом поля запроса. Проверьте, что у ячейки свойство «Заполнение» установлено в «Параметр», а имя параметра посимвольно равно псевдониму после КАК в тексте запроса.

Как вывести запрос с итогами по группам?

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

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

Формирование табличного документа выполняется на сервере. В тонком клиенте готовый документ передаётся в реквизит формы типа «ТабличныйДокумент» и отображается пользователю; методы ПолучитьОбласть и Вывести на клиенте недоступны.

Чем вывод через СКД лучше ручного цикла по выборке?

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

Как избежать дублирования данных при повторном формировании?

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

Итог

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

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