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

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

Как в 1С указать кавычки внутри строки

Как в языке 1С указать кавычки внутри строки: удвоение кавычек, Символ(34), кавычки в запросах, макетах и форматных строках. Примеры кода и типичные ошибки.

Один из самых частых вопросов начинающих разработчиков 1С — как поместить кавычки внутрь строкового литерала. Проблема в том, что в языке 1С строка ограничивается двойными кавычками, и если просто написать кавычку внутри, компилятор решит, что строка закончилась, и выдаст ошибку синтаксиса.

В языке 1С нет экранирования обратным слэшем, как в C-подобных языках. Вместо этого используется удвоение кавычки: две подряд идущие двойные кавычки внутри строки воспринимаются как одна кавычка в результирующем значении. Это единственный «родной» механизм языка, и он работает везде — в модулях, запросах, форматных строках.

Ниже разобраны все практические способы: удвоение кавычек, функция Символ(), работа с одинарными кавычками, особенности запросов и макетов, а также типичные ошибки, которые приводят к синтаксическим ошибкам и битым строкам в базе.

Основной способ: удвоение кавычек

Строковый литерал в 1С ограничивается двойными кавычками. Чтобы включить двойную кавычку в значение строки, напишите её дважды. Например, нужно получить строку: Товар "Кирпич" отгружен. Код будет выглядеть так:

Сообщение = "Товар ""Кирпич"" отгружен";

В результате переменная Сообщение будет содержать: Товар "Кирпич" отгружен. Каждая пара кавычек внутри литерала превращается в одну кавычку значения.

Отдельный случай — кавычка в самом конце строки. Здесь легко запутаться, потому что итоговая кавычка значения и закрывающая кавычка литерала идут подряд:

// Нужно получить: Статус "Новый"

Статус = "Статус ""Новый""";

Здесь в конце стоят три кавычки подряд: две — это кавычка в значении, третья — закрывающий ограничитель строки. Если строка должна состоять только из одной кавычки, литерал будет выглядеть как четыре кавычки подряд: """".

bsl
// Примеры удвоения кавычек
А = """";                    // результат: "
Б = """Отчет"" за период";      // результат: "Отчет" за период
В = "Кавычки ""внутри"" строки"; // результат: Кавычки "внутри" строки

Одинарные кавычки: удвоение не требуется

Одинарная кавычка (апостроф) в языке 1С не является служебным символом внутри строки. Её можно вставлять напрямую, без какого-либо удвоения:

Текст = "Не забудь про 'важный' документ";

Путь = "C:\Users\O'Brien\file.xml";

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

Исключение — когда строка с апострофами передаётся дальше в другую систему: в текст запроса к внешней базе, в выражение языка запросов 1С внутри конструкции, где строка сама является литералом, или в COM/HTTP-вызов. В этих случаях правила экранирования определяются уже целевым языком, а не языком 1С.

Альтернатива: функция Символ()

Когда строка содержит много кавычек, удвоение делает код трудночитаемым. В таких случаях удобна функция Символ(), которая возвращает символ по его коду Unicode. Код двойной кавычки — 34, одинарной — 39:

Кавычка = Символ(34);

Сообщение = "Товар " + Кавычка + "Кирпич" + Кавычка + " отгружен";

Часто заводят переменную с коротким именем или используют Символ(34) прямо в выражении. Это особенно удобно при формировании JSON-подобных строк, XML вручную или команд для внешних программ, где кавычек много и считать пары утомительно.

Дополнительный плюс Символ() — возможность вставлять непечатаемые символы: Символ(10) — перевод строки, Символ(9) — табуляция, Символ(13) — возврат каретки. Впрочем, для перевода строки внутри литерала есть и более наглядный способ — многострочные строки с вертикальной чертой.

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

В 1С строковый литерал можно разрывать на несколько строк кода. Каждая новая часть начинается с вертикальной черты |. Правило удвоения кавычек действует и здесь, внутри каждой части:

Текст = "Первая строка с ""кавычками""

|Вторая строка с ""кавычками""";

Обратите внимание: пробелы и отступы после вертикальной черты попадают в значение строки. Если выравниваете код отступами, эти пробелы окажутся в тексте — это частая причина «лишних» пробелов в сообщениях и макетах.

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

Порядок действий
  1. 1
    Определите, какой символ нужен: двойная или одинарная кавычка
  2. 2
    Для двойной кавычки удвойте её внутри строкового литерала
  3. 3
    Для одинарной кавычки просто вставьте её в строку без изменений
  4. 4
    Если кавычек много — замените их конкатенацией с Символ(34)
  5. 5
    Проверьте результат через Сообщить() или отладчик: кавычки должны выводиться по одной

Кавычки в языке запросов и форматных строках

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

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

На практике вставлять значения прямо в текст запроса — плохая идея: это ломает читаемость и открывает дорогу ошибкам. Используйте параметры запроса (Запрос.УстановитьПараметр), тогда кавычки в значениях не требуют никакой обработки вообще.

В форматных строках функций Формат() и СтрШаблон() кавычки также удваиваются. В СтрШаблон() дополнительно удваивается символ процента, если он нужен как литерал. Функция СтрШаблон("Товар ""%1""", Наименование) — рабочий способ собрать строку с кавычками без ручной конкатенации.

Кавычки в макетах, XML и передаче данных

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

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

Ещё один риск — копирование текста из Word или почты в редактор кода. Текстовые редакторы заменяют прямые кавычки на типографские («ёлочки», «лапки»), которые компилятор 1С не распознаёт как ограничители строки. Признак: синтаксическая ошибка на визуально правильной строке. Лечится заменой типографских кавычек на прямые.

Контрольные точки

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

Вывод строки через Сообщить() или в отладчике
Норма

Каждая кавычка отображается один раз

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

Видны двойные кавычки подряд — лишнее удвоение

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

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

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

Ошибка 'Ожидается символ' — непарная кавычка

Внешний вид кавычек в коде
Норма

Прямые кавычки "

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

Типографские «» или „ “ — скопированы из Word

Частые вопросы

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

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

Нужно ли удваивать одинарную кавычку (апостроф)?

Нет. Одинарная кавычка в языке 1С не является служебным символом и вставляется в строку как есть. Удвоение приведёт к тому, что в значении появятся два апострофа вместо одного.

Почему строка с кавычками даёт синтаксическую ошибку после копирования из Word?

Word заменяет прямые кавычки на типографские («ёлочки» или «лапки»), которые компилятор 1С не считает ограничителями строки. Замените их в редакторе кода на обычные прямые кавычки.

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

Лучше не вставлять значения в текст запроса вовсе — используйте Запрос.УстановитьПараметр(), тогда кавычки не потребуют обработки. Если всё же формируете текст вручную, помните о двойном удвоении: четыре кавычки в коде дают одну в тексте запроса.

Что лучше: удвоение кавычек или Символ(34)?

Для одной-двух кавычек удвоение короче и читается нормально. Когда кавычек много (JSON-подобные строки, команды внешних программ), конкатенация с Символ(34) читается легче и снижает риск сбиться в подсчёте пар.

Как перенести строку внутри строкового литерала?

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

Итог

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

Двойная кавычка внутри строки 1С удваивается, одинарная вставляется как есть. Для большого числа кавычек удобен Символ(34), для XML/JSON — объекты записи вместо ручной сборки. Проверяйте результат выводом: кавычка должна отображаться по одной.