Как вставить кавычку внутри строки и текста запроса в 1С

· 9 мин

Содержание

Самый короткий ответ: внутри строки удвойте кавычку. Строковый литерал "Он сказал ""Да""" вернёт Он сказал "Да". Двойная кавычка "" внутри строки читается как одна настоящая кавычка — так работает и во встроенном языке, и в языке запросов.

Проблема встречается в двух местах: когда кавычку нужно положить внутрь обычной строки в коде и когда кавычка попадает в текст запроса, который сам написан в кавычках. Во втором случае экранирование идёт на двух уровнях, и число кавычек растёт до четырёх подряд. Ниже — пять приёмов от базового удвоения до Символ(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))
Значение для запросапараметр &ИмяУстановитьПараметр("Имя", Значение)
Текст для показаёлочки «»"ООО «Ромашка»"
Проверьте себя
Что выведет `Сообщить("2 "" 2");`?
Сколько кавычек подряд нужно в коде, чтобы внутри строкового литерала в тексте запроса получилась одна кавычка?
Чем экранируют кавычку в 1С?

Кавычки при выгрузке в 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', строку — в кавычках. Апостроф строку не экранирует.

Если синтаксическая ошибка указывает на строку ниже проблемной, почти всегда виновата непарная кавычка выше по тексту.

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

Можно ли экранировать кавычку обратным слэшем, как в других языках?
Нет. В 1С нет слэш-экранирования. Единственный способ на уровне синтаксиса — удвоение "". Для подстановки используют Символ(34) или СтрШаблон.
Какой код у кавычки и у апострофа?
У кавычки " — код 34, Символ(34) вернёт её. У апострофа ' — код 39. Апостроф в 1С ограничивает литералы дат, строку им не экранируют.
Почему в тексте запроса получается четыре кавычки подряд?
Потому что экранирование двухуровневое: одна кавычка внутри строки запроса — это "", а сам текст запроса написан в кавычках в коде, поэтому каждая удваивается ещё раз. Чтобы этого избежать, передавайте значение параметром через УстановитьПараметр.
Как заменить все кавычки в строке разом?
СтрЗаменить(Текст, Символ(34), "«") заменит прямые кавычки на ёлочки. Для разных открывающей и закрывающей кавычек замену делают по позиции в тексте.
Какой способ выбрать?
Для короткой строки — удвоение. Для сборки из переменных — Символ(34). Для фразы из нескольких частей — СтрШаблон. Для значения в запросе — параметр. Для вывода пользователю — ёлочки «».