В 1С:Предприятие запрос часто воспринимается как инструмент для извлечения данных, но его возможности гораздо шире. Опытные разработчики и аналитики используют запросы не только для выборки, но и как полноценные таблицы-источники — например, в отчетах СКД, компоновщике данных или внешних обработках. Такой подход позволяет гибко манипулировать данными без создания временных таблиц или сложных программных конструкций.
Почему это важно? Во-первых, запрос как источник данных упрощает архитектуру решений, сокращая количество промежуточных объектов. Во-вторых, он дает доступ к мощному синтаксису языка запросов — группировкам, объединениям, подзапросам и виртуальным таблицам — прямо в контексте отчета или обработки. Однако у этого метода есть нюансы: от ограничений на модификацию результата до особенностей работы с большими объемами данных. В этой статье разберем, как правильно оформить запрос для использования в качестве источника, где это уместно, а где лучше выбрать альтернативные способы.
Материал будет полезен как начинающим разработчикам 1С, так и опытным специалистам, которые хотят оптимизировать свои решения. Мы рассмотрим не только базовый синтаксис, но и практические примеры для УТ 11, БП 3.0, ЗУП 3.1, а также типичные ошибки, которые приводят к падению производительности или некорректным результатам.
1. Что значит "запрос как таблица источника" и где это применяется
В классическом понимании таблица источника в 1С — это объект, из которого берутся данные для отчета, обработки или другой процедуры. Обычно в этой роли выступают:
- 📊 Справочники и документы (например,
Справочник.НоменклатураилиДокумент.РеализацияТоваровУслуг) - 🗃️ Регистры накопления/сведений (например,
РегистрНакопления.ТоварыНаСкладах) - 📄 Виртуальные таблицы (например,
Документ.ПоступлениеТоваровУслуг.ОстаткиИОбороты) - 🖥️ Внешние источники (через HTTP-Сервисы или ODBC)
Однако запрос тоже может выступать в роли источника — для этого его результат должен быть структурирован как таблица с колонками и строками. Главное отличие от "обычного" запроса: его не нужно выполнять заранее и сохранять во временную таблицу. Вместо этого вы передаете текст запроса напрямую в механизм, который умеет работать с табличными источниками. Например:
- 📈 В отчетах СКД (через параметр
ИсточникДанных = Запрос) - 🔧 В компоновщике данных (раздел "Настройки → Источники данных")
- 📑 В внешних обработках (через метод
УстановитьДанные(Запрос)) - 🔄 В правилах обмена данными (как источник для выгрузки)
Преимущество такого подхода — динамичность. Вы можете менять логику выборки "на лету", не редактируя структуру отчета или обработки. Например, в зависимости от параметров пользователя формировать разные наборы данных:
ВЫБРАТЬ
Номенклатура.Наименование КАК Товар,
СУММА(РеализацияТоваровУслугКлиент.Количество) КАК Продано
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслугКлиент
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
ПО РеализацияТоваровУслугКлиент.Номенклатура = Номенклатура.Ссылка
ГДЕ
РеализацияТоваровУслугКлиент.Дата МЕЖДУ &НачалоПериода И &КонецПериода
// Динамическое условие по организации
И (&Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
ИЛИ РеализацияТоваровУслугКлиент.Организация = &Организация)
СГРУППИРОВАТЬ ПО
Номенклатура.Наименование
⚠️ Внимание: Не все механизмы 1С поддерживают запросы как источники. Например, в отчетах на основе системы компоновки данных (СКД) это работает, а в стандартных отчетах типа "Анализ субконто" — нет. Всегда проверяйте документацию к конкретной конфигурации.
2. Синтаксис и структура запроса для использования как источника
Чтобы запрос мог выступать таблицей источника, он должен соответствовать нескольким ключевым требованиям:
- Возвращать табличный результат — даже если в выборке одна строка, она должна быть оформлена как таблица с колонками.
- Иметь явные имена колонок — используйте псевдонимы (
КАК) для всех полей, особенно если в запросе есть вычисляемые значения. - Не содержать конструкций, несовместимых с механизмом источника — например,
ОБЪЕДИНИТЬилиПАКЕТНЫЙмогут не поддерживаться.
Базовая структура выглядит так:
ВЫБРАТЬ
Поле1 КАК ИмяКолонки1,
Поле2 КАК ИмяКолонки2,
ВЫРАЗИТЬ(Поле3 КАК СТРОКА) КАК ИмяКолонки3
ИЗ
ИсточникДанных
[ГДЕ Условия]
[СГРУППИРОВАТЬ ПО..]
[УПОРЯДОЧИТЬ ПО..]
Примеры корректных запросов для разных сценариев:
| Сценарий | Пример запроса | Особенности |
|---|---|---|
| Простая выборка из справочника | ВЫБРАТЬ Наименование, Артикул ИЗ Справочник.Номенклатура |
Подходит для отчетов с минимальной обработкой данных. |
| Агрегация по регистру | ВЫБРАТЬ Номенклатура, СУММА(Количество) КАК Остаток ИЗ РегистрНакопления.ТоварыНаСкладах СГРУППИРОВАТЬ ПО Номенклатура |
Требует явного указания СГРУППИРОВАТЬ ПО. |
| Объединение нескольких таблиц | ВЫБРАТЬ Контрагент.Наименование, Договор.Номер КАК НомерДоговора ИЗ Документ.ЗаказПокупателя КАК Заказ ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагент ПО Заказ.Контрагент = Контрагент.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК Договор ПО Заказ.Договор = Договор.Ссылка |
Используйте псевдонимы для всех полей, чтобы избежать конфликтов имен. |
| Динамический запрос с параметрами | ВЫБРАТЬ Дата, Сумма ИЗ Документ.ПоступлениеДенежныхСредств ГДЕ Дата МЕЖДУ &Начало И &Конец |
Параметры (&Начало, &Конец) должны быть заданы до выполнения. |
Например:
- 🚫
ПОМЕСТИТЬ— создает временную таблицу, но сам запрос перестает быть источником. - 🚫
ИНДЕКСИРОВАТЬ ПО— используется для оптимизации, но не поддерживается в СКД. - 🚫
ВЫБРАТЬ РАЗЛИЧНЫЕбезСГРУППИРОВАТЬ ПО— может привести к ошибкам в компоновщике.
3. Примеры использования в отчетах СКД и компоновщике данных
Рассмотрим, как практически применить запрос-источник в системе компоновки данных (СКД) — одном из самых популярных механизмов для построения отчетов в 1С.
Допустим, вам нужно создать отчет по продажам с возможностью фильтрации по периоду, организации и менеджеру. Вместо того чтобы создавать временную таблицу, вы можете передать запрос напрямую:
- Откройте конструктор схемы компоновки данных.
- В разделе
Наборы данныхдобавьте новый набор с типомЗапрос. - В поле
Текствведите запрос:ВЫБРАТЬРеализацияТоваровУслуг.Дата КАК ДатаПродажи,
РеализацияТоваровУслуг.Организация КАК Организация,
РеализацияТоваровУслуг.Менеджер КАК Менеджер,
РеализацияТоваровУслуг.Контрагент КАК Покупатель,
РеализацияТоваровУслугСписок.Номенклатура КАК Товар,
СУММА(РеализацияТоваровУслугСписок.Количество) КАК Количество,
СУММА(РеализацияТоваровУслугСписок.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугСписок
ПО РеализацияТоваровУслуг.Ссылка = РеализацияТоваровУслугСписок.Ссылка
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И (&Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
ИЛИ РеализацияТоваровУслуг.Организация = &Организация)
И (&Менеджер = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)
ИЛИ РеализацияТоваровУслуг.Менеджер = &Менеджер)
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслуг.Дата,
РеализацияТоваровУслуг.Организация,
РеализацияТоваровУслуг.Менеджер,
РеализацияТоваровУслуг.Контрагент,
РеализацияТоваровУслугСписок.Номенклатура
- В разделе
Параметрыдобавьте параметрыНачалоПериода,КонецПериода,ОрганизацияиМенеджер. - Настройте макет отчета, перетащив поля из набора данных в области строк, колонок и ресурсов.
Преимущества такого подхода:
- 🔄 Гибкость — можно быстро менять логику выборки без редактирования структуры отчета.
- ⚡ Производительность — данные извлекаются "на лету" без промежуточного хранения.
- 🛠️ Универсальность — один и тот же запрос можно использовать в разных отчетах.
Однако есть и подводные камни:
- ⏳ Замедление при больших объемах данных — если запрос возвращает десятки тысяч строк, отчет может тормозить.
- 🔄 Ограничения на модификацию результата — в СКД нельзя программно изменить данные после выполнения запроса (например, добавить вычисляемое поле).
Если ваш запрос возвращает много данных, добавьте в него условие ПЕРВЫЕ 1000 на этапе отладки. Это ускорит тестирование и поможет избежать зависаний.
4. Ограничения и типичные ошибки при работе с запросами-источниками
Несмотря на удобство, использование запросов как источников данных накладывает ряд ограничений. Рассмотрим самые распространенные проблемы и способы их решения.
4.1. Ошибки синтаксиса, несовместимые с СКД
Не все конструкции языка запросов поддерживаются в механизме источников. Например:
- 🚫
ОБЪЕДИНИТЬ— может не работать в некоторых версиях платформы. - 🚫
ПАКЕТНЫЙ— не поддерживается в компоновщике данных. - 🚫
ВЫБРАТЬ РАЗРЕШЕННЫЕ— требует прав доступа, но в контексте источника может вызвать ошибку.
Если вы получаете ошибку вида "Недопустимый запрос для набора данных", попробуйте:
- Упростить запрос, разделив его на несколько простых выборок.
- Заменить
ОБЪЕДИНИТЬна подзапросы сИЛИ. - Перенести сложную логику в временную таблицу (если без этого не обойтись).
4.2. Проблемы с производительностью
Запросы-источники могут тормозить, если:
- 🐢 В выборке слишком много строк (например, миллионы записей из регистра накопления).
- 🔄 В запросе используются
ЛЕВОЕ СОЕДИНЕНИЕилиПОЛНОЕ СОЕДИНЕНИЕбез фильтров. - 📊 Есть сложные вычисляемые поля (например, вложенные
ВЫБОРилиВЫРАЗИТЬ).
Решения:
- ✂️ Ограничьте период выборки (например,
ГДЕ Дата > ДобавитьМесяц(ТекущаяДата(), -12)). - 🔍 Используйте индексированные поля в условиях (
ГДЕ Номенклатура В (&СписокТоваров)). - 📊 Разбейте запрос на несколько более простых и объедините результаты в СКД.
⚠️ Внимание: В 1С:Предприятие 8.3.20+ появилась оптимизация для запросов-источников в СКД, но она работает только при соблюдении двух условий:
- Запрос не содержит
ОБЪЕДИНИТЬилиПАКЕТНЫЙ.- Все параметры запроса имеют значения по умолчанию или передаются явно.
Если хотя бы одно условие не выполнено, платформа использует старый механизм выполнения, который может быть медленнее.
4.3. Ошибки с типами данных
Если в запросе есть поля с неявными преобразованиями типов (например, сравнение Число и Строка), это может привести к:
- 🔴 Ошибкам выполнения (
"Типы не совместимы"). - 🟡 Некорректной фильтрации (например,
ГДЕ Сумма = "1000"не сработает).
Всегда явно преобразуйте типы:
ВЫБРАТЬ
ВЫРАЗИТЬ(Поле1 КАК ЧИСЛО(10,2)) КАК ЧисловоеПоле,
ВЫРАЗИТЬ(Поле2 КАК ДАТА) КАК ДатаПоле
ИЗ..
5. Альтернативы: когда запрос-источник не подходит
Несмотря на гибкость, запросы как источники данных не всегда оптимальны. Рассмотрим случаи, когда лучше использовать альтернативные подходы.
| Сценарий | Проблема запроса-источника | Рекомендуемая альтернатива |
|---|---|---|
| Нужно модифицировать данные после выборки (например, добавить вычисляемое поле) | В СКД нельзя программно изменить результат запроса | Создать временную таблицу и обработать данные в модуле |
| Работа с очень большими объемами данных (миллионы строк) | Запрос будет выполняться долго, возможны зависания | Использовать регистры сведений или предварительную агрегацию |
| Нужна сложная логика объединения данных из разных источников | Ограничения на ОБЪЕДИНИТЬ и подзапросы |
Разбить на несколько запросов и объединить в коде |
| Требуется кэширование результатов для повторного использования | Запрос выполняется каждый раз заново | Сохранить результат во временную таблицу или кэш |
Пример альтернативного подхода с временной таблицей:
// 1. Создаем временную таблицу
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Номенклатура.Наименование КАК Товар,
СУММА(Количество) КАК Продано
ИЗ
Документ.РеализацияТоваровУслуг.Товары
СГРУППИРОВАТЬ ПО
Номенклатура.Наименование";
РезультатЗапроса = Запрос.Выполнить();
ВременнаяТаблица = РезультатЗапроса.Выгрузить();
// 2. Добавляем вычисляемое поле (например, категорию товара)
Для Каждого Строка Из ВременнаяТаблица Цикл
Категория = ПолучитьКатегориюТовара(Строка.Товар); // Кастомная функция
Строка.Вставить("Категория", Категория);
КонецЦикла;
// 3. Передаем временную таблицу в отчет
Отчет.СхемаКомпоновкиДанных.НаборыДанных.Добавить("Данные");
Отчет.СхемаКомпоновкиДанных.НаборыДанных.Данные.Заполнить(ВременнаяТаблица);
Когда стоит выбрать временную таблицу вместо запроса-источника:
- 🔄 Нужно модифицировать данные после выборки (добавлять поля, изменять значения).
- 📊 Требуется сложная пост-обработка (например, расчет процентов, ранжирование).
- 💾 Нужно сохранить промежуточные результаты для других процедур.
Как проверить, что лучше
запрос-источник или временная таблица?:
Создайте тестовый отчет с обоими вариантами и замерьте время выполнения для вашего объема данных. В 1С:Предприятие 8.3.18+ для этого можно использовать ПланВырешения.ВключитьИзмерениеВремени(). Обычно запрос-источник выигрывает по скорости для простых выборок (до 10-50 тыс. строк), а временная таблица — для сложной логики или больших объемов.
6. Практические примеры для типовых конфигураций
Разберем реальные примеры использования запросов-источников в популярных конфигурациях 1С.
6.1. УТ 11: Отчет по продажам с детализацией по менеджерам
Задача: показать продажи по менеджерам с возможностью фильтрации по периоду и номенклатуре.
ВЫБРАТЬ
РеализацияТоваровУслуг.Менеджер КАК Менеджер,
РеализацияТоваровУслуг.Дата КАК ДатаПродажи,
РеализацияТоваровУслугСписок.Номенклатура КАК Товар,
СУММА(РеализацияТоваровУслугСписок.Количество) КАК Количество,
СУММА(РеализацияТоваровУслугСписок.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугСписок
ПО РеализацияТоваровУслуг.Ссылка = РеализацияТоваровУслугСписок.Ссылка
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И (&Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ИЛИ РеализацияТоваровУслугСписок.Номенклатура = &Номенклатура)
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслуг.Менеджер,
РеализацияТоваровУслуг.Дата,
РеализацияТоваровУслугСписок.Номенклатура
6.2. БП 3.0: Анализ движения денежных средств
Задача: отчет по поступлениям и расходам с разбивкой по статьям ДДС.
ВЫБРАТЬ
ВЫБОР
КОГДА ДвижениеДенежныхСредств.ВидДвижения = ЗНАЧЕНИЕ(Перечисление.ВидыДвиженияДенежныхСредств.Приход)
ТОГДА "Поступление"
ИНАЧЕ "Расход"
Конец КАК ТипОперации,
ДвижениеДенежныхСредств.СтатьяДвиженияДенежныхСредств КАК СтатьяДДС,
СУММА(ДвижениеДенежныхСредств.Сумма) КАК Сумма,
МАКСИМУМ(ДвижениеДенежныхСредств.Дата) КАК ДатаОперации
ИЗ
РегистрНакопления.ДвижениеДенежныхСредств КАК ДвижениеДенежныхСредств
ГДЕ
ДвижениеДенежныхСредств.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И (&СтатьяДДС = ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПустаяСсылка)
ИЛИ ДвижениеДенежныхСредств.СтатьяДвиженияДенежныхСредств = &СтатьяДДС)
СГРУППИРОВАТЬ ПО
ВЫБОР
КОГДА ДвижениеДенежныхСредств.ВидДвижения = ЗНАЧЕНИЕ(Перечисление.ВидыДвиженияДенежныхСредств.Приход)
ТОГДА "Поступление"
ИНАЧЕ "Расход"
Конец,
ДвижениеДенежныхСредств.СтатьяДвиженияДенежныхСредств
6.3. ЗУП 3.1: Отчет по начислениям и удержаниям
Задача: сводка по начислениям сотрудников за период с детализацией по видам расчета.
ВЫБРАТЬ
НачислениеЗарплаты.Сотрудник КАК Сотрудник,
НачислениеЗарплаты.Период КАК Период,
НачислениеЗарплатыСписок.ВидРасчета КАК ВидРасчета,
СУММА(НачислениеЗарплатыСписок.Сумма) КАК Сумма
ИЗ
Документ.НачислениеЗарплаты КАК НачислениеЗарплаты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.НачислениеЗарплаты.Результаты КАК НачислениеЗарплатыСписок
ПО НачислениеЗарплаты.Ссылка = НачислениеЗарплатыСписок.Ссылка
ГДЕ
НачислениеЗарплаты.Период МЕЖДУ &НачалоПериода И &КонецПериода
И (&Сотрудник = ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка)
ИЛИ НачислениеЗарплаты.Сотрудник = &Сотрудник)
И (&ВидРасчета = ЗНАЧЕНИЕ(Справочник.ВидыРасчета.ПустаяСсылка)
ИЛИ НачислениеЗарплатыСписок.ВидРасчета = &ВидРасчета)
СГРУППИРОВАТЬ ПО
НачислениеЗарплаты.Сотрудник,
НачислениеЗарплаты.Период,
НачислениеЗарплатыСписок.ВидРасчета
Во всех примерах используются:
- 🔹 Параметры (&НачалоПериода, &Сотрудник и др.) для гибкой фильтрации.
- 🔹 Псевдонимы (
КАК) для всех полей — это обязательно для корректной работы в СКД. - 🔹 Группировки для агрегируемых данных (например,
СУММА).
1. Все ли поля имеют