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

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

Запросы в 1С: что это значит и как их использовать

Что такое запросы в 1С простыми словами: язык запросов, консоль запросов, обходы, соединения таблиц, типичные ошибки и способы проверить результат.

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

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

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

Что такое запрос в 1С и где он используется

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

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

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

Базовый запрос состоит из обязательных секций. Секция ВЫБРАТЬ перечисляет поля, ИЗ указывает источник данных, ГДЕ задаёт условия отбора. Дополнительно используются СГРУППИРОВАТЬ ПО для агрегации, УПОРЯДОЧИТЬ ПО для сортировки, ИТОГИ для подведения итогов и СОЕДИНЕНИЕ для связи нескольких таблиц.

Важные особенности синтаксиса: ключевые слова пишутся по-русски (допустимы и английские аналоги — SELECT, FROM, WHERE), параметры обозначаются символом «&», виртуальные таблицы регистров вызываются с параметрами в скобках, например РегистрНакопления.Продажи.Обороты(&Начало, &Конец).

ВЫБРАТЬ

Продажи.Номенклатура,

СУММА(Продажи.Количество) КАК Количество

ИЗ

РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК Продажи

СГРУППИРОВАТЬ ПО

Продажи.Номенклатура

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

Количество УБЫВ

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

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

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

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

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ НЕ ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

// обработка строки

КонецЦикла;

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

Порядок написания первого запроса
  1. 1
    Определите, из какого объекта нужны данные: справочник, документ или регистр
  2. 2
    Откройте консоль запросов или конструктор запроса в конфигураторе
  3. 3
    Выберите таблицу-источник и нужные поля
  4. 4
    Добавьте отбор через ГДЕ и параметры через &
  5. 5
    Выполните запрос в консоли и проверьте результат на тестовых данных
  6. 6
    Перенесите текст в модуль и установите параметры программно

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

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

Консоль запросов — отдельная внешняя обработка, которая выполняет запрос прямо в пользовательской базе и показывает результат. Она незаменима для отладки: можно проверить текст на реальных данных, подобрать отборы и убедиться, что запрос возвращает именно то, что ожидалось, до переноса в код.

Виртуальные таблицы и соединения

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

Соединения связывают несколько таблиц: ЛЕВОЕ СОЕДИНЕНИЕ сохраняет все строки левой таблицы, ВНУТРЕННЕЕ — только совпадающие. Классическая ошибка — соединение без полного условия связи, которое даёт декартово произведение и раздувает результат в разы.

Типичные ошибки в запросах
01
Соединение без условия или с неполным условием — результат умножается, отчёт показывает неверные суммы
02
Обращение к таблице документов вместо виртуальной таблицы регистра — медленная выборка и лишние данные
03
Отбор по полю через точку после соединения вместо параметра виртуальной таблицы — фильтрация выполняется после выборки, запрос тормозит
04
Использование выборки внутри цикла по другой выборке — запрос к базе на каждой итерации
05
Забытый параметр периода в виртуальной таблице — расчёт за всё время вместо нужного интервала

Производительность и безопасная работа с запросами

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

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

Чем запрос отличается от СКД и динамического списка

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

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

Сравнение инструментов выборки данных

Объект Запрос

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

СКД

Отчёты с пользовательскими настройками. Не подходит для изменения данных в транзакции

Динамический список

Списки в формах с автообновлением. Ограниченный набор конструкций языка запросов

Часто задаваемые вопросы

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

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

Что означает символ «&» в тексте запроса?

Это параметр запроса. Перед выполнением каждому параметру нужно присвоить значение методом УстановитьПараметр("Имя", Значение), иначе запрос завершится с ошибкой.

Почему запрос в консоли работает, а в отчёте нет?

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

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

Нет, язык запросов 1С предназначен только для чтения. Изменение выполняется через объектную модель: получить объект, изменить реквизиты и записать. Запрос при этом используется для поиска нужных объектов.

Что такое пакетный запрос?

Это несколько запросов в одном тексте, разделённых точкой с запятой, с промежуточными временными таблицами (ПОМЕСТИТЬ). Метод ВыполнитьПакет возвращает массив результатов. Пакеты удобны для сложной выборки в несколько этапов.

Как понять, что запрос работает медленно?

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

Итог

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

Запрос в 1С — это способ выбрать данные из объектов конфигурации на встроенном языке, похожем на SQL. Осваивайте его через конструктор и консоль запросов, фильтруйте данные параметрами виртуальных таблиц и проверяйте результат на копии базы.