К статье
Практический материал

Разработка и Конфигурация · 8 мин

Как экранировать кавычки в 1С

Как экранировать кавычки в 1С: удвоение кавычек в строковых литералах, функция СтрЗаменить, символы-разделители, примеры кода и типичные ошибки разработчиков.

Кавычки в языке 1С — служебный символ: они обозначают начало и конец строкового литерала. Поэтому вставить кавычку внутрь строки «как есть» нельзя — компилятор воспримет её как конец строки и выдаст ошибку синтаксиса либо неверно разберёт код. Чтобы включить кавычку в значение строки, её нужно экранировать.

Основной способ экранирования в 1С — удвоение кавычки: два символа "" внутри строкового литерала воспринимаются как одна кавычка в значении. Это единственный штатный механизм, обратной косой черты, как в C или JavaScript, во встроенном языке 1С нет.

Проблема экранирования чаще всего возникает при формировании текстов запросов, XML, JSON, HTML, печатных форм и сообщений пользователю, где кавычки — часть контента. Ниже разобраны все рабочие приёмы, их ограничения и типичные ошибки.

Как работает удвоение кавычек в строковых литералах

Строковый литерал в 1С заключается в двойные кавычки. Если внутри текста нужна кавычка, вместо одной ставят две подряд. Платформа при компиляции заменяет пару на один символ в итоговом значении строки.

Пример: Строка = "ООО ""Ромашка"" заключило договор"; — в переменной окажется текст ООО "Ромашка" заключило договор. Внешние кавычки — границы литерала, внутренние удвоенные — данные.

Важно не путать удвоение внутри строки с пустой строкой "". Пустая строка — это открывающая и закрывающая кавычки без содержимого. Удвоенная кавычка внутри текста — часть значения. Конструкция """""" (шесть кавычек подряд) — это строка из одной кавычки: границы плюс две пары экранированных символов.

