При разработке внешних печатных форм в системе 1С программисты часто сталкиваются с ситуацией, когда сложный запрос, отлично работающий в консоли, внезапно вызывает ошибку {(1, 1)}: Ожидается выражение \"ВЫБРАТЬ\" при запуске из модуля объекта. Рассмотрим пошагово, как проанализировать и устранить эту неисправность.
Первое, что необходимо сделать — это убедиться, что текст запроса, который отправляется на исполнение, в точности соответствует тому, что вы ожидаете увидеть. Очень часто динамическое формирование текста с помощью функции СтрЗаменить приводит к скрытым ошибкам: лишним символам или склеиванию операторов.
Добавьте в код модуля команду Сообщить(Запрос.Текст); непосредственно перед строкой Запрос.ВыполнитьПакет;. Полученный результат скопируйте и вставьте в консоль запросов. Если в консоли запрос также выдает ошибку, проблема заключается в синтаксисе. Если нет — идем дальше.
Частой причиной является неверная подстановка параметров. Рассмотрим пример использования СтрЗаменить:
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекстЗапросаКоэффициентУпаковки",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
"Товары.Упаковка", "Товары.Номенклатура"));
Если функция Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки возвращает пустую строку или строку с синтаксической ошибкой, пакет запросов «ломается», так как после знака ; платформа ожидает начало нового запроса с ключевого слова ВЫБРАТЬ. Если подстановка превращает текст в нечто нечитаемое, 1С выдаст именно указанную ошибку.
Если вы уверены, что код верный, но ошибка сохраняется, велика вероятность, что система «запомнила» старую версию вашего модуля. Это особенно актуально для внешней печатной формы, которая была подключена ранее.
Дополнительные отчеты и обработки.%AppData%\1C\1CEStart и удалите папки с временными файлами кэша (буквенно-цифровые названия).СведенияОВнешнейОбработке.Когда вы используете Запрос.ВыполнитьПакет(), метод возвращает массив результатов (тип Массив). Важно понимать, что в этот массив попадают результаты всех операторов ВЫБРАТЬ, которые присутствуют в пакете. Если вы обращаетесь к элементам массива по индексу, например ПакетРезультатовЗапроса[6], убедитесь, что структура запроса не изменилась.
Рекомендуем использовать отладчик для проверки количества элементов в полученном массиве:
ПакетРезультатовЗапроса = Запрос.ВыполнитьПакет();
// Проверьте в отладчике количество элементов в ПакетРезультатовЗапроса
// Убедитесь, что индекс, к которому вы обращаетесь, существует
Чаще всего проблема решается комплексно:
ПОМЕСТИТЬ и перед каждым ВЫБРАТЬ корректно расставлены точки с запятой ;.СтрЗаменить, обязательно выводите итоговый текст запроса в окно сообщений или проверяйте его через отладчик.Дополнительные отчеты и обработки и очищайте кэш, чтобы платформа не использовала скомпилированный код из памяти.Если после выполнения всех этих шагов ошибка сохраняется, попробуйте упростить запрос, убирая пакеты по одному, чтобы локализовать проблемный блок. Иногда проблема кроется в том, что один из подзапросов внутри пакета не возвращает данные, что при попытке выгрузки Результат.Выгрузить() приводит к ошибке выполнения.