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