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