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