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

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

Как написать кавычки в кавычках в 1С

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

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

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

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

Базовое правило удвоения кавычек

Компилятор 1С читает строку от первой открывающей кавычки до следующей одиночной кавычки. Если внутри встречаются две кавычки подряд, они интерпретируются как одна литеральная кавычка, и разбор строки продолжается. Поэтому пустая строка записывается как "", а строка, состоящая из одной кавычки, — как """" (четыре символа).

Простейший пример: нужно вывести сообщение вида: Товар "Молоко" не найден. Код будет выглядеть так:

Сообщить("Товар ""Молоко"" не найден");

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

bsl
Сообщить("Товар ""Молоко"" не найден");
// Результат: Товар "Молоко" не найден

СтрокаСКавычкой = """";
// Значение переменной: один символ "

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

Отдельная сложность — когда кавычка должна стоять первым или последним символом строки. Здесь легко потерять счёт символам, потому что удвоенная кавычка сливается визуально с граничной. Строка, целиком заключённая в кавычки (например, "Привет" со знаками кавычек в значении), записывается как """Привет""" — три кавычки в начале и три в конце.

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

Фраза = """Привет""";        // "Привет"

Начало = """Начало строки"; // "Начало строки

Конец = "Конец строки"""; // Конец строки"

Подстановка значений переменных в текст с кавычками

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

ТекстСообщения = "Документ """ + НомерДокумента + """ проведён успешно.";

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

// Результат: Документ "000123" проведён успешно.

Альтернатива — функция СтрШаблон, которая делает код читабельнее при нескольких подстановках. Кавычки в шаблоне удваиваются по тому же правилу, но вся строка остаётся единым литералом:

ТекстСообщения = СтрШаблон("Документ ""%1"" от %2 проведён.", НомерДокумента, Формат(ДатаДокумента, "ДЛФ=D"));

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

Текст запроса в 1С — это тоже строка, поэтому кавычки внутри него удваиваются. Чаще всего это нужно при сравнении строковых значений прямо в тексте запроса или при использовании литералов в секции ВЫБРАТЬ.

Запрос = Новый Запрос;

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

"ВЫБРАТЬ

| ""Без категории"" КАК Категория,

| Товары.Наименование

|ИЗ

| Справочник.Товары КАК Товары

|ГДЕ

| Товары.Статус = ""Активный""";

Хорошая практика — по возможности заменять литеральные строки в условиях на параметры запроса: ГДЕ Товары.Статус = &Статус. Тогда значение передаётся через Запрос.УстановитьПараметр("Статус", "Активный"), и проблема кавычек исчезает вовсе, а запрос становится безопаснее и понятнее.

Маршрут решения

Как выбрать действие

Нужно вывести статичный текст с кавычками в сообщении или заголовкеУдвойте кавычки прямо в строковом литерале
Кавычки нужны вокруг значения переменнойСоберите строку конкатенацией или используйте СтрШаблон с удвоенными кавычками в шаблоне
Строковое значение участвует в условии запросаПередайте его параметром запроса вместо подстановки в текст
Формируется XML или JSON с кавычками в значенияхИспользуйте ЗаписьXML/ЗаписьJSON — они экранируют спецсимволы автоматически

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

В 1С строковый литерал можно продолжить на следующей строке модуля, но каждая физическая строка должна начинаться с символа «|» (вертикальная черта), а части соединяются автоматически. Правило удвоения кавычек действует в каждой части независимо.

ДлинныйТекст =

| "Первая строка со ""словом"" в кавычках

| |Вторая строка продолжает текст";

Обратите внимание: перенос строки внутри литерала сам по себе не добавляет перевод строки в значение. Если нужен реальный перевод строки в выводимом тексте, используйте Символы.ПС (перевод строки) или Символы.ВК + Символы.ПС для Windows-формата, соединяя части конкатенацией.

Кавычки при работе с XML, JSON и COM

При ручной сборке XML или JSON конкатенацией строк кавычки атрибутов приходится удваивать, и текст быстро становится нечитаемым: "<item name=""Товар""/>". Это рабочий, но хрупкий путь — легко пропустить символ и получить невалидный документ.

Надёжнее использовать объектные модели платформы: ЗаписьXML, ЗаписьJSON, ЗаписьDOM. Они принимают значения как обычные строки и сами корректно расставляют и экранируют кавычки в результирующем документе. При обмене через COM с внешними приложениями (например, формирование строк для Excel или скриптов) действует то же правило: кавычки в передаваемой строке удваиваются на уровне литерала 1С, а дальше обрабатываются уже правилами целевой системы.

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

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

Дополнительная проверка — функция СтрДлина(): если строка получилась короче ожидаемой, вероятно, где-то кавычки «съели» часть текста. Для длинных шаблонов полезно временно разбить сборку строки на несколько переменных и проверять каждую часть по отдельности.

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

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

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

Конфигуратор не сообщает о синтаксических ошибках

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

Ошибка вида «Ожидается символ» — где-то кавычка не удвоена

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

Кавычки стоят ровно там, где задумано, текст полный

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

Текст обрезан или кавычки сдвинуты — пересчитайте пары

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

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

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

Кавычек нет или они двойные в значении — ошибка в литерале

Типичные ошибки

Первая и самая частая ошибка — попытка экранировать кавычку обратным слэшем по привычке из других языков: "Товар \"Молоко\"". В 1С слэш станет обычным символом строки, а кавычка после него завершит литерал — результатом будет синтаксическая ошибка.

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

Типичные ошибки
01
Использование обратного слэша \" — в 1С слэш не экранирует, кавычка завершает строку и ломает код
02
Нечётное число кавычек в конце литерала — компилятор ждёт закрывающую кавычку и выдаёт ошибку
03
Подстановка пользовательского ввода в текст запроса конкатенацией — кавычка во вводе разрушает структуру запроса
04
Ручная сборка XML/JSON с удвоенными кавычками вместо ЗаписьXML/ЗаписьJSON — высокий риск невалидного документа
Итог

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

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

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

Как вывести строку, которая состоит из одной кавычки?

Запишите четыре кавычки подряд: Строка = """";. Первая открывает литерал, две средние дают литеральную кавычку, четвёртая закрывает строку. В значении переменной окажется ровно один символ кавычки.

Почему конфигуратор пишет «Ожидается символ ;» рядом с моей строкой?

Чаще всего это означает, что строка завершилась раньше, чем вы планировали: внутри есть нечётная одиночная кавычка. Найдите первую кавычку после открывающей и проверьте, удвоена ли она.

Можно ли использовать одинарные кавычки для строк в 1С?

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

Как вставить в строку кавычки-ёлочки «» вместо прямых?

Ёлочки — обычные символы, их можно вставить в литерал напрямую без удвоения: "Товар «Молоко» не найден". Они не конфликтуют с синтаксисом и часто удобнее для сообщений пользователю, оформленных по правилам русской типографики.

Работает ли удвоение кавычек в тексте запроса и в макетах?

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

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

Удвойте кавычки в литеральных частях, а перенос добавьте конкатенацией с Символы.ПС: "Строка с ""кавычками""" + Символы.ПС + "Вторая строка". Перенос физической строки модуля через «|» сам по себе перевод строки в значение не добавляет.