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