Как вставить кавычку внутри строки и текста запроса в 1С
Содержание
Самый короткий ответ: внутри строки удвойте кавычку. Строковый литерал "Он сказал ""Да""" вернёт Он сказал "Да". Двойная кавычка "" внутри строки читается как одна настоящая кавычка — так работает и во встроенном языке, и в языке запросов.
Проблема встречается в двух местах: когда кавычку нужно положить внутрь обычной строки в коде и когда кавычка попадает в текст запроса, который сам написан в кавычках. Во втором случае экранирование идёт на двух уровнях, и число кавычек растёт до четырёх подряд. Ниже — пять приёмов от базового удвоения до Символ(34) и СтрШаблон, с рабочими примерами.
Чаще всего кавычка в кавычках всплывает при сборке сообщения пользователю с названием организации, при формировании текста запроса в коде, в макете печатной формы и при выгрузке данных в JSON или XML. Механизм везде один, отличается только уровень вложенности.
Тема относится к платформе 1С:Предприятие 8.3 и одинакова для всех конфигураций — Бухгалтерии, ЗУП, Управления торговлей. Экранирование зависит не от конфигурации, а от того, где находится кавычка: в строке кода, в тексте запроса или в данных для вывода.
Почему вторая кавычка обрывает строку
В языке 1С кавычка " — это граница строкового литерала. Встретив первую кавычку, парсер начинает строку; встретив вторую — заканчивает её. Если написать "Он сказал "Да"", платформа увидит строку Он сказал , затем непонятное слово Да и оборванную строку. Результат — ошибка вида «Ожидается выражение» или «Обнаружено неизвестное имя».
Отсюда правило: чтобы кавычка попала внутрь строки, её нужно отличить от кавычки-границы. Способ ровно один на уровне синтаксиса — поставить две кавычки подряд. Всё остальное (Символ(34), СтрШаблон) — это обходы, когда удвоение становится нечитаемым.
Обратный слэш \ в 1С ничего не экранирует. Привычка из C, PHP или JavaScript здесь не работает: "\"" — это просто слэш и начало новой строки, а не экранированная кавычка.
Код кавычки в таблице символов — 34. Это пригодится дальше: Символ(34) возвращает именно ". У апострофа код 39, но апостроф в 1С отвечает за литералы дат ('20240101'), а не за строки, поэтому заменить им кавычку нельзя.
Подсказка от редактора конфигуратора: строковые литералы подсвечиваются цветом. Если часть кода после кавычки окрасилась «как строка», значит кавычки не сбалансированы — где-то пропущено удвоение. Это быстрый способ найти проблему, не пересчитывая кавычки вручную.
Способ 1: удвоение кавычек внутри строки
Базовый приём. Каждую кавычку, которая должна остаться в тексте, пишете дважды.
Текст = "Он сказал ""Привет"" и ушёл";
Сообщить(Текст); // Он сказал "Привет" и ушёл
Разбор по шагам: открывающая " начинает строку, "" превращается в одну кавычку, "" — ещё в одну, закрывающая " завершает литерал. Внутри остаётся Он сказал "Привет" и ушёл.
Если кавычек в тексте много, считать их глазами тяжело. Удвоение остаётся самым быстрым для коротких строк, но для длинных — источник ошибок.
Правило: число кавычек подряд всегда нечётное на границах (1 или 3) и чётное внутри (2, 4, 6). Если где-то получилось нечётное число внутри строки — литерал оборвётся.
Способ 2: Символ(34) для динамических строк
Когда строка собирается из частей или удвоений слишком много, кавычку удобнее подставлять функцией Символ(34). Она возвращает символ по его коду, а 34 — это код кавычки.
Кавычка = Символ(34);
Наименование = "Ромашка";
Текст = "ООО " + Кавычка + Наименование + Кавычка;
Сообщить(Текст); // ООО "Ромашка"
Приём особенно полезен, когда имя подставляется из переменной или из поля документа — удвоением тут не обойтись, потому что значение заранее неизвестно. Один раз объявили Кавычка = Символ(34) и дальше просто склеиваете строку через +.
Пример с данными из документа — предупреждение о контрагенте в кавычках:
Кавычка = Символ(34);
Имя = Объект.Контрагент.Наименование; // например, Ромашка
Текст = "Договор с " + Кавычка + Имя + Кавычка + " не проведён";
Сообщить(Текст); // Договор с "Ромашка" не проведён
Читается такой код заметно легче, чем частокол из "". Минус — строка становится длиннее. Для одной-двух кавычек проще удвоение, для сборки из множества кусков — Символ(34).
Способ 3: СтрШаблон, когда кавычек много
СтрШаблон подставляет значения в текст по номерам %1, %2 и так далее. Если передать туда Символ(34), кавычки встанут в нужные места без склейки плюсами.
Текст = СтрШаблон("ООО %1%2%1 от %3", Символ(34), "Ромашка", "15.03");
Сообщить(Текст); // ООО "Ромашка" от 15.03
Здесь %1 дважды берёт кавычку, %2 — наименование, %3 — дату. Шаблон остаётся читаемым: видно структуру фразы, а кавычки не мешают её разбирать.
Этот приём хорош для сообщений пользователю, заголовков форм и строк, которые собираются из нескольких переменных. Фраза задаётся один раз, значения подставляются отдельно.
СтрШаблон не умеет сам ставить кавычки — он только подставляет то, что вы передали. Кавычку всё равно даёт Символ(34) или удвоение внутри шаблона.
Способ 4: кавычка внутри текста запроса
Здесь удвоение идёт на двух уровнях, и это главная ловушка темы. Текст запроса сам по себе — строка в коде, а внутри запроса кавычка тоже служит границей строкового литерала.
Чтобы в запросе получить сравнение с ООО "Ромашка", литерал запроса должен выглядеть так: "ООО ""Ромашка""". Но весь текст запроса вы пишете внутри кавычек в коде, поэтому каждую кавычку приходится удваивать ещё раз. Получается нагромождение из четырёх и более кавычек подряд.
Не инлайните строковые значения прямо в текст запроса — передавайте их параметром. Это убирает экранирование полностью и защищает от SQL-подобных ошибок.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", "ООО ""Ромашка""");
В тексте запроса — только &Наименование, ни одной кавычки-данных. Удвоение "" осталось лишь в значении параметра на уровне кода, где оно читается легко. Сам запрос чистый.
Если значение всё же нужно вписать прямо в запрос — например, текст собирается строкой в конструкторе отчёта, — посмотрите, во что превращается одна кавычка. В данных нужно ООО "Ромашка". В тексте запроса это literal "ООО ""Ромашка""" (кавычка внутри удвоена). А этот текст запроса написан в кавычках в коде, поэтому каждая кавычка удваивается снова:
Запрос.Текст =
"ВЫБРАТЬ Контрагенты.Ссылка
|ИЗ Справочник.Контрагенты КАК Контрагенты
|ГДЕ Контрагенты.Наименование = ""ООО """"Ромашка""""""";
Шесть кавычек подряд в конце — это не опечатка: четыре кодируют закрытие строки-данных внутри запроса, две завершают литерал запроса в коде. Считать такое вручную тяжело и легко ошибиться. Поэтому для значений с кавычками параметр почти всегда предпочтительнее инлайна.
Способ 5: когда экранировать не нужно
Если кавычка идёт в текст для показа пользователю или в печатную форму, её часто можно не экранировать вовсе — заменить на типографские «ёлочки» или „лапки“. Это не обход синтаксиса, а другой символ: « и » имеют собственные коды и границей строки не являются.
Текст = "ООО «Ромашка»"; // кавычки-ёлочки, экранировать не нужно
Для деловых документов это даже правильнее: по типографике в русском тексте используются ёлочки, а прямая кавычка " — технический символ. Заголовки договоров, названия организаций, сообщения пользователю выглядят аккуратнее с «».
Заменить прямые кавычки на ёлочки в готовой строке поможет СтрЗаменить:
Текст = СтрЗаменить(Исходный, Символ(34), "«"); // грубая замена всех кавычек
Такая замена ставит одинаковый символ на открытие и закрытие — для простых случаев хватает, для аккуратной типографики открывающую и закрывающую кавычки различают по позиции в строке: первую встреченную меняют на «, следующую — на », и так по очереди.
Выбор между прямой кавычкой и ёлочкой — это выбор между техническим требованием и оформлением. Если строка идёт в выгрузку, в имя файла или в технический идентификатор, оставляйте прямую " и экранируйте её. Если строка для человека — ставьте ёлочки и забудьте про экранирование.
Выбор приёма удобно свести в таблицу.
| Где кавычка | Приём | Пример |
|---|---|---|
| Короткая строка в коде | удвоение "" | "текст ""в кавычках""" |
| Строка из переменных | Символ(34) | "ООО " + Символ(34) + Имя + Символ(34) |
| Фраза из нескольких частей | СтрШаблон | СтрШаблон("%1текст%1", Символ(34)) |
| Значение для запроса | параметр &Имя | УстановитьПараметр("Имя", Значение) |
| Текст для показа | ёлочки «» | "ООО «Ромашка»" |
Кавычки при выгрузке в JSON и XML
Отдельный случай — когда строка с кавычками уходит в JSON или XML. Здесь действуют два разных правила экранирования, и путать их нельзя.
В JSON кавычку внутри значения экранирует обратный слэш: \". Это правило самого формата JSON, а не языка 1С. В XML кавычку в атрибуте заменяют на сущность " (или ").
Не собирайте JSON и XML конкатенацией строк вручную. Для JSON используйте объект ЗаписьJSON и процедуру ЗаписатьJSON, для XML — ЗаписьXML или сериализацию XDTO. Платформа сама экранирует кавычки по правилам формата, и вам не придётся смешивать удвоение 1С со слэшами JSON.
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, "ООО ""Ромашка"""); // платформа сама поставит \"
Результат = Запись.Закрыть();
Если же строка собирается руками, помните: удвоение "" в коде даёт кавычку на уровне 1С, а слэш \ платформа запишет как обычный символ. Поэтому ручная сборка JSON с кавычками — частый источник битого формата. Доверьте экранирование ЗаписьJSON.
Частые ошибки при экранировании
Разберём промахи, из-за которых код не компилируется или строка собирается неправильно.
- 🔸 Нечётное число кавычек. Забыли одну из пары — литерал обрывается, и ошибка всплывает в следующей строке, а не там, где реальная причина. Считайте кавычки парами.
- 🔸 Одинарная кавычка вместо удвоения.
"Да"Нет"ломается. Нужно"Да""Нет". - 🔸 Обратный слэш.
"\"текст\""— в 1С это не экранирование, а символы слэша внутри оборванной строки. - 🔸 Смарт-кавычки из Word. Скопировали пример из документа — и вместо прямой
"вставились«»или“”. Код либо не работает , либо ведёт себя не так, как ждёте. В модуле вставляйте только прямые кавычки. - 🔸 Инлайн значения в запрос. Вместо параметра вписали строку прямо в текст запроса и запутались в четырёх кавычках. Переходите на
УстановитьПараметр. - 🔸 Путают кавычку и апостроф. В запросе дату пишут в апострофах
&Датаили'20240101', строку — в кавычках. Апостроф строку не экранирует.
Если синтаксическая ошибка указывает на строку ниже проблемной, почти всегда виновата непарная кавычка выше по тексту.
Частые вопросы
Можно ли экранировать кавычку обратным слэшем, как в других языках?
"". Для подстановки используют Символ(34) или СтрШаблон.Какой код у кавычки и у апострофа?
" — код 34, Символ(34) вернёт её. У апострофа ' — код 39. Апостроф в 1С ограничивает литералы дат, строку им не экранируют.Почему в тексте запроса получается четыре кавычки подряд?
"", а сам текст запроса написан в кавычках в коде, поэтому каждая удваивается ещё раз. Чтобы этого избежать, передавайте значение параметром через УстановитьПараметр.Как заменить все кавычки в строке разом?
СтрЗаменить(Текст, Символ(34), "«") заменит прямые кавычки на ёлочки. Для разных открывающей и закрывающей кавычек замену делают по позиции в тексте.Какой способ выбрать?
Символ(34). Для фразы из нескольких частей — СтрШаблон. Для значения в запросе — параметр. Для вывода пользователю — ёлочки «».