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