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

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

Зачем нужны запросы в 1С и как их использовать

Зачем нужны запросы в 1С, как работает язык запросов, где он применяется: отчёты, выборки данных, динамические списки. Примеры и типичные ошибки.

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

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

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

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

Язык запросов — это декларативный язык, встроенный в платформу 1С:Предприятие. Он описывает, какие данные нужны, а не как их физически получать. Платформа сама транслирует текст запроса в SQL для конкретной СУБД (MS SQL Server, PostgreSQL, Oracle, IBM Db2 или файловый вариант) и оптимизирует выполнение.

Ключевое отличие от «чистого» SQL — работа с метаданными. Вместо имени физической таблицы указывается объект конфигурации: Справочник.Номенклатура, Документ.РеализацияТоваровУслуг, РегистрНакопления.ТоварыНаСкладах.Остатки. Платформа предоставляет виртуальные таблицы — Остатки, Обороты, СрезПоследних, СрезПервых, — которые автоматически агрегируют данные регистров, и писать группировки вручную не требуется.

Запрос предназначен только для чтения данных. Изменить записи через него нельзя — для этого используются объекты встроенного языка (ДокументОбъект, СправочникОбъект, наборы записей). Это важное ограничение, которое защищает базу от случайной порчи данных через механизм выборки.

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

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

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

Даже если разработчик пишет код «напрямую» через методы объектов, платформа внутри всё равно формирует запросы к СУБД. Явное использование запроса даёт контроль над этим процессом и позволяет получить ровно те поля и итоги, которые нужны задаче.

Как устроен запрос: минимальный пример

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

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

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

"ВЫБРАТЬ

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

| ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК ТоварыНаСкладахОстатки

|ГДЕ

| ТоварыНаСкладахОстатки.КоличествоОстаток > 0";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());

Запрос.УстановитьПараметр("Склад", Склад);

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

Обратите внимание на параметры &Период и &Склад: они передаются в виртуальную таблицу Остатки. Это принципиально важно — фильтрация выполняется на стороне СУБД до выборки, а не после неё. Тот же отбор, помещённый в секцию ГДЕ по итоговой таблице, заставит сначала рассчитать остатки по всем складам, а потом отбросить лишнее.

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

Почему запрос быстрее обхода в цикле

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

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

КритерийЗапросОбход объектов в цикле
Обращения к БДОдноНа каждую запись
Отбор данныхНа стороне СУБДВ коде, после чтения
Итоги и группировкиСчитает СУБДСчитает код вручную
Чтение полейТолько указанныеОбъект целиком
Изменение данныхНевозможноВозможно через объект

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

Как получить данные

Запрос с выборкой

Подходит для чтения больших объёмов, итогов, отчётов. Ограничение — только чтение, нельзя менять данные.

Обход объектов в цикле

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

СКД с набором «Запрос»

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

Типовые сценарии использования

Контроль остатков при проведении

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

Отчёт по продажам за период

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

Поиск дублей в справочнике

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

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

Безопасность и ограничения при работе с запросами

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

Никогда не подставляйте пользовательский ввод в текст запроса конкатенацией строк — это открывает путь к ошибкам синтаксиса и потенциально опасным конструкциям. Всегда используйте параметры через УстановитьПараметр.

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

Типичные ошибки при работе с запросами

Большинство проблем с запросами связано не с синтаксисом, а с логикой и производительностью. Ниже — ошибки, которые встречаются чаще всего.

Типичные ошибки
01
Отбор в секции ГДЕ вместо параметров виртуальной таблицы — итоги считаются по всем данным, запрос работает в разы медленнее.
02
Выборка всех полей вместо нужных — лишний трафик и память, особенно при обращении к табличным частям.
03
Соединение с табличной частью без необходимости — дублирование строк и неверные суммы в итогах.
04
Использование запроса внутри цикла вместо одного запроса с соединением — резкий рост числа обращений к СУБД.
05
Получение остатков без указания периода — расчёт на самую позднюю дату и лишняя нагрузка.
06
Игнорирование различия NULL и пустых значений — строки неожиданно выпадают из соединений.

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

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

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

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

Совпадает с ожидаемым по контрольному примеру

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

Строк больше из-за дублирования при соединениях

Суммы и остатки
Норма

Сходятся со стандартным отчётом конфигурации

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

Завышены кратно числу строк соединяемой таблицы

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

Секунды на рабочем объёме данных

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

Десятки секунд и более — проверить параметры и индексы

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

Код корректно обрабатывает пустую выборку

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

Ошибка обращения к строкам без проверки Пустой()

Когда запрос не нужен: альтернативы

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

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

Маршрут решения

Как выбрать инструмент

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

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

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

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

Чем виртуальная таблица Остатки отличается от таблицы движений регистра?

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

Почему один и тот же запрос возвращает разные результаты у разных пользователей?

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

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

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

Как отладить медленный запрос?

Сначала выполните его в консоли запросов на копии базы и замерьте время. Проверьте, что условия переданы параметрами виртуальной таблицы, а не вынесены в секцию ГДЕ. Убедитесь, что поля соединений и отборов входят в индексы. На клиент-серверном варианте полезно посмотреть план запроса на стороне СУБД — он покажет, где выполняется полное сканирование таблицы.

Что лучше для отчёта — запрос в коде или СКД?

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

Итог

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

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