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