Разработка и Конфигурация · 8 мин
Как в 1С указать кавычки внутри строки
Как в языке 1С указать кавычки внутри строки: удвоение кавычек, Символ(34), кавычки в запросах, макетах и форматных строках. Примеры кода и типичные ошибки.
Один из самых частых вопросов начинающих разработчиков 1С — как поместить кавычки внутрь строкового литерала. Проблема в том, что в языке 1С строка ограничивается двойными кавычками, и если просто написать кавычку внутри, компилятор решит, что строка закончилась, и выдаст ошибку синтаксиса.
В языке 1С нет экранирования обратным слэшем, как в C-подобных языках. Вместо этого используется удвоение кавычки: две подряд идущие двойные кавычки внутри строки воспринимаются как одна кавычка в результирующем значении. Это единственный «родной» механизм языка, и он работает везде — в модулях, запросах, форматных строках.
Ниже разобраны все практические способы: удвоение кавычек, функция Символ(), работа с одинарными кавычками, особенности запросов и макетов, а также типичные ошибки, которые приводят к синтаксическим ошибкам и битым строкам в базе.
Основной способ: удвоение кавычек
Строковый литерал в 1С ограничивается двойными кавычками. Чтобы включить двойную кавычку в значение строки, напишите её дважды. Например, нужно получить строку: Товар "Кирпич" отгружен. Код будет выглядеть так:
Сообщение = "Товар ""Кирпич"" отгружен";
В результате переменная Сообщение будет содержать: Товар "Кирпич" отгружен. Каждая пара кавычек внутри литерала превращается в одну кавычку значения.
Отдельный случай — кавычка в самом конце строки. Здесь легко запутаться, потому что итоговая кавычка значения и закрывающая кавычка литерала идут подряд:
// Нужно получить: Статус "Новый"
Статус = "Статус ""Новый""";
Здесь в конце стоят три кавычки подряд: две — это кавычка в значении, третья — закрывающий ограничитель строки. Если строка должна состоять только из одной кавычки, литерал будет выглядеть как четыре кавычки подряд: """".
// Примеры удвоения кавычек
А = """"; // результат: "
Б = """Отчет"" за период"; // результат: "Отчет" за период
В = "Кавычки ""внутри"" строки"; // результат: Кавычки "внутри" строкиОдинарные кавычки: удвоение не требуется
Одинарная кавычка (апостроф) в языке 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Определите, какой символ нужен: двойная или одинарная кавычка
- 2Для двойной кавычки удвойте её внутри строкового литерала
- 3Для одинарной кавычки просто вставьте её в строку без изменений
- 4Если кавычек много — замените их конкатенацией с Символ(34)
- 5Проверьте результат через Сообщить() или отладчик: кавычки должны выводиться по одной
Кавычки в языке запросов и форматных строках
В тексте запроса 1С строковые литералы тоже ограничиваются двойными кавычками, и удвоение работает так же. Но есть нюанс: сам текст запроса обычно задан строкой в модуле, поэтому кавычки удваиваются дважды — четыре кавычки в коде дают одну в тексте запроса:
Запрос.Текст = "ВЫБРАТЬ * ГДЕ Наименование = """"Значение""""";
На практике вставлять значения прямо в текст запроса — плохая идея: это ломает читаемость и открывает дорогу ошибкам. Используйте параметры запроса (Запрос.УстановитьПараметр), тогда кавычки в значениях не требуют никакой обработки вообще.
В форматных строках функций Формат() и СтрШаблон() кавычки также удваиваются. В СтрШаблон() дополнительно удваивается символ процента, если он нужен как литерал. Функция СтрШаблон("Товар ""%1""", Наименование) — рабочий способ собрать строку с кавычками без ручной конкатенации.
Кавычки в макетах, XML и передаче данных
В табличных и текстовых макетах кавычки пишутся как есть — макет не является кодом, и правила языка на него не распространяются. Проблемы возникают только если текст макета формируется программно.
При формировании XML или JSON не собирайте строки вручную с удвоением кавычек — используйте объекты ЗаписьXML и ЗаписьJSON. Они сами корректно экранируют кавычки, амперсанды и другие спецсимволы по правилам формата. Ручная сборка почти гарантированно даст невалидный документ на первом же значении с кавычкой или угловой скобкой.
Ещё один риск — копирование текста из Word или почты в редактор кода. Текстовые редакторы заменяют прямые кавычки на типографские («ёлочки», «лапки»), которые компилятор 1С не распознаёт как ограничители строки. Признак: синтаксическая ошибка на визуально правильной строке. Лечится заменой типографских кавычек на прямые.
Как проверить результат
Каждая кавычка отображается один раз
Видны двойные кавычки подряд — лишнее удвоение
Модуль сохраняется без синтаксических ошибок
Ошибка 'Ожидается символ' — непарная кавычка
Прямые кавычки "
Типографские «» или „ “ — скопированы из Word
Частые вопросы
Как вывести в строке только одну кавычку?
Используйте четыре кавычки подряд: С = """";. Две внутренние дают один символ кавычки в значении, две внешние — ограничители литерала. Альтернатива — С = Символ(34);
Нужно ли удваивать одинарную кавычку (апостроф)?
Нет. Одинарная кавычка в языке 1С не является служебным символом и вставляется в строку как есть. Удвоение приведёт к тому, что в значении появятся два апострофа вместо одного.
Почему строка с кавычками даёт синтаксическую ошибку после копирования из Word?
Word заменяет прямые кавычки на типографские («ёлочки» или «лапки»), которые компилятор 1С не считает ограничителями строки. Замените их в редакторе кода на обычные прямые кавычки.
Как вставить кавычки в текст запроса?
Лучше не вставлять значения в текст запроса вовсе — используйте Запрос.УстановитьПараметр(), тогда кавычки не потребуют обработки. Если всё же формируете текст вручную, помните о двойном удвоении: четыре кавычки в коде дают одну в тексте запроса.
Что лучше: удвоение кавычек или Символ(34)?
Для одной-двух кавычек удвоение короче и читается нормально. Когда кавычек много (JSON-подобные строки, команды внешних программ), конкатенация с Символ(34) читается легче и снижает риск сбиться в подсчёте пар.
Как перенести строку внутри строкового литерала?
Разорвите литерал и начните продолжение с вертикальной черты |, либо используйте конкатенацию с Символы.ПС. Помните, что пробелы после вертикальной черты попадут в значение строки.
Что важно запомнить
Двойная кавычка внутри строки 1С удваивается, одинарная вставляется как есть. Для большого числа кавычек удобен Символ(34), для XML/JSON — объекты записи вместо ручной сборки. Проверяйте результат выводом: кавычка должна отображаться по одной.