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