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