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