bsl
Наименование = "ООО ""Ромашка""";
Сообщить("Строка """""" содержит одну кавычку");

Экранирование кавычек в тексте запроса

Текст запроса в 1С — обычная строка, поэтому правила те же. Если в условии запроса нужно строковое значение с кавычками, каждую кавычку удваивают. Однако правильнее передавать такие значения через параметры запроса, а не встраивать в текст.

Пример без параметра: ТекстЗапроса = "ВЫБРАТЬ * ГДЕ Наименование = ""ООО """"Ромашка"""""""; — читать такую строку тяжело, ошибиться в подсчёте кавычек легко. Тот же запрос с параметром надёжнее:

Запрос.Текст = "ВЫБРАТЬ * ГДЕ Наименование = &Наименование";

Запрос.УстановитьПараметр("Наименование", "ООО ""Ромашка""");

Параметры избавляют от экранирования вовсе и заодно защищают от ошибок при конкатенации пользовательского ввода в текст запроса. Встраивать ввод пользователя в текст запроса напрямую — плохая практика: кроме проблем с кавычками, это создаёт риск некорректной интерпретации данных.

Многострочные строки и вертикальная черта

В 1С строковый литерал можно разбивать на несколько строк исходного кода с помощью символа вертикальной черты | в начале каждой продолжающей строки. Это удобно для длинных текстов запросов и шаблонов.

Правила экранирования кавычек внутри многострочных литералов не меняются: кавычки в данных по-прежнему удваиваются. Вертикальная черта влияет только на перенос строки, а не на обработку кавычек.

Текст = "ВЫБРАТЬ

| Контрагенты.Наименование

|ГДЕ

| Контрагенты.Комментарий ПОДОБНО ""%""""важно""""%""";

Альтернативные способы вставки кавычек

Когда строка содержит много кавычек (например, формируется XML, JSON или HTML), удвоение делает код нечитаемым. Есть несколько практических альтернатив.

Функция Символ(34)

Код 34 — это код двойной кавычки в Unicode. Конструкция Символ(34) возвращает символ кавычки, который можно конкатенировать со строкой, не удваивая ничего: Результат = Символ(34) + "Ромашка" + Символ(34);. Часто код сохраняют в переменную с коротким именем, например Кав = Символ(34);, и используют её по всему модулю.

Замена через СтрЗаменить

При формировании больших шаблонов удобно писать текст с уникальным символом-заменителем (например, одинарной кавычкой или тильдой), а в конце заменить его на настоящую кавычку: Результат = СтрЗаменить(Шаблон, "~", Символ(34));. Шаблон при этом остаётся читаемым.

Сравнение способов

Удвоение кавычек

Подходит для коротких строк и редких кавычек. Неудобно и ошибкоопасно в длинных шаблонах XML/JSON.

Символ(34)

Удобно при конкатенации и в циклах. Требует дисциплины: лучше вынести в именованную переменную.

СтрЗаменить с заменителем

Лучший вариант для больших шаблонов. Нужно гарантировать, что символ-заменитель не встречается в реальных данных.

Параметры запроса

Единственно правильный способ передать значения с кавычками в запрос. Не применим для формирования произвольного текста.

Кавычки при выгрузке в XML, JSON и CSV

При записи XML и JSON штатными средствами (ЗаписьXML, ЗаписьJSON) экранировать кавычки вручную не нужно — механизмы сериализации делают это автоматически. Ручное экранирование требуется только если вы формируете текст этих форматов конкатенацией строк, что само по себе нежелательно.

В CSV-файлах по общепринятым правилам поле, содержащее кавычки или разделитель, обрамляется кавычками, а внутренние кавычки удваиваются. Если вы формируете CSV вручную, эту логику нужно реализовать самостоятельно — платформа за вас её не выполнит.

Как проверить результат и типичные ошибки

Проверить итоговое значение строки проще всего через Сообщить() или вычисление выражения в отладчике (Shift+F9 в конфигураторе). В окне «Вычислить выражение» строка показывается с её фактическим значением — там видно, сколько кавычек реально попало в данные.

Самая частая ошибка — неверный подсчёт кавычек в конструкциях вида """""". Правило проверки: разбейте последовательность мысленно на границы литерала (первая и последняя кавычки) и пары внутри. Количество кавычек внутри литерала всегда должно быть чётным.

Вторая типичная ошибка — попытка использовать обратный слэш \" по аналогии с другими языками. В 1С это не экранирование: слэш попадёт в строку как обычный символ, а кавычка закроет литерал, что вызовет синтаксическую ошибку.

Типичные ошибки
01
Использование обратного слэша \" — в 1С слэш не экранирует, возникает синтаксическая ошибка или лишний символ в данных.
02
Нечётное количество кавычек внутри литерала — компилятор не может определить конец строки.
03
Ручное экранирование при выгрузке через ЗаписьXML/ЗаписьJSON — кавычки дублируются в выгруженном файле.
04
Конкатенация пользовательского ввода в текст запроса вместо параметров — ошибки выполнения и риск порчи логики запроса.
Контрольные точки

Как проверить результат

Значение строки в отладчике
Норма

Кавычки присутствуют ровно там, где нужны, в одиночном виде

Тревожный признак

Кавычки удвоены в значении или отсутствуют

Компиляция модуля
Норма

Модуль сохраняется без синтаксических ошибок

Тревожный признак

Ошибка «Ожидается символ» или «Не закончен строковый литерал»

Выгруженный XML/JSON
Норма

Файл открывается штатными средствами чтения

Тревожный признак

Лишние кавычки в значениях атрибутов

Часто задаваемые вопросы

Как вывести строку, состоящую из одной кавычки?

Используйте шесть кавычек подряд: С = """"""; — внешние две обозначают границы литерала, внутренние четыре образуют две пары, каждая из которых даёт по одной кавычке… точнее, проще и надёжнее написать С = Символ(34); — результат тот же, но код читается без подсчёта символов.

Работает ли экранирование обратным слэшем, как в других языках?

Нет. Во встроенном языке 1С обратный слэш — обычный символ без специального значения. Единственный механизм экранирования кавычки в строковом литерале — её удвоение.

Как вставить кавычки в сообщение пользователю?

Так же, как в любую строку: удвоением. Например, Сообщить("Документ """" + Номер + """" не проведён"); выведет номер в кавычках. Альтернатива — собрать сообщение через Символ(34), если кавычек много.

Нужно ли экранировать одинарные кавычки в 1С?

Нет. Одинарная кавычка (апостроф) не является служебным символом в строковых литералах и вставляется как есть. Она имеет специальное значение только внутри текстов запросов при задании строковых констант и дат, но это уже правила языка запросов, а не встроенного языка.

Как передать строку с кавычками в запрос?

Через параметр: Запрос.УстановитьПараметр("Значение", СтрокаСКавычками); — в этом случае экранировать ничего не нужно, значение передаётся как есть. Удвоение требуется только если значение встраивается прямо в текст запроса, чего следует избегать.

Итог

Что важно запомнить

В 1С кавычка внутри строки экранируется удвоением, обратный слэш не работает. В запросах передавайте значения параметрами, для длинных шаблонов используйте Символ(34) или СтрЗаменить с заменителем, а при выгрузке через ЗаписьXML/ЗаписьJSON не экранируйте вручную.