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