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

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

Как выгрузить запрос в таблицу 1С

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

Выгрузка запроса в таблицу — одна из базовых операций при разработке в 1С: результат запроса сам по себе — это временная выборка, и чтобы работать с данными дальше (обходить строки в цикле, сортировать, сворачивать, передавать между процедурами), её нужно преобразовать в таблицу значений. Для этого используется метод Выгрузить() объекта «РезультатЗапроса».

Задача встречается в двух разных контекстах. Разработчику нужно получить таблицу значений в коде для программной обработки. Пользователю или аналитику нужно вывести результат запроса в табличный документ и сохранить его в Excel. Оба сценария разбираются ниже с примерами кода.

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

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

Стандартная последовательность: создать объект «Запрос», задать текст, установить параметры, выполнить и выгрузить результат. Метод Выгрузить() без параметров возвращает таблицу значений с плоской структурой строк.

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

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

"ВЫБРАТЬ

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

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

|ИЗ

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

|ГДЕ

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

ТаблицаТоваров = Запрос.Выполнить().Выгрузить();

Для Каждого СтрокаТаблицы Из ТаблицаТоваров Цикл

Сообщить(СтрокаТаблицы.Код + " — " + СтрокаТаблицы.Товар);

КонецЦикла;

Полученная таблица значений поддерживает типовые операции: Найти(), НайтиСтроки(), Сортировать(), Свернуть(), Скопировать(), итоги по колонкам через Итог(). Это удобнее, чем повторный обход выборки, когда к одним и тем же данным нужно обращаться несколько раз.

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

Выбор между Выгрузить() и Выбрать()

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

КритерийВыгрузить() в таблицу значенийВыбрать() в выборку
ПамятьВесь результат в памятиПострочное чтение
Повторный обходДа, сколько угодно разНет, только один проход
Сортировка и поискСортировать(), Найти(), Свернуть()Недоступны
Случайный доступПо индексу строкиТолько последовательно
Крупные выборкиРиск нехватки памятиПредпочтительный вариант

Практическое правило: если данные нужно обойти один раз и сразу обработать — используйте выборку. Если нужен многократный доступ, сортировка, свёртка или передача данных между процедурами — выгружайте в таблицу значений.

Маршрут решения

Как выбрать способ

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

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

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

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

ТаблицаТоваров = Запрос.Выполнить().Выгрузить();

НомерСтроки = 1;

Для Каждого СтрокаТаблицы Из ТаблицаТоваров Цикл

ТабДок.Область("R" + НомерСтроки + "C1").Текст = Строка(СтрокаТаблицы.Код);

ТабДок.Область("R" + НомерСтроки + "C2").Текст = Строка(СтрокаТаблицы.Товар);

НомерСтроки = НомерСтроки + 1;

КонецЦикла;

ТабДок.Показать("Результат запроса");

Для регулярных отчётов ручной вывод ячеек неудобен — используйте макет с областями и методы ПолучитьОбласть() / Вывести(), либо схему компоновки данных, где запрос задаётся в наборе данных, а вывод формируется автоматически с группировками, отборами и оформлением.

Сохранение табличного документа в файл выполняется методом Записать() с указанием типа файла: ТабДок.Записать("C:\Temp\result.xlsx", ТипФайлаТабличногоДокумента.XLSX). Поддерживаются форматы XLSX, MXL, PDF, HTML, ODS и другие.

Выгрузка запроса в Excel через консоль запросов

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

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

Альтернатива без внешних обработок — отчёт «Универсальный отчёт» в типовых конфигурациях или любой отчёт на СКД: результат формируется как табличный документ, который сохраняется через «Файл → Сохранить копию» в формате Excel. Этот путь подходит пользователям без прав разработчика.

Выгрузка запроса в Excel без программирования
  1. 1
    Откройте консоль запросов или универсальный отчёт
  2. 2
    Вставьте текст запроса и заполните параметры
  3. 3
    Выполните запрос и проверьте результат на экране
  4. 4
    Выведите результат в табличный документ
  5. 5
    Сохраните через Файл → Сохранить копию в формате XLSX
  6. 6
    Откройте файл в Excel и проверьте количество строк и итоги

Частые ошибки при выгрузке запроса

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

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

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

Типичные ошибки
01
Обращение к колонке по имени поля вместо псевдонима из КАК — ошибка «Поле не найдено»
02
Выгрузка миллионов строк через Выгрузить() — нехватка памяти и аварийное завершение
03
Ожидание таблицы значений при запросе с ИТОГИ ПО — фактически возвращается дерево значений
04
Соединение без условия — декартово произведение и раздутый результат
05
Вывод ХранилищеЗначения в табличный документ — мусор вместо данных

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

После выгрузки убедитесь, что таблица содержит ожидаемые данные. Минимальный набор проверок: количество строк (ТаблицаТоваров.Количество()), наличие нужных колонок (ТаблицаТоваров.Колонки.Найти("Товар")), контрольная сумма по числовой колонке (ТаблицаТоваров.Итог("Сумма")), которую можно сверить с другим отчётом.

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

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

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

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

Совпадает с ожидаемым по логике запроса

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

Строк намного больше — вероятно, ошибка в соединениях

Имена колонок
Норма

Совпадают с псевдонимами после КАК в тексте запроса

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

Колонки вида Поле1, Поле2 — псевдонимы не заданы

Итог по суммовой колонке
Норма

Сходится с контрольным отчётом по тем же данным

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

Сумма завышена кратно — дублирование строк

Файл Excel после сохранения
Норма

Все строки на месте, форматы дат и чисел корректны

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

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

FAQ

Чем таблица значений отличается от дерева значений при выгрузке запроса?

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

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

Сформируйте табличный документ программно или через СКД, затем вызовите ТабДок.Записать() с типом файла XLSX. Метод работает на сервере, показывать документ пользователю не обязательно. Убедитесь, что у процесса сервера есть права на запись в целевой каталог.

Почему после Выгрузить() в таблице нет колонки, которая есть в запросе?

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

Можно ли выгрузить в таблицу только часть строк результата?

Да. Ограничьте выборку на уровне запроса конструкцией ПЕРВЫЕ N — это эффективнее всего. Либо после выгрузки используйте НайтиСтроки() с отбором или скопируйте часть строк методом Скопировать() с параметром отбора.

Что делать, если запрос выполняется слишком долго для выгрузки?

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

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

Таблица значений напрямую не сериализуется между клиентом и сервером в тонком клиенте. Используйте реквизит формы типа «ТаблицаЗначений» с передачей через параметры, либо преобразуйте таблицу в массив структур, либо поместите данные во временное хранилище через ПоместитьВоВременноеХранилище().

Итог

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

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