Разработка и Конфигурация · 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. Этот путь подходит пользователям без прав разработчика.
- 1Откройте консоль запросов или универсальный отчёт
- 2Вставьте текст запроса и заполните параметры
- 3Выполните запрос и проверьте результат на экране
- 4Выведите результат в табличный документ
- 5Сохраните через Файл → Сохранить копию в формате XLSX
- 6Откройте файл в Excel и проверьте количество строк и итоги
Частые ошибки при выгрузке запроса
Самая распространённая ошибка — обращение к колонке таблицы значений по имени, которого нет в результате запроса. Имена колонок совпадают с псевдонимами полей в запросе (то, что после КАК). Если псевдоним не задан, платформа присваивает имя автоматически, и оно может не совпасть с ожиданиями. Всегда задавайте псевдонимы явно.
Вторая типичная проблема — выгрузка полей с составным типом или полей типа «ХранилищеЗначения» с последующей попыткой вывести их в табличный документ: в ячейке появится нечитаемое представление. Такие поля нужно преобразовывать перед выводом.
Третья группа ошибок связана с дублированием строк: при соединении таблиц без корректного условия результат размножается, и выгруженная таблица содержит больше строк, чем ожидалось. Проверяйте количество строк и итоговые суммы сразу после выполнения.
Проверка результата после выгрузки
После выгрузки убедитесь, что таблица содержит ожидаемые данные. Минимальный набор проверок: количество строк (ТаблицаТоваров.Количество()), наличие нужных колонок (ТаблицаТоваров.Колонки.Найти("Товар")), контрольная сумма по числовой колонке (ТаблицаТоваров.Итог("Сумма")), которую можно сверить с другим отчётом.
При выгрузке в Excel сверьте число строк в файле с числом строк результата запроса и проверьте, не обрезались ли длинные строки и корректно ли перенеслись даты и числа — при вставке через буфер обмена Excel иногда меняет форматы.
Как проверить результат
Совпадает с ожидаемым по логике запроса
Строк намного больше — вероятно, ошибка в соединениях
Совпадают с псевдонимами после КАК в тексте запроса
Колонки вида Поле1, Поле2 — псевдонимы не заданы
Сходится с контрольным отчётом по тем же данным
Сумма завышена кратно — дублирование строк
Все строки на месте, форматы дат и чисел корректны
Часть данных потеряна или преобразована в текст
FAQ
Чем таблица значений отличается от дерева значений при выгрузке запроса?
Таблица значений — плоский набор строк с колонками. Дерево значений — иерархическая структура, где у строк могут быть подчинённые строки. Метод Выгрузить() с параметром ПоГруппировкам возвращает дерево, без параметра — таблицу. Дерево обходится рекурсивно через коллекцию Строки каждой строки.
Как выгрузить результат запроса в Excel из кода без показа пользователю?
Сформируйте табличный документ программно или через СКД, затем вызовите ТабДок.Записать() с типом файла XLSX. Метод работает на сервере, показывать документ пользователю не обязательно. Убедитесь, что у процесса сервера есть права на запись в целевой каталог.
Почему после Выгрузить() в таблице нет колонки, которая есть в запросе?
Скорее всего, у поля не задан псевдоним, и платформа сгенерировала имя автоматически, либо поле продублировано и одно из них переименовано. Проверьте состав колонок через цикл по ТаблицаРезультата.Колонки и задайте явные псевдонимы через КАК для всех полей запроса.
Можно ли выгрузить в таблицу только часть строк результата?
Да. Ограничьте выборку на уровне запроса конструкцией ПЕРВЫЕ N — это эффективнее всего. Либо после выгрузки используйте НайтиСтроки() с отбором или скопируйте часть строк методом Скопировать() с параметром отбора.
Что делать, если запрос выполняется слишком долго для выгрузки?
Проверьте индексы по полям соединений и отборов, уберите соединения с виртуальными таблицами без отборов, замените вложенные запросы временными таблицами. Для диагностики используйте консоль запросов с замером времени или технологический журнал. Выгрузка результата — не причина медленной работы, узкое место почти всегда в самом запросе.
Как передать выгруженную таблицу значений между сервером и клиентом?
Таблица значений напрямую не сериализуется между клиентом и сервером в тонком клиенте. Используйте реквизит формы типа «ТаблицаЗначений» с передачей через параметры, либо преобразуйте таблицу в массив структур, либо поместите данные во временное хранилище через ПоместитьВоВременноеХранилище().
Что важно запомнить
Основной способ выгрузки запроса в таблицу — Запрос.Выполнить().Выгрузить(), результатом будет таблица значений, а при итогах по группировкам — дерево значений. Для больших выборок используйте Выбрать() вместо Выгрузить(), для вывода в Excel — табличный документ с методом Записать() или консоль запросов. Всегда задавайте псевдонимы полей и проверяйте количество строк и итоги после выгрузки.