Вывод данных через запросы — основа работы с 1С:Предприятие 8. Без этого навыка невозможно создать отчет, обработать большие массивы информации или интегрировать систему с внешними сервисами. Но если вы только начинаете осваивать язык запросов 1С, даже простая выборка может вызвать сложности: где писать код, как отладить ошибки, почему результат не соответствует ожиданиям?
В этой статье разберем все актуальные способы вывода запросов в 1С — от визуального конструктора для новичков до программного кода для опытных разработчиков. Особое внимание уделим типичным ошибкам (например, почему запрос возвращает пустую таблицу) и оптимизации производительности. Материал актуален для платформы 1С:Предприятие 8.3 и выше, включая последние релизы 2026 года.
1. Способы вывода запросов в 1С: обзор методов
В 1С есть минимум 5 способов выполнить и вывести запрос. Выбор зависит от задачи, уровня подготовки и версии платформы. Рассмотрим каждый подробно:
- 🔧 Конструктор запросов — визуальный инструмент для новичков (доступен в конфигураторе). Позволяет строить запросы без знания синтаксиса, но ограничен по функционалу.
- 💻 Программный код — универсальный метод через объекты
ЗапросиРезультатЗапроса. Подходит для сложных выборок и автоматизации. - 📊 Отчеты и обработки — вывод запросов в пользовательском интерфейсе (например, в
СхемаКомпоновкиДанных). - 🔄 Внешние отчеты — выполнение запросов из файлов
.erfили.epf. - 🌐 HTTP-сервисы — вывод данных запроса в формате JSON/XML для интеграции с веб-приложениями.
Для начинающих рекомендуем начинать с конструктора, но уже на втором этапе осваивать программный код — он дает полный контроль над логикой. Опытные разработчики чаще используют комбинацию методов: например, пишут запрос в коде, а результат визуализируют через схему компоновки данных.
2. Вывод запроса через конструктор (для новичков)
Конструктор запросов в 1С — это графический интерфейс, который автоматически генерирует код на языке запросов. Он полезен для:
- 📚 Обучения синтаксису (можно увидеть, как строятся соединения таблиц).
- 🔍 Быстрого прототипирования простых выборок.
- 🛠 Исправления ошибок в существующих запросах (визуализация структуры).
Чтобы открыть конструктор:
- В конфигураторе перейдите в меню
Файл → Новый → Запрос. - Нажмите кнопку
Конструктор запроса(илиF4). - В окне конструктора добавьте таблицы (например,
Справочник.Номенклатура) и выберите поля. - На вкладке
Условиязадайте фильтры (например,Номенклатура.ПометкаУдаления = Ложь). - Нажмите
ОК— сгенерированный код появится в окне запроса.
Пример кода, сгенерированного конструктором для выборки номенклатуры:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ПометкаУдаления = Ложь
УПОРЯДОЧИТЬ ПО
Наименование
Если конструктор не отображает нужную таблицу (например, регистр накопления), проверьте, что она добавлена в конфигурацию и не скрыта в дереве метаданных.
3. Программный вывод запроса: синтаксис и примеры
Для гибкой работы с запросами в 1С используется объект Запрос. Основные шаги:
- Создать объект запроса:
Запрос = Новый Запрос; - Установить текст запроса:
Запрос.Текст = "ВЫБРАТЬ ..."; - Выполнить запрос:
Результат = Запрос.Выполнить(); - Обработать результат (например, вывести в таблицу).
Пример кода для выборки документов ПоступлениеТоваров за текущий месяц:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваров.Ссылка КАК Ссылка,
| ПоступлениеТоваров.Дата КАК Дата,
| ПоступлениеТоваров.СуммаДокумента КАК Сумма
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| ПоступлениеТоваров.Дата МЕЖДУ &НачалоМесяца И &КонецМесяца";
Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(ТекущаяДата()));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Дата + " | " + Выборка.Сумма);
КонецЦикла;
Ключевые моменты:
- 🔹 Параметры запроса (например,
&НачалоМесяца) защищают от SQL-инъекций и упрощают поддержку кода. - 🔹 Метод
Выбрать()возвращает выборку, по которой можно итерироваться циклом. - 🔹 Для отладки используйте
Сообщить(Запрос.ТекстЗапроса)— он покажет финальный текст с подставленными параметрами.
Что будет, если не указать параметры?
Если в тексте запроса есть параметры (например, &Параметр), но они не установлены через УстановитьПараметр(), платформа выбросит ошибку "Не установлено значение параметра &Параметр".
4. Вывод результата запроса в таблицу (интерактивный пример)
Чаще всего данные запроса нужно показать пользователю в виде таблицы. Для этого используйте объект ТаблицаЗначений или ТабличныйДокумент. Пример вывода в таблицу значений:
Результат = Запрос.Выполнить();
ТаблицаРезультата = Результат.Выгрузить();
// Добавляем колонки (если их нет в результате)
Если НЕ ТаблицаРезультата.Колонки.Найти("Итого") Тогда
ТаблицаРезультата.Колонки.Добавить("Итого", Новый ОписаниеТипов("Число"));
КонецЕсли;
// Заполняем дополнительные данные
Для Каждого Строка Из ТаблицаРезультата Цикл
Строка.Итого = Строка.Количество * Строка.Цена;
КонецЦикла;
// Выводим в форму
ЭлементыФормы.ТаблицаРезультатов.Значение = ТаблицаРезультата;
Для визуализации в ТабличныйДокумент (например, для печати):
ТабДок = Новый ТабличныйДокумент;
ТабДок.Очистить();
Макет = ПолучаемМакет("МакетТаблицы"); // Заранее созданный макет
Область = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Область);
Область = Макет.ПолучитьОбласть("Строка");
Для Каждого Строка Из ТаблицаРезультата Цикл
Область.Параметры.Заполнить(Строка);
ТабДок.Вывести(Область);
КонецЦикла;
Добавить все необходимые колонки в таблицу результата|Проверить типы данных (например, Число вместо Строка для сумм)|Обработать возможные NULL-значения|Настроить форматирование (разделители тысяч, даты и т.д.)|Оптимизировать ширину колонок под данные-->
5. Типичные ошибки и как их избежать
Даже опытные разработчики сталкиваются с ошибками при работе с запросами. Вот самые распространенные:
| Ошибка | Причина | Решение |
|---|---|---|
Поле не найдено (Field not found) |
Опечатка в имени поля или таблицы, либо поле не существует в метаданных. | Проверьте регистр (1С чувствительна к нему!) и существование поля в конфигураторе. |
Недостаточно прав для операции |
У пользователя нет прав на чтение данных или выполнение запроса. | Настройте роли в конфигураторе или используйте ПроверкаПравДоступа(). |
| Пустой результат при очевидно существующих данных | Неверные условия в секции ГДЕ или ошибка в соединении таблиц. |
Выведите текст запроса в сообщение и проверьте логику условий. |
Тип не совпадает (Type mismatch) |
Попытка сравнить данные разных типов (например, строку с числом). | Используйте явное приведение типов: ЧИСЛО(Поле) = 100. |
Особое внимание уделите производительности:
- 🐢 Избегайте
ВЫБРАТЬ *— всегда указывайте только нужные поля. - 🔍 Индексы: запросы работают быстрее, если поля в условиях
ГДЕпроиндексированы (проверьте в конфигураторе). - 📊 Вложенные запросы часто тормозят — замените их на соединения (
ЛЕВОЕ СОЕДИНЕНИЕ).
Если запрос выполняется дольше 5 секунд, скорее всего, проблема в отсутствии индексов или неоптимальной структуре запроса. Используйте ОбъяснитьЗапрос() для анализа плана выполнения.
6. Продвинутые техники: временные таблицы и пакетные запросы
Для сложных выборок в 1С используют:
- 📝 Временные таблицы — позволяют разбить сложный запрос на этапы. Пример:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество
|ПОМЕСТИТЬ ВТ_ИтогиПоНоменклатуре
|ИЗ
| Документ.РеализацияТоваров.Товары КАК Товары
|ГДЕ
| Товары.Ссылка В (&СписокДокументов)
|
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|//////////////////////////////////////////////////
|ВЫБРАТЬ
| Итоги.Номенклатура КАК Номенклатура,
| Итоги.Количество КАК Количество,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| ВТ_ИтогиПоНоменклатуре КАК Итоги
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО Итоги.Номенклатура = Номенклатура.Ссылка";
- 📦 Пакетные запросы — выполнение нескольких запросов в одной транзакции:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ 1 КАК НомерЗапроса, Товары.Номенклатура КАК Данные ИЗ Документ.ПоступлениеТоваров.Товары КАК Товары;
|ВЫБРАТЬ 2 КАК НомерЗапроса, Услуги.Номенклатура КАК Данные ИЗ Документ.ОказаниеУслуг.Услуги КАК Услуги;";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.НомерЗапроса = 1 Тогда
// Обработка товаров
Иначе
// Обработка услуг
КонецЕсли;
КонецЦикла;
Временные таблицы особенно полезны, когда нужно:
- 🔄 Разбить сложную логику на простые шаги.
- 📈 Сохранить промежуточные результаты для повторного использования.
- ⚡ Ускорить выполнение за счет индексирования (
ИНДЕКСИРОВАТЬ ПО).
Временные таблицы существуют только в рамках одного запроса. Если нужно передать данные между разными запросами, используйте ТаблицаЗначений или Массив.
7. Вывод запросов в отчетах и обработках
Для создания пользовательских отчетов в 1С часто используют схему компоновки данных (СКД). Она позволяет:
- 📊 Гибко настраивать группировки, сортировки и условное оформление.
- 🖼 Визуализировать данные в виде диаграмм, сводных таблиц.
- 🔄 Динамически изменять структуру отчета без modificирования кода.
Пример создания отчета с СКД:
Процедура СформироватьОтчет()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Клиент КАК Клиент,
| СУММА(СуммаДокумента) КАК Итого
|ИЗ
| Документ.РеализацияТоваров
|ГДЕ
| Дата МЕЖДУ &НачалоПериода И &КонецПериода
|СГРУППИРОВАТЬ ПО
| Клиент";
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДата()));
// Создаем схему компоновки
СКД = Новый СхемаКомпоновкиДанных;
СКД.ИсточникДанных = Новый ИсточникДанныхНаборДанных(Запрос.Выполнить());
// Настраиваем структуру отчета
Настройки = СКД.НастройкиПоУмолчанию;
Настройки.Структура.Очистить();
Настройки.Структура.Добавить("Клиент");
Настройки.Структура.Добавить("Итого");
// Выводим результат
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(СКД, Настройки);
РезультатКомпоновки = ПроцессорКомпоновки.Выполнить();
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(РезультатКомпоновки);
ТабличныйДокумент.Показать();
КонецПроцедуры
Преимущества СКД:
- 🎨 Гибкое оформление: можно настроить цвета, шрифты, условное форматирование без программирования.
- 🔄 Интерактивность: пользователь может менять группировки и фильтры прямо в отчете.
- 📄 Экспорт: результат легко сохранить в Excel, PDF или другие форматы.
Для сложных отчетов комбинируйте СКД с программным кодом: например, предварительно обработайте данные в запросе, а затем визуализируйте через схему компоновки.
8. Оптимизация и отладка запросов
Медленные запросы — частая проблема в 1С, особенно при работе с большими базами. Вот как ускорить выполнение:
- 🔍 Анализ плана выполнения:
Объяснение = Запрос.ОбъяснитьЗапрос();Сообщить(Объяснение);
Покажет, как платформа выполняет запрос и где "бутылочные горлышки".
- 📊 Индексы: добавьте индексы для полей, используемых в условиях
ГДЕи соединениях. В конфигураторе откройте свойства таблицы и настройте индексирование. - 🗑 Избегайте лишних данных:
- Не используйте
ВЫБРАТЬ *— указывайте только нужные поля. - Ограничивайте период выборки (например,
Дата МЕЖДУ ...).
- Не используйте
- 🔄 Замените вложенные запросы на соединения (
ЛЕВОЕ СОЕДИНЕНИЕ,ВНУТРЕННЕЕ СОЕДИНЕНИЕ).
Для отладки используйте:
- 🐞
Сообщить(Запрос.ТекстЗапроса)— покажет финальный текст с подставленными параметрами. - 📋
Запрос.Выполнить().Выгрузить().Вывести()— быстро посмотрите результат в таблице. - 🔍 Режим отладки в конфигураторе: поставьте точку останова на строке с
Запрос.Выполнить()и проверьте промежуточные значения.
Как ускорить запрос с GROUP BY?
Если запрос с группировкой (СГРУППИРОВАТЬ ПО) выполняется медленно, попробуйте:
1. Добавить индексы на поля группировки.
2. Заменить СУММА() на предварительный расчет в временной таблице.
3. Разбить запрос на части (например, сначала выбрать данные, затем сгруппировать в коде).
⚠️ Внимание: При работе с большими базами (более 100 тыс. записей) избегайте операцийПОДОБНОиВ()с большими списками значений — они тормозят выполнение. ВместоГДЕ Поле В (&Список)используйте временные таблицы.
FAQ: Частые вопросы по запросам в 1С
Как вывести запрос в 1С 7.7? Старые версии поддерживаются?
В 1С:Предприятие 7.7 синтаксис запросов принципиально отличается. Для выборки данных там используется встроенный язык на основе ВЫБРАТЬ, но без объектной модели. Пример:
// 1С 7.7
Запрос = СоздатьОбъект("Запрос");
Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Наименование, | Номенклатура.Артикул |ИЗ Справочник.Номенклатура КАК Номенклатура";
Результат = Запрос.Выполнить();
Пока Результат.Следующий() Цикл
Сообщить(Результат.Наименование);
КонецЦикла;
Обратите внимание: в 7.7 нет многих современных конструкций (например, СГРУППИРОВАТЬ ПО работает иначе). Для новых проектов рекомендуем переходить на 8.3+.
Почему запрос возвращает пустую таблицу, хотя данные есть?
Частые причины:
- Ошибка в условиях: проверьте секцию
ГДЕ. Например, если вы используетеДата = ТекущаяДата(), а в базе нет документов за сегодня, результат будет пустым. Замените наДата МЕЖДУ .... - Неверные соединения таблиц: если используете
ВНУТРЕННЕЕ СОЕДИНЕНИЕ, строки без соответствий исключаются. ПопробуйтеЛЕВОЕ СОЕДИНЕНИЕ. - Права доступа: у пользователя может не хватать прав на чтение данных. Проверьте роли в конфигураторе.
- Пометка удаления: если не указать
ПометкаУдаления = Ложь, в результат попадут и удаленные объекты (или наоборот).
Для диагностики выведите текст запроса в сообщение и выполните его в консоли запросов (Сервис → Консоль запросов в конфигураторе).
Как вывести результат запроса в Excel?
Используйте объект ТабличныйДокумент и методы экспорта:
// 1. Получаем данные запроса
Результат = Запрос.Выполнить();
ТаблицаДанных = Результат.Выгрузить();
// 2. Создаем табличный документ
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучаемМакет("МакетДляExcel");
// 3. Выводим данные
ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапки);
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Для Каждого Строка Из ТаблицаДанных Цикл
ОбластьСтроки.Параметры.Заполнить(Строка);
ТабДок.Вывести(ОбластьСтроки);
КонецЦикла;
// 4. Экспортируем в Excel
ТабДок.Записать("C:\Отчет.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Для гибкой настройки экспорта (например, форматирования ячеек) используйте библиотеку OneScript.Excel или АСТ:Excel.
Можно ли выполнить SQL-запрос напрямую в 1С?
Да, но не рекомендуется. В 1С есть объект Запрос, который транслирует синтаксис 1С в SQL, но прямой SQL-запрос возможен через:
// Только для MS SQL!
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open("Driver={SQL Server};Server=ИМЯ_СЕРВЕРА;Database=ИМЯ_БАЗЫ;UID=ПОЛЬЗОВАТЕЛЬ;PWD=ПАРОЛЬ");
ЗапросSQL = Новый COMОбъект("ADODB.Recordset");
ЗапросSQL.Open("SELECT TOP 10 * FROM _Reference83 (NOLOCK)", Соединение);
Пока НЕ ЗапросSQL.EOF Цикл
Сообщить(ЗапросSQL.Fields("Description").Value);
ЗапросSQL.MoveNext();
КонецЦикла;
⚠️ Опасности прямого SQL:
- Нарушение целостности данных (1С контролирует транзакции на уровне платформы).
- Зависимость от СУБД (код не будет работать с PostgreSQL или файловым вариантом).
- Риск SQL-инъекций.
Используйте этот метод только для администраторских задач (например, восстановления данных) и никогда — в пользовательских формах.
Как вывести запрос в 1С:УТ 11 или 1С:Бухгалтерия 3.0?
В типовой конфигурации (например, 1С:Управление торговлей 11 или 1С:Бухгалтерия 3.0) вывод запросов реализован через:
- Отчеты: используйте стандартные отчеты (например, "Анализ продаж") или создавайте свои через
СхемаКомпоновкиДанных. - Обработки: в меню
Все функции → Обработкиесть готовые обработки для выгрузки данных (например, "Выгрузка данных в Excel"). - Консоль запросов: в конфигураторе (
Сервис → Консоль запросов) можно тестировать запросы без изменения конфигурации.
Пример вывода остатков товаров в УТ 11:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваров.Номенклатура КАК Номенклатура,
| ОстаткиТоваров.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОтчета,) КАК ОстаткиТоваров
|ГДЕ
| ОстаткиТоваров.КоличествоОстаток > 0";
Запрос.УстановитьПараметр("ДатаОтчета", ТекущаяДата());
Результат = Запрос.Выполнить().Выгрузить();
Для типовых конфигураций избегайте прямого изменения объектов — используйте расширения или внешние отчеты.