К статье
Практический материал

Разработка и Конфигурация · 11 мин

Что такое запросы 1С и как с ними работать

Что такое запросы в 1С, как устроен язык запросов, чем он отличается от SQL и как написать первый запрос в консоли. Примеры, ошибки и FAQ.

Запрос в 1С — это способ получить данные из информационной базы: выбрать документы за период, посчитать остатки по складу, собрать обороты по контрагенту. Вместо того чтобы перебирать записи в цикле, разработчик описывает, какие данные нужны, а платформа сама строит обращение к СУБД и возвращает готовую таблицу результата.

Для этого в платформе «1С:Предприятие» существует собственный язык запросов. Внешне он похож на SQL: те же ВЫБРАТЬ, ИЗ, ГДЕ, СГРУППИРОВАТЬ ПО. Но работает он не с физическими таблицами базы данных, а с объектами конфигурации — справочниками, документами, регистрами накопления и сведений. Это принципиально: разработчик мыслит терминами предметной области, а не структурой хранения.

Запросы используются повсюду: в отчётах на СКД, в обработках, в процедурах проведения документов, при заполнении табличных частей, в динамических списках. Понимание языка запросов — базовый навык и для разработчика, и для внедренца, и для продвинутого аналитика, который хочет самостоятельно вытаскивать данные без ожидания программиста.

Что такое запрос 1С и зачем он нужен

Запрос — это декларативное описание выборки. Вы указываете источник данных (например, «Документ.РеализацияТоваровУслуг»), перечисляете нужные поля, задаёте условия отбора и порядок сортировки. Платформа сама решает, как физически получить эти данные: какие таблицы соединить, какие индексы использовать.

Альтернатива запросу — перебор данных встроенными методами: Выбрать(), ПолучитьОбъект(), обход в цикле. Такой подход работает, но на больших объёмах он в разы медленнее: каждая итерация — отдельное обращение к базе. Запрос забирает весь нужный набор одним обращением, поэтому в типовых конфигурациях выборка данных почти всегда делается запросами.

Типичные задачи, которые решаются запросами: получение остатков на дату, подбор документов по отбору, расчёт итогов по группировкам, соединение данных нескольких объектов (например, номенклатуры с ценами и остатками), проверка наличия записей перед записью новых.

Из каких частей состоит текст запроса

Минимальный запрос содержит две секции: ВЫБРАТЬ (какие поля нужны) и ИЗ (откуда их брать). Всё остальное — необязательные секции, которые добавляются по мере усложнения задачи.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Товары.Ссылка КАК Номенклатура,

| Товары.Код

|ИЗ

| Справочник.Номенклатура КАК Товары

|ГДЕ

| Товары.ПометкаУдаления = ЛОЖЬ

|УПОРЯДОЧИТЬ ПО

| Товары.Наименование";

Результат = Запрос.Выполнить().Выгрузить();

Основные секции языка запросов:

  • ВЫБРАТЬ — список полей; можно использовать ПЕРВЫЕ n, РАЗЛИЧНЫЕ, выражения и псевдонимы через КАК;
  • ИЗ — источник: таблица объекта или виртуальная таблица регистра;
  • ГДЕ — условия отбора, включая сравнение с параметром (&Параметр);
  • СГРУППИРОВАТЬ ПО и агрегатные функции СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ;
  • ИМЕЮЩИЕ — отбор уже сгруппированных итогов;
  • УПОРЯДОЧИТЬ ПО — сортировка результата;
  • ИТОГИ ПО — иерархические итоги при обходе результата.

Отдельный мощный механизм — левые, правые и полные соединения нескольких источников (ЛЕВОЕ СОЕДИНЕНИЕ ... ПО условию), а также объединение результатов через ОБЪЕДИНИТЬ ВСЕ. Это позволяет собирать в одном запросе данные, которые логически разнесены по разным объектам.

Виртуальные таблицы регистров

Одна из ключевых особенностей языка запросов 1С — виртуальные таблицы. У регистров накопления и сведений платформа предоставляет готовые «срезы» данных, которые вычисляются на лету: Остатки, Обороты, ОстаткиИОбороты, СрезПоследних, СрезПервых.

Например, чтобы получить текущие остатки товаров по складу, не нужно суммировать все движения вручную — достаточно обратиться к виртуальной таблице РегистрНакопления.ТоварыНаСкладах.Остатки и передать параметры: момент времени и условие отбора. Платформа построит оптимальное обращение к итоговым таблицам.

Виртуальные таблицы — частый источник ошибок производительности. Если вызвать СрезПоследних без параметра периода или соединить её внутри подзапроса для каждой строки, запрос начнёт выполняться неприемлемо долго. Правильный приём — сначала получить срез во временную таблицу с отбором, а потом соединять её с основной выборкой.

Как выполнить запрос и обработать результат

Работа с запросом в коде строится по одному шаблону: создать объект Запрос, записать текст, установить параметры через УстановитьПараметр, выполнить и обработать результат.

Порядок работы с запросом в коде
  1. 1
    Создайте объект: Запрос = Новый Запрос
  2. 2
    Заполните Запрос.Текст текстом на языке запросов
  3. 3
    Установите параметры: Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса())
  4. 4
    Выполните: РезультатЗапроса = Запрос.Выполнить()
  5. 5
    Обработайте: Выгрузить() в таблицу значений или Выбрать() с обходом в цикле

Метод Выполнить() возвращает результат запроса, у которого есть два основных способа обработки. Выгрузить() превращает результат в таблицу значений — удобно для заполнения табличных частей и дальнейшей работы как с коллекцией. Выбрать() возвращает выборку, которую обходят в цикле Пока Выборка.Следующий() Цикл — это экономнее по памяти на больших объёмах.

Если в запросе заданы ИТОГИ ПО, выборку можно обходить иерархически с типом обхода «По группировкам» — так строятся древовидные отчёты без СКД. Проверить, вернул ли запрос хоть что-то, помогает метод РезультатЗапроса.Пустой().

Перед использованием в рабочем коде удобно отладить текст запроса в консоли запросов — внешней обработке, которая позволяет вводить текст, подставлять параметры и сразу видеть результат. Так ошибки синтаксиса и логики отлавливаются за минуты, а не через перезапуск сеанса.
ПЗ
Практическое замечание

Конструктор запроса и консоль запросов

Писать текст вручную не обязательно. В конфигураторе есть визуальный конструктор запроса: правой кнопкой по тексту модуля → «Конструктор запроса». Он позволяет выбрать таблицы и поля мышкой, настроить связи, группировки и итоги, а платформа сама сформирует корректный текст. Это хороший способ изучить синтаксис — смотреть, какой текст генерирует конструктор.

Для отладки на реальных данных используют консоль запросов — популярную внешнюю обработку (существует в нескольких вариантах, в том числе в составе инструментов разработчика). Она показывает результат прямо в базе, позволяет сохранять запросы в файлы и экспериментировать без изменения конфигурации.

Чем отлаживать запрос

Конструктор запроса в конфигураторе

Подходит для написания нового запроса с нуля и изучения синтаксиса. Ограничение: не показывает результат на живых данных.

Консоль запросов (внешняя обработка)

Подходит для отладки на реальных данных и подбора параметров. Требует прав на запуск внешних обработок.

Отладчик конфигуратора

Подходит, когда запрос уже встроен в код и нужно проверить параметры и результат в контексте выполнения процедуры.

Где запросы применяются на практике

Самое массовое применение — отчёты на системе компоновки данных (СКД). В основе любого отчёта на СКД лежит набор данных, чаще всего — именно запрос. СКД добавляет к нему настройки отборов, группировок и оформления, но качество отчёта определяется качеством исходного запроса.

Вторая область — проведение документов. При проведении документ запросами читает остатки (например, для контроля отрицательных остатков), а затем формирует движения по регистрам. Третья — динамические списки: произвольный запрос списка позволяет показывать пользователю данные из нескольких источников сразу.

Также запросы используются в обработках загрузки и выгрузки данных, при заполнении документов по остаткам, в регламентных заданиях пересчёта показателей и во временных таблицах сложной логики через менеджер временных таблиц.

Типичные ошибки и ограничения

Типичные ошибки при работе с запросами
01
Запрос в цикле: выполнение запроса на каждой итерации обхода — главная причина медленного кода. Решение: один запрос с соединениями или временными таблицами.
02
Отбор по виртуальной таблице в секции ГДЕ вместо параметров — сначала вычисляется весь срез, потом отбрасывается лишнее.
03
Соединение без условия или с неполным условием — декартово произведение строк, результат раздувается и искажает итоги.
04
Использование * (все поля) вместо явного списка — лишний трафик и хрупкость при изменении конфигурации.
05
Сравнение с NULL через равенство: NULL не равен ничему, нужна проверка ЕСТЬ NULL — иначе строки молча теряются.

Важно понимать ограничения языка. Запрос 1С только читает данные: изменить записи запросом нельзя, для записи используются объекты и наборы записей. Нет произвольных функций над строками уровня SQL — набор встроенных функций (ПОДСТРОКА, РАЗНОСТЬДАТ, НАЧАЛОПЕРИОДА и другие) фиксирован платформой.

Ещё одна граница — права доступа. Запрос выполняется с учётом RLS и прав пользователя: если у пользователя нет прав на объект, запрос вернёт пустой результат или ошибку. В привилегированном модуле отбор по правам отключается, что нужно учитывать при проектировании.

Как проверить, что запрос работает правильно

Контрольные точки

Контрольные точки проверки запроса

Количество строк результата
Норма

Совпадает с ожиданием по тестовым данным (например, числу документов за день)

Тревожный признак

Строк больше ожидаемого — вероятно, лишнее соединение; меньше — потеря из-за NULL или жёсткого отбора

Итоговые суммы
Норма

Сходятся со стандартным отчётом по тем же данным

Тревожный признак

Суммы задвоены — соединение с таблицей, где несколько строк на ключ

Время выполнения
Норма

Запрос на рабочем объёме выполняется за секунды

Тревожный признак

Запрос «висит» — проверьте параметры виртуальных таблиц и запросы в цикле

Самый надёжный способ валидации — сверка с штатным отчётом конфигурации по тем же данным и периоду. Если ваш запрос по оборотам даёт те же итоги, что и типовой отчёт, логика с высокой вероятностью корректна.

FAQ

Чем язык запросов 1С отличается от SQL?

Синтаксис похож, но 1С-запрос работает с объектами конфигурации и виртуальными таблицами, а не с физическими таблицами СУБД. Платформа сама транслирует его в SQL конкретной СУБД. Прямой доступ к базе средствами SQL в обход платформы не поддерживается и небезопасен для целостности данных.

Можно ли изменить данные запросом?

Нет. Язык запросов предназначен только для чтения. Для изменения данных используются объектные методы: ПолучитьОбъект(), запись наборов записей регистров, проведение документов.

Что такое параметр запроса и зачем он нужен?

Параметр — это значение, подставляемое в текст запроса через символ & (например, &Дата). Он задаётся методом УстановитьПараметр до выполнения. Параметры делают запрос универсальным и защищают от ошибок конкатенации строк с данными пользователя.

Чем Выгрузить() отличается от Выбрать()?

Выгрузить() возвращает всю таблицу результата в память как таблицу значений — удобно, но затратно на больших объёмах. Выбрать() возвращает выборку для последовательного обхода в цикле, что экономит память при обработке миллионов строк.

Почему запрос с СрезПоследних работает медленно?

Чаще всего потому, что не заданы параметры виртуальной таблицы (период и условие) или срез вычисляется внутри соединения для каждой строки. Вынесите срез во временную таблицу с отбором по нужным измерениям и соединяйте уже её.

Нужно ли знать SQL, чтобы писать запросы в 1С?

Не обязательно, но полезно. Базовые конструкции совпадают, поэтому знание SQL ускоряет освоение. Обратное тоже верно: опыт запросов 1С даёт понимание выборок, соединений и группировок, переносимое на SQL.

Итог

Что важно запомнить

Запрос 1С — декларативное описание выборки данных из объектов конфигурации, которое платформа превращает в обращение к СУБД. Освойте секции ВЫБРАТЬ/ИЗ/ГДЕ, параметры, виртуальные таблицы регистров и правило «один запрос вместо цикла» — этого достаточно для большинства практических задач. Отлаживайте текст в консоли запросов и сверяйте итоги с типовыми отчётами.