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