Разработка и Конфигурация · 8 мин
Как в 1С указать кавычку внутри кавычек
Как в 1С указать кавычку внутри строки: удвоение кавычек, Символ(34), многострочные строки, кавычки в запросах и форматной строке. Примеры кода и типичные ошибки.
Во встроенном языке 1С строковые литералы заключаются в двойные кавычки, поэтому обычная кавычка внутри текста воспринимается компилятором как конец строки. Чтобы вывести кавычку как часть текста, её нужно специальным образом экранировать — и способов несколько: удвоение кавычки, функция Символ(), многострочные литералы. Выбор зависит от контекста: обычный код, текст запроса, форматная строка или сообщение пользователю.
Типичная ситуация: нужно вывести сообщение вида Документ «Реализация № 15» не проведён. Если написать кавычки как есть, модуль не сохранится — конфигуратор выдаст синтаксическую ошибку. Ниже разобраны все рабочие приёмы с примерами кода, ограничения каждого подхода и ошибки, которые чаще всего допускают разработчики.
Основной способ: удвоение кавычки
Стандартный приём языка 1С — две подряд идущие двойные кавычки внутри строкового литерала воспринимаются как одна кавычка в результирующем тексте. Это аналог экранирования в других языках, только вместо обратного слэша используется повтор символа.
Пример: Сообщить("Документ ""Реализация № 15"" не проведён"); выведет текст: Документ "Реализация № 15" не проведён. Обратите внимание: открывающая и закрывающая кавычки литерала при этом не удваиваются — удваиваются только те кавычки, которые должны остаться в тексте.
Если нужна кавычка в самом начале или конце строки, получается три кавычки подряд: Строка = """Привет"""; — первые две дают кавычку в тексте, третья закрывает литерал. Результат: "Привет". Такая запись выглядит необычно, но синтаксически корректна.
Сообщить("Документ ""Реализация № 15"" не проведён");
// Результат: Документ "Реализация № 15" не проведёнАльтернатива: функция Символ() и конкатенация
Когда строка содержит много кавычек, удвоение делает код трудночитаемым. В таких случаях удобнее собрать строку через функцию Символ(34) — 34 это код двойной кавычки в Unicode. Пример: Текст = "Документ " + Символ(34) + "Реализация" + Символ(34) + " не проведён";.
Чтобы не повторять вызов функции, код кавычки часто выносят в переменную: Кавычка = Символ(34);, а затем используют её в конкатенации. Это особенно удобно при формировании JSON-подобных строк, XML-атрибутов или длинных сообщений, где кавычек десятки.
Для типовых «ёлочек» и «лапок» используются другие коды: Символ(171) и Символ(187) — это « и », что полезно при формировании текстов для печатных форм, где требуется типографская вёрстка.
Кавычки в многострочных строках
В 1С многострочный строковый литерал записывается с вертикальной чертой в начале каждой строки. Правило удвоения кавычек внутри такого литерала сохраняется: кавычка в тексте по-прежнему пишется двойной. Вертикальная черта лишь указывает на продолжение строки, но не отменяет синтаксис литерала.
Пример: Текст = "Строка с ""кавычкой"" и переносом |и второй строкой";. Частая ошибка — забыть удвоить кавычку в одной из строк многострочного литерала: компилятор укажет на ошибку, но не всегда на ту строку, где она реально допущена, поэтому проверять нужно весь блок.
Кавычки в тексте запроса
Текст запроса в 1С — это обычная строка, поэтому все правила литералов действуют и там. Если в запросе нужно сравнить поле со строковым значением, содержащим кавычки, кавычки удваиваются дважды по смыслу: один раз для языка 1С, а внутри запроса строковая константа сама обрамляется кавычками.
На практике проще и надёжнее передавать такие значения через параметры: Запрос.УстановитьПараметр("Наименование", НаименованиеСКавычками);. Тогда в тексте запроса пишется ГДЕ Номенклатура.Наименование = &Наименование, и экранирование вообще не требуется — значение передаётся как есть.
Прямое встраивание строковых значений в текст запроса через конкатенацию — плохая практика: помимо проблем с кавычками, она затрудняет отладку и повторное использование плана запроса. Используйте параметры всегда, когда значение известно только во время выполнения.
Кавычки в форматной строке и шаблонах сообщений
При подстановке значений через СтрШаблон("Документ ""%1"" не найден", НомерДокумента) кавычки внутри шаблона удваиваются по общему правилу, а параметры подставляются без дополнительной обработки. Это самый читаемый способ формировать сообщения с кавычками.
В функции НСтр("ru = 'Документ ""%1"" не проведён'") строки обрамляются одинарными кавычками, но двойные кавычки внутри текста всё равно удваиваются — правило едино для всего модуля. Одинарная кавычка здесь является ограничителем фрагмента и в текст не входит.
При формировании текстов для СКД, макетов и выражений на языке выражений компоновки правила отличаются: там строковые константы тоже берутся в кавычки, и вложенные удваиваются. Проверяйте результат через консоль или тестовый отчёт, прежде чем переносить выражение в рабочую настройку.
Как проверить результат
Самый быстрый способ убедиться, что кавычки расставлены верно, — выполнить строку через Сообщить() или посмотреть значение переменной в отладчике (Tab при выделенном выражении в конфигураторе). Если модуль сохраняется без ошибок, но текст выглядит не так — проблема в количестве удвоенных кавычек.
Полезный приём при отладке длинных строк: вывести результат через Сообщить("[" + Текст + "]"); — квадратные скобки покажут границы строки, и сразу видно лишние или пропущенные кавычки по краям.
Как проверить результат
Модуль сохраняется без синтаксических ошибок
Ошибка 'Ожидается символ' или 'Неправильная строковая константа'
Кавычки отображаются в нужных местах, по одной
Кавычек нет, они сдвоены или текст оборван
Значение с кавычками находится корректно
Пустая выборка или ошибка выполнения запроса
Сравнение способов
Сравнение вариантов
Универсальный способ для коротких строк; становится нечитаемым при большом количестве кавычек
Подходит для строк с большим числом кавычек и программной сборки текста; код длиннее, но понятнее
Лучший вариант для сообщений с подстановкой параметров; кавычки удваиваются только в шаблоне
Единственно правильный способ передать значение с кавычками в запрос; экранирование не требуется
Для разовых сообщений достаточно удвоения. Для программной сборки сложных текстов — Символ(34) через переменную. Для запросов — всегда параметры. Смешивать подходы в одном фрагменте кода не запрещено, но единообразие упрощает сопровождение.
Частые вопросы
Можно ли использовать одинарные кавычки внутри строки?
Да, одинарная кавычка внутри строкового литерала не требует экранирования и выводится как есть. Экранировать (удваивать) нужно только двойные кавычки.
Работает ли обратный слэш для экранирования, как в других языках?
Нет. Во встроенном языке 1С нет escape-последовательностей: запись \" выведет слэш и кавычку, а не экранирует её. Используйте удвоение или Символ(34).
Как вывести кавычки-ёлочки вместо прямых?
Используйте Символ(171) для открывающей « и Символ(187) для закрывающей ». Прямое удвоение даст только машинописные прямые кавычки.
Почему запрос с кавычками в условии возвращает пустой результат?
Чаще всего значение встроено в текст запроса конкатенацией с неправильным числом кавычек. Перенесите значение в параметр запроса — проблема исчезнет, и код станет безопаснее.
Как задать пустую строку или строку из одной кавычки?
Пустая строка — это "". Строка из одной кавычки — """" (четыре кавычки: две дают символ в тексте, две — ограничители литерала).
Что важно запомнить
Кавычка внутри строки в 1С указывается удвоением (""), обратный слэш не работает. Для сложных текстов используйте Символ(34), для сообщений — СтрШаблон, для запросов — только параметры. Проверяйте результат выводом через Сообщить или в отладчике.