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

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

Как вывести кавычки в строке в 1С

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

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

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

Ниже разобраны оба рабочих способа, особенности кавычек в тексте запроса, типичные ошибки начинающих разработчиков и способы проверить результат до вывода пользователю.

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

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

Наименование = "ООО ""Ромашка""";

Сообщить("Документ ""Реализация товаров"" проведён");

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

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

1c
Строка = "Значение: ""Тест""!"; // Значение: "Тест"!

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

Двойная кавычка имеет код 34 в таблице символов, поэтому её можно вставить через встроенную функцию Символ(34). Способ удобен, когда кавычек много и удвоенные пары делают строку нечитаемой, либо когда символ подставляется динамически.

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

Наименование = "ООО " + Кавычка + "Ромашка" + Кавычка;

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

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

Сравнение вариантов

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

Быстрее пишется и не требует конкатенации; плохо читается при большом количестве кавычек в строке.

Символ(34)

Наглядно в длинных шаблонах и при динамической сборке; требует конкатенации строк и чуть длиннее кода.

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

Текст запроса в 1С — это тоже строка, поэтому правило удвоения действует и внутри него. Если в запросе нужно сравнить значение со строковым литералом, содержащим кавычки, каждая кавычка внутри литерала запроса удваивается дважды: один раз по правилам языка запросов, и всё это ещё раз экранируется правилами строкового литерала встроенного языка.

Запрос.Текст =

"ВЫБРАТЬ Контрагенты.Ссылка

|ИЗ Справочник.Контрагенты КАК Контрагенты

|ГДЕ Контрагенты.Наименование = ""ООО """"Ромашка""""""";

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

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

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

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

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

ТекстПисьма =

"Уважаемые партнёры!

|Организация ""Ромашка"" сообщает,

|что реквизиты изменились.";

Типичная ошибка — забыть открывающую кавычку после вертикальной черты или закрывающую в конце части. Конфигуратор подсвечивает такие места, но при копировании текста из внешних источников легко потерять один символ и получить ошибку «Неправильный строковый литерал».

Кавычки в сообщениях, макетах и обмене данными

При выводе через Сообщить() или ПоказатьПредупреждение() строка отображается как есть: удвоенные кавычки в коде превращаются в обычные в тексте сообщения. Проверить результат можно прямо в окне сообщений без дополнительных инструментов.

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

При выгрузке в XML, JSON или CSV правила меняются: формат имеет собственные требования к кавычкам. Например, в JSON строка с кавычкой должна экранироваться обратным слэшем, а в CSV поле с кавычками обрамляется кавычками и внутренние удваиваются. Штатные объекты ЗаписьJSON и ЗаписьXML делают это автоматически — вручную удваивать кавычки для них не нужно и вредно.

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

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

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

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

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

Строка в окне сообщений
Норма

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

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

Двойные кавычки подряд или их отсутствие

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

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

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

Лишние кавычки в начале или конце значения

Файл обмена
Норма

Файл открывается принимающей системой без ошибок разбора

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

Ошибка парсинга в месте первой кавычки

Типичные ошибки и ограничения

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

Отдельный случай — «ёлочки» и «лапки». Символы «» и „“ — это обычные буквенные символы, а не кавычки-ограничители, поэтому внутри строкового литерала их удваивать не нужно. Путаница возникает, когда текст с типографскими кавычками копируют из Word: визуально они похожи, но для компилятора безобидны.

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

Типичные ошибки
01
Три кавычки вместо четырёх в конце строки — синтаксическая ошибка незакрытого литерала
02
Двойное удвоение: кавычки экранированы и в коде, и в исходных данных — в выводе появляются "" вместо "
03
Ручное экранирование кавычек при работе с ЗаписьJSON — в файле появляются лишние символы
04
Удвоение типографских кавычек «» — они не являются ограничителями строки и портят текст
Итог

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

В строках 1С кавычка выводится удвоением ("") или через Символ(34). В запросах строки лучше передавать параметрами. При обмене данными экранирование выполняют штатные объекты записи, а не ручное удвоение.

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

Как вывести одиночную кавычку (апостроф) в строке 1С?

Апостроф не является ограничителем строкового литерала, поэтому вставляется напрямую без экранирования: Строка = "It's a test";. Удваивать или заменять его не нужно.

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

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

Как вставить кавычки в строку запроса без четырёх кавычек подряд?

Передайте значение через параметр: Запрос.УстановитьПараметр("Название", "ООО ""Ромашка"""), а в тексте запроса используйте &Название. Тогда удвоение потребуется только один раз — в строковом литерале кода.

Нужно ли удваивать кавычки «ёлочки» внутри строки?

Нет. Символы « и » — обычные типографские символы, компилятор не считает их границами строки. Они вставляются как есть и часто используются в текстах для пользователей как более аккуратная замена прямых кавычек.

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

Напишите три кавычки подряд в начале литерала: Строка = """Цитата"" — сказал он";. Первая кавычка открывает литерал, следующие две — удвоенная кавычка данных.

Чем Символ(34) лучше удвоения?

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