Как исправить ошибку «Пропущен символ двойная кавычка» в тексте запроса 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При написании или копировании программного кода на встроенном языке 1С разработчики нередко сталкиваются с ошибками синтаксического контроля при компиляции модулей. Одной из наиболее распространенных является ошибка вида «Пропущен символ '\"' (двойная кавычка)» и связанная с ней «Неопознанный оператор». Проанализируем, почему возникает эта ошибка в блоке формирования текста запроса, и рассмотрим способы её устранения.

Посмотрим на типичное сообщение об ошибке, которое выдает платформа при проверке модуля:


{Документ.ОказаниеУслуги.МодульОбъекта(20,59)}: Пропущен символ '"' (двойная кавычка)
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК<<?>>
{Документ.ОказаниеУслуги.МодульОбъекта(20,59)}: Ожидается символ ';'
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК<<?>>
{Документ.ОказаниеУслуги.МодульОбъекта(22,21)}: Неопознанный оператор
КоличествоВДокументе<<?>>,

Выясним причину возникновения ошибки

Разберем правила синтаксиса многострочных строковых литералов в платформе 1С:Предприятие:

  1. Многострочный литерал открывается символом двойной кавычки " на первой строке.
  2. Каждая последующая строка внутри литерала обязательно должна начинаться со служебного символа вертикальной черты | без пробелов перед ним.
  3. Завершается весь блок закрывающей двойной кавычкой " и точкой с запятой ;.

Если строка была случайно разорвана (например, при переносе псевдонима поля КоличествоВДокументе на новую строку) и на новой строке отсутствует символ |, транслятор языка считает, что строковый литерал оборвался без закрывающей кавычки на предыдущей строке. В результате всё, что написано ниже, воспринимается компилятором как обычный исполняемый код 1С, вызывая каскад синтаксических ошибок.

Чаще всего подобное происходит при вставке фрагментов запроса из документации, файлов формата PDF или браузера, где срабатывает автоматический перенос длинных строк с добавлением скрытого перевода строки, либо при случайном нажатии клавиши Enter в конфигураторе.

Способ 1. Восстановление символа переноса строки

Самое быстрое исправление — поставить символ вертикальной черты | перед перенесенной частью текста запроса. Рассмотрим проблемный и исправленный варианты.

Ошибочный код:


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК
КоличествоВДокументе,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры";

Исправленный код:


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК
| КоличествоВДокументе,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры";

Способ 2. Объединение строки с предыдущей

Если строка была разорвана случайно, логичнее подтянуть перенесенный псевдоним обратно к оператору КАК, сформировав одну цельную строку выборки поля:


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе,
| МАКСИМУМ(ОказаниеУслугиПереченьНоменклатуры.Стоимость) КАК Стоимость
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
|ГДЕ
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";

Способ 3. Перегенерация через Конструктор запроса

Если текст запроса большой и вручную искать отсутствующие символы неудобно, воспользуемся встроенным визуальным инструментом:

  1. Нажимаем правой кнопкой мыши внутри текста запроса в модуле объекта.
  2. В контекстном меню выбираем пункт Конструктор запроса с обработкой результата (или просто Конструктор запроса).
  3. Если синтаксис внутри самого текста запроса корректен, откроется визуальный редактор.
  4. Нажимаем кнопку ОК: конфигуратор автоматически отформатирует текст запроса, расставит все открывающие кавычки, закрывающие символы и пайпы | в начале каждой строки.

Альтернативные способы формирования текста запроса

Чтобы минимизировать ошибки с кавычками и вертикальными чертами при динамической сборке условий, рассмотрим альтернативные подходы к формированию запросов.

1. Сборка текста запроса через массив и функцию СтрСоединить:


МассивТекста = Новый Массив;
МассивТекста.Добавить("ВЫБРАТЬ");
МассивТекста.Добавить(" Таблица.Номенклатура КАК Номенклатура,");
МассивТекста.Добавить(" СУММА(Таблица.Количество) КАК Количество");
МассивТекста.Добавить("ИЗ");
МассивТекста.Добавить(" Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК Таблица");
МассивТекста.Добавить("ГДЕ");
МассивТекста.Добавить(" Таблица.Ссылка = &Ссылка");
МассивТекста.Добавить("СГРУППИРОВАТЬ ПО");
МассивТекста.Добавить(" Таблица.Номенклатура");

Запрос = Новый Запрос;
Запрос.Текст = СтрСоединить(МассивТекста, Символы.ПС);

2. Использование функции СтрШаблон:

Если в текст запроса требуется динамически подставлять имена таблиц или условий, удобно применять функцию СтрШаблон, что исключает ошибки при сложной конкатенации строк.

3. Хранение текста в макете объекта:

Для сложных и объемных отчетов или обработок текст запроса можно вынести в отдельный макет объекта конфигурации с типом Текстовый документ. Загрузка текста в таком случае выполняется методом ПолучитьТекст():


Запрос = Новый Запрос;
Запрос.Текст = ЭтотОбъект.ПолучитьМакет("ТекстЗапроса").ПолучитьТекст();

Рекомендации по предотвращению синтаксических ошибок

  1. Регулярный синтаксический контроль: Перед сохранением модуля или запуском отладки нажимайте комбинацию клавиш Ctrl + F7 для быстрой проверки текущего модуля на синтаксические ошибки.
  2. Отображение непечатаемых знаков: В параметрах конфигуратора полезно включить отображение специальных символов, чтобы видеть неразрывные пробелы и переносы строк, скопированные из внешних источников.
  3. Отключение экранного переноса строк: Рекомендуется отключить опцию автоматического переноса длинных строк по словам в настройках редактора, чтобы четко отличать реальный перевод строки от визуального переноса текста.
← На главную