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

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

1С: как вставить кавычки в строку

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

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

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

Ниже разобраны все рабочие варианты с примерами кода, типичные ошибки, которые приводят к синтаксическим ошибкам и «битому» тексту, а также способы проверить результат до выгрузки данных.

Почему кавычка «ломает» строку в 1С

Компилятор встроенного языка 1С определяет границы строки по двойным кавычкам. Как только встречается первая кавычка, начинается строковый литерал, а следующая кавычка его завершает. Всё, что написано после закрывающей кавычки, интерпретируется как код, поэтому конструкция вида Текст = "Товар "Хлеб" отсутствует"; вызывает ошибку: после второй кавычки компилятор видит идентификатор Хлеб и не понимает, что с ним делать.

Та же логика действует в языке запросов, в выражениях СКД и в макетах табличных документов — везде, где строка задаётся литералом, кавычка является служебным символом. Поэтому универсальное правило платформы: кавычка внутри строки всегда экранируется удвоением.

Важно не путать эту ситуацию с одинарными кавычками. Одинарная кавычка внутри строкового литерала не требует экранирования и вставляется как обычный символ: Текст = "Документ 'Реализация' проведён"; — корректная запись.

Способ 1. Удвоение кавычек внутри строки

Основной и самый частый приём — написать две кавычки подряд там, где в итоговой строке должна быть одна. Компилятор преобразует пару кавычек в один символ:

ТекстСообщения = "Номенклатура ""Хлеб белый"" не найдена в справочнике.";

Сообщить(ТекстСообщения);

В результате пользователь увидит: Номенклатура "Хлеб белый" не найдена в справочнике. Обратите внимание: удвоение применяется только внутри литерала. Наружные кавычки, ограничивающие строку, пишутся по одной.

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

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура

|ГДЕ Наименование = ""Товар """"Эксклюзив"""""""";

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

bsl
Текст = "Значение ""Склад №1"" не заполнено";
Сообщить(Текст); // Значение "Склад №1" не заполнено

Способ 2. Функция Символ(34)

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

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

Текст = "Номенклатура " + Кавычка + "Хлеб белый" + Кавычка + " не найдена.";

Такой подход удобен, когда строка собирается динамически из переменных и вставлять удвоенные кавычки в каждый фрагмент неудобно или легко ошибиться. Код получается длиннее, но однозначно читается: видно, где именно стоит кавычка.

Дополнительно через Символ() вставляют другие «типографские» символы: кавычки-ёлочки (коды 171 и 187), которые часто требуются в печатных формах и не конфликтуют со служебными кавычками вообще:

Текст = Символ(171) + НаименованиеТовара + Символ(187); // «Товар»
Если в печатной форме или сообщении нужны именно кавычки-ёлочки « », вставляйте их через Символ(171) и Символ(187) или напрямую в литерал — они не являются служебными и не требуют экранирования. Это снимает проблему удвоения как таковую.
ПЗ
Практическое замечание

Способ 3. Шаблон() и СтрШаблон() для сообщений

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

Текст = СтрШаблон("Номенклатура ""%1"" не найдена в базе.", НаименованиеТовара);

Сообщить(Текст);

Кавычки внутри шаблона по-прежнему удваиваются — правило литерала никуда не девается. Зато подстановка значений через %1, %2 избавляет от ручной конкатенации и снижает риск пропустить кавычку при сборке строки из нескольких частей.

Отдельный сценарий — многоязычные сообщения через НСтр(). В строке на каждом языке кавычки удваиваются независимо:

Текст = НСтр("ru = 'Поле ""Контрагент"" не заполнено';

|en = 'Field ""Customer"" is empty'");

Обратите внимание: в НСтр() строки для разных языков заключаются в одинарные кавычки внутри общего литерала, поэтому двойные кавычки внутри каждого фрагмента всё равно удваиваются.

Кавычки в запросах, XML и JSON

При выгрузке данных в XML или JSON кавычки внутри значений обрабатываются по-разному, и смешивать подходы нельзя. В JSON строковые значения обрамляются двойными кавычками, а кавычки внутри значения экранируются обратным слэшем (\"). Если формировать JSON вручную конкатенацией, легко получить невалидный документ. Правильный путь — использовать штатные объекты ЗаписьJSON / ЗаписьXML, которые сами корректно экранируют специальные символы:

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписьJSON.ЗаписатьНачалоОбъекта();

ЗаписьJSON.ЗаписатьИмяСвойства("Наименование");

ЗаписьJSON.ЗаписатьЗначение("Товар ""Эксклюзив""");

ЗаписьJSON.ЗаписатьКонецОбъекта();

Результат = ЗаписьJSON.Закрыть();

Объект записи сам преобразует удвоенные кавычки литерала в корректное экранирование формата. То же относится к XML: ЗаписьXML заменит кавычки в значениях атрибутов на сущности " там, где это требуется стандартом.

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

Типичные ошибки и как их найти

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

Вторая ошибка — копирование текста из Word или почты, где вместо прямых кавычек стоят типографские «ёлочки» или «лапки». Такие символы не являются служебными для компилятора, поэтому синтаксической ошибки не будет, но вместо ожидаемых кавычек в строке окажутся другие символы. При сравнении строк это приводит к неожиданным «не найдено».

Третья группа проблем — ручная сборка JSON/XML конкатенацией с забытой обработкой кавычек во вложенных значениях. Внешний приёмник (сервис, сайт, другая информационная база) отвергает такой документ как невалидный. Перед отправкой всегда проверяйте сформированный текст на тестовом значении, заведомо содержащем кавычки.

Типичные ошибки
01
Одна кавычка внутри литерала вместо двух — синтаксическая ошибка или «съедание» кода ниже
02
Копирование текста из Word с типографскими кавычками — строка выглядит верно, но сравнения не срабатывают
03
Ручная сборка JSON конкатенацией без экранирования — невалидный документ на стороне приёмника
04
Подстановка переменной с кавычками в текст запроса вместо параметра — ошибка выполнения запроса

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

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

Для выгружаемых файлов проверка двухэтапная: сначала убедиться, что строка в памяти содержит ровно те кавычки, что нужны, затем открыть сформированный XML или JSON в текстовом редакторе и убедиться, что специальные символы корректно экранированы по правилам формата. Если приёмник — внешний сервис, прогоните тестовое значение с кавычками до запуска обмена в продуктивной базе.

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

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

Строка в отладчике (Shift+F9)
Норма

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

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

Кавычки отсутствуют или строка обрывается раньше ожидаемого

Текст сообщения пользователю
Норма

Кавычки стоят ровно вокруг нужного слова

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

Двойные кавычки подряд или потерян фрагмент текста

Сформированный XML/JSON в редакторе
Норма

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

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

Приёмник отклоняет документ как невалидный

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

Как вставить кавычки-ёлочки « » в строку?

Ёлочки не являются служебными символами, поэтому их можно вставить прямо в литерал, если раскладка позволяет, или через Символ(171) и Символ(187). Удваивать их не нужно.

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

Нет. Одинарная кавычка внутри строкового литерала — обычный символ, она не ограничивает строку и не требует экранирования. Удвоение применяется только к двойным кавычкам.

Почему четыре кавычки подряд в конце строки?

Конструкция из четырёх кавычек в конце литерала означает: две первые — экранированная кавычка внутри строки, две последние... на самом деле последняя пара — это экранированная кавычка плюс закрывающий литерал. Итого строка заканчивается символом кавычки. Такие места трудно читать, поэтому часто их заменяют на Символ(34).

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

Через параметр: Запрос.УстановитьПараметр("Наименование", ЗначениеСКавычками). Платформа сама корректно передаст значение, и никакого экранирования не потребуется. Вставлять значение в текст запроса конкатенацией не рекомендуется.

Как экранировать кавычки при формировании JSON?

Не формируйте JSON конкатенацией строк. Используйте ЗаписьJSON или ЗаписатьJSON — они автоматически преобразуют кавычки внутри значений в последовательность \" по стандарту формата.

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

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

Итог

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

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