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

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

Как вывести данные из запроса в 1С

Разбираем способы вывода данных из запроса 1С: обход выборки, выгрузка в таблицу значений, вывод в табличный документ и на форму. Примеры кода и типичные ошибки.

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

Базовая последовательность всегда одинакова: создаётся объект Запрос, задаётся текст на языке запросов, при необходимости устанавливаются параметры, затем вызывается метод Выполнить(). Результат — объект РезультатЗапроса, из которого данные извлекаются методами Выбрать() или Выгрузить(). Именно на этом этапе чаще всего возникают ошибки у начинающих разработчиков.

Ниже разобраны все основные сценарии вывода с готовыми примерами кода, которые можно адаптировать под любую конфигурацию — от «Управления торговлей» до самописных решений на управляемых формах.

Как выполнить запрос и получить результат

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

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

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

"ВЫБРАТЬ

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

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

|ИЗ

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

|ГДЕ

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

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

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

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

Сообщить(Выборка.Наименование);

КонецЦикла;

Обращение к полям выборки идёт по именам, заданным в секции ВЫБРАТЬ (или через псевдонимы после КАК). Если поля с таким именем нет, платформа выдаст ошибку «Поле не найдено», поэтому псевдонимы лучше задавать явно и осмысленно.

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

Обход выборки: линейный, по группировкам и иерархический

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

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

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

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

Сообщить("Склад: " + ВыборкаПоСкладам.Склад);

Детали = ВыборкаПоСкладам.Выбрать();

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

Сообщить(" " + Детали.Товар + " — " + Детали.Количество);

КонецЦикла;

КонецЦикла;

Для иерархических справочников используется обход ПоГруппировкамСИерархией совместно с ИТОГИ ПО ... ТОЛЬКО ИЕРАРХИЯ в тексте запроса. Это позволяет вывести дерево подразделений или групп товаров с сохранением вложенности.

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

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

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

ТаблицаТоваров.Сортировать("Наименование");

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

Сообщить(Строка.Наименование);

КонецЦикла;

Если запрос содержит итоги по группировкам, Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам) вернёт дерево значений, где у строк есть подчинённые строки. Дерево удобно выводить в элемент формы «Дерево» — например, структуру заказов по контрагентам.

Помните об ограничении: выгрузка большого результата (сотни тысяч строк) целиком в память может привести к заметному потреблению ресурсов сервера. Для массовых обработок лучше использовать обход выборки порциями или пакетные запросы.

Выбор способа обработки результата

Выборка (Выбрать)

Подходит для построчной обработки и больших объёмов; не позволяет вернуться к предыдущим строкам и сортировать после выполнения.

Таблица значений (Выгрузить)

Подходит для сортировки, поиска, свёртки и передачи между процедурами; расходует память пропорционально объёму данных.

Дерево значений

Подходит для иерархических данных и вывода в элемент формы Дерево; требует итогов в тексте запроса.

Вывод данных в табличный документ для печати

Стандартный способ показать результат пользователю на печать — табличный документ с макетом. Макет создаётся в конфигураторе, в нём выделяются именованные области: «Шапка», «Строка», «Подвал». Программно области получают методом Макет.ПолучитьОбласть(), заполняют параметры и выводят.

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

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

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

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

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

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

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

ОбластьСтрока.Параметры.Товар = Выборка.Товар;

ОбластьСтрока.Параметры.Количество = Выборка.Количество;

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

КонецЦикла;

ТабДок.Показать("Отчёт по товарам");

Параметры области заполняются по именам, заданным в макете. Если имя параметра в коде не совпадает с макетом, значение просто не подставится — ошибки платформа не выдаст, поэтому пустые ячейки на печати чаще всего означают именно опечатку в имени параметра.

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

Порядок вывода запроса в табличный документ
  1. 1
    Создайте макет табличного документа и выделите области Шапка, Строка, Подвал
  2. 2
    В макете задайте параметры в ячейках через свойство Заполнение = Параметр
  3. 3
    В коде выполните запрос и получите выборку
  4. 4
    Получите области макета и в цикле заполняйте параметры из полей выборки
  5. 5
    Выведите области в табличный документ и вызовите Показать()
  6. 6
    Проверьте печатную форму на данных с длинными наименованиями и пустыми значениями

Вывод результата на управляемую форму

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

&НаСервере

Процедура ЗаполнитьТоварыНаСервере()

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

Запрос.Текст = "ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура";

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

КонецПроцедуры

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

Частая проблема — вызов серверной процедуры из клиентского контекста с передачей результата запроса. Результат запроса и выборка не сериализуются между клиентом и сервером, поэтому передавать нужно уже выгруженную таблицу значений или массив структур.

Выгрузка результата во внешние файлы и консоль запросов

Для передачи данных за пределы 1С таблицу значений сохраняют в файл. Простейший вариант — вывести результат в табличный документ и сохранить его как Excel: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Для обмена между системами таблицу сериализуют через ЗначениеВСтрокуВнутр() либо формируют CSV или XML построчной записью.

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

Конструктор запроса в конфигураторе (правый клик по тексту запроса → «Конструктор запроса») помогает собрать текст визуально и сразу увидеть имена полей и псевдонимы, что снижает количество ошибок обращения к полям выборки.

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

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

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

Итог

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

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

Чем отличается Выбрать() от Выгрузить()?

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

Почему запрос выполняется, но выборка пустая?

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

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

Выведите данные в табличный документ через макет или программное добавление строк, затем вызовите метод Записать с типом файла XLSX. Альтернатива — построчная запись в CSV через объект ТекстовыйДокумент, что быстрее для больших объёмов, но без форматирования.

Можно ли вывести результат запроса напрямую в сообщение пользователю?

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

Как вывести иерархические данные из запроса?

Добавьте в текст запроса итоги по иерархии (ИТОГИ ПО Поле ТОЛЬКО ИЕРАРХИЯ), затем используйте Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией) с вложенными выборками либо Выгрузить с тем же типом обхода для получения дерева значений, которое можно показать в элементе формы «Дерево».

Почему в печатной форме пустые ячейки, хотя запрос возвращает данные?

Почти всегда причина в несовпадении имён параметров макета с именами, которые заполняются в коде, либо в том, что в макете у ячейки не установлено свойство Заполнение = Параметр. Платформа в этом случае не выдаёт ошибку — значение просто не подставляется.