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