При работе с динамическими списками в 1С:Предприятие программисты часто сталкиваются с необходимостью модификации текста запроса. Одной из самых коварных ошибок является синтаксическая ошибка в районе ключевого слова КАК, особенно если в запросе используются фигурные скобки {} и функция ВЫРАЗИТЬ. Рассмотрим подробнее, почему это происходит и как правильно составить запрос, чтобы избежать подобных проблем.
Проанализируем типичную ситуацию. В тексте запроса динамического списка разработчик пытается применить типизацию к полю, которое обернуто в фигурные скобки для обеспечения необязательности выбора этого поля:
ШаблонТекстаЗапроса = ШаблонТекстаЗапроса + "
| ВЫРАЗИТЬ({СвободныеОстаткиВНаличии} КАК ЧИСЛО(15, 3)) КАК ВНаличииОстаток,
| {СвободныеОстаткиВНаличии} КАК ВНаличииВБазовыхЕдиницах,
| ВЫРАЗИТЬ({ВсеОстаткиДоступно} КАК ЧИСЛО(15, 3)) КАК Доступно";
Система выдает ошибку: Синтаксическая ошибка "КАК". Платформа указывает именно на конструкцию внутри функции ВЫРАЗИТЬ. Основная причина здесь кроется в том, как парсер 1С обрабатывает текст запроса динамического списка (или СКД).
Фигурные скобки {} — это специальные инструкции для расширения языка запросов. Они говорят системе: "Если это поле выбрано пользователем в настройках списка, включи этот кусок кода в итоговый запрос, если нет — удали его".
Когда вы пишете ВЫРАЗИТЬ({Поле} КАК Тип), парсер ожидает увидеть имя поля в круглых скобках функции ВЫРАЗИТЬ. Но вместо имени он видит макрос расширения. Если платформа не может однозначно интерпретировать, будет ли поле существовать в финальной сборке запроса, она ломается на этапе компиляции шаблона.
Правильное решение: Функции преобразования или вычисления должны находиться внутри фигурных скобок, если все поле является расширением. Рассмотрим правильный вариант написания секции ВЫБРАТЬ:
|{ВЫБРАТЬ
| ВЫРАЗИТЬ(СвободныеОстаткиВНаличии КАК ЧИСЛО(15, 3)) КАК ВНаличииОстаток,
| СвободныеОстаткиВНаличии КАК ВНаличииВБазовыхЕдиницах,
| ВЫРАЗИТЬ(ВсеОстаткиДоступно КАК ЧИСЛО(15, 3)) КАК Доступно}
В этом случае мы явно указываем системе, что вся эта группа полей является частью расширения. Если эти поля не будут задействованы, платформа корректно исключит весь блок целиком.
Часто ошибка в слове КАК вызвана банальной опечаткой: использованием латинской буквы "A" вместо кириллической "А". Визуально они идентичны, но для компилятора это разные символы.
Проанализируем ситуацию, когда текст копируется из старых баз или внешних редакторов. Если вы видите ошибку именно на слове К<<?>>АК, попробуйте просто перепечатать ключевые слова ВЫРАЗИТЬ и КАК вручную на русской раскладке. Это исключит вероятность попадания невидимых символов или символов другой кодировки.
Разберем ситуацию, когда после исправления секции ВЫБРАТЬ возникает ошибка в секции ИЗ. Это часто происходит при динамической сборке строки запроса:
|ИЗ
| {СправочникХарактеристики}
| {ЦеныНоменклатуры}
| И (ЦеныНоменклатуры.ВидЦены = &ВидыЦен)
Выясним причину этой ошибки. В динамических списках использование фигурных скобок в секции ИЗ требует строгого соблюдения синтаксиса соединений. Если вы используете расширения для таблиц, платформа должна понимать, как эти таблицы связаны между собой, если они будут включены в запрос.
Основные рекомендации для работы с секцией ИЗ в шаблонах:
+) легко забыть пробел или перенос строки перед ключевыми словами. Например, если конец предыдущей строки заканчивается текстом, а новая начинается сразу с |ИЗ, слова могут "склеиться".ЛЕВОЕ СОЕДИНЕНИЕ, также оборачивая условия связи в фигурные скобки, чтобы они пропадали вместе с таблицей.{} могут конфликтовать с автоматическими. Попробуйте отключить автозаполнение, если вы пишете сложный шаблон запроса вручную.Чтобы понять, что именно идет не так, мы рекомендуем воспользоваться методом "отладки текстом". Выполните следующие шаги:
ТвойСписок.ТекстЗапроса.Если в консоли запросов текст выдает ту же ошибку, значит, проблема в базовом синтаксисе (лишние запятые, отсутствие пробелов). Если в консоли (без фигурных скобок) запрос работает, а в динамическом списке нет — проблема в позиционировании макросов {}.
Подведем итог. Чтобы успешно работать с функциями ВЫРАЗИТЬ, ЕСТЬNULL и расширениями в динамических списках, придерживайтесь следующих правил:
{Поле} в качестве единственного аргумента функции внутри стандартного запроса.{ВЫБРАТЬ ВЫРАЗИТЬ(Таблица.Поле КАК Тип) КАК Псевдоним} для описания опциональных типизированных полей.КАК, ВЫРАЗИТЬ, ИЗ были написаны на одном языке (кириллице).| и пробелы между блоками кода.Эти простые правила помогут вам создавать гибкие и отказоустойчивые интерфейсы в ваших решениях на базе 1С:Предприятие.