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