При написании или копировании программного кода на встроенном языке 1С разработчики нередко сталкиваются с ошибками синтаксического контроля при компиляции модулей. Одной из наиболее распространенных является ошибка вида «Пропущен символ '\"' (двойная кавычка)» и связанная с ней «Неопознанный оператор». Проанализируем, почему возникает эта ошибка в блоке формирования текста запроса, и рассмотрим способы её устранения.
Посмотрим на типичное сообщение об ошибке, которое выдает платформа при проверке модуля:
{Документ.ОказаниеУслуги.МодульОбъекта(20,59)}: Пропущен символ '"' (двойная кавычка)
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК<<?>>
{Документ.ОказаниеУслуги.МодульОбъекта(20,59)}: Ожидается символ ';'
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК<<?>>
{Документ.ОказаниеУслуги.МодульОбъекта(22,21)}: Неопознанный оператор
КоличествоВДокументе<<?>>,
Разберем правила синтаксиса многострочных строковых литералов в платформе 1С:Предприятие:
" на первой строке.| без пробелов перед ним." и точкой с запятой ;.Если строка была случайно разорвана (например, при переносе псевдонима поля КоличествоВДокументе на новую строку) и на новой строке отсутствует символ |, транслятор языка считает, что строковый литерал оборвался без закрывающей кавычки на предыдущей строке. В результате всё, что написано ниже, воспринимается компилятором как обычный исполняемый код 1С, вызывая каскад синтаксических ошибок.
Чаще всего подобное происходит при вставке фрагментов запроса из документации, файлов формата PDF или браузера, где срабатывает автоматический перенос длинных строк с добавлением скрытого перевода строки, либо при случайном нажатии клавиши Enter в конфигураторе.
Самое быстрое исправление — поставить символ вертикальной черты | перед перенесенной частью текста запроса. Рассмотрим проблемный и исправленный варианты.
Ошибочный код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК
КоличествоВДокументе,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры";
Исправленный код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК
| КоличествоВДокументе,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры";
Если строка была разорвана случайно, логичнее подтянуть перенесенный псевдоним обратно к оператору КАК, сформировав одну цельную строку выборки поля:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе,
| МАКСИМУМ(ОказаниеУслугиПереченьНоменклатуры.Стоимость) КАК Стоимость
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
|ГДЕ
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";
Если текст запроса большой и вручную искать отсутствующие символы неудобно, воспользуемся встроенным визуальным инструментом:
| в начале каждой строки.Чтобы минимизировать ошибки с кавычками и вертикальными чертами при динамической сборке условий, рассмотрим альтернативные подходы к формированию запросов.
1. Сборка текста запроса через массив и функцию СтрСоединить:
МассивТекста = Новый Массив;
МассивТекста.Добавить("ВЫБРАТЬ");
МассивТекста.Добавить(" Таблица.Номенклатура КАК Номенклатура,");
МассивТекста.Добавить(" СУММА(Таблица.Количество) КАК Количество");
МассивТекста.Добавить("ИЗ");
МассивТекста.Добавить(" Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК Таблица");
МассивТекста.Добавить("ГДЕ");
МассивТекста.Добавить(" Таблица.Ссылка = &Ссылка");
МассивТекста.Добавить("СГРУППИРОВАТЬ ПО");
МассивТекста.Добавить(" Таблица.Номенклатура");
Запрос = Новый Запрос;
Запрос.Текст = СтрСоединить(МассивТекста, Символы.ПС);
2. Использование функции СтрШаблон:
Если в текст запроса требуется динамически подставлять имена таблиц или условий, удобно применять функцию СтрШаблон, что исключает ошибки при сложной конкатенации строк.
3. Хранение текста в макете объекта:
Для сложных и объемных отчетов или обработок текст запроса можно вынести в отдельный макет объекта конфигурации с типом Текстовый документ. Загрузка текста в таком случае выполняется методом ПолучитьТекст():
Запрос = Новый Запрос;
Запрос.Текст = ЭтотОбъект.ПолучитьМакет("ТекстЗапроса").ПолучитьТекст();
Ctrl + F7 для быстрой проверки текущего модуля на синтаксические ошибки.