Разработка и Конфигурация · 8 мин
Как передать строку с кавычками в 1С
Как в 1С передать строку с кавычками: удвоение кавычек, СтрШаблон, СтрЗаменить, работа с JSON и параметрами запросов. Примеры кода и типичные ошибки.
Во встроенном языке 1С строковый литерал заключается в двойные кавычки, поэтому обычная кавычка внутри текста «ломает» строку и вызывает синтаксическую ошибку ещё на этапе проверки модуля. Это одна из самых частых проблем начинающих разработчиков: нужно вывести фразу вида ООО «Ромашка», а конфигуратор ругается на непарную кавычку.
Задача решается несколькими способами — от простого удвоения кавычек до формирования строк через шаблоны и функции подстановки. Выбор зависит от того, где возникает строка: в коде модуля, в тексте запроса, при передаче данных в JSON или при выводе сообщения пользователю.
Ниже разобраны рабочие приёмы с примерами кода, ограничения каждого подхода и типичные ошибки, из-за которых кавычки теряются или появляются лишние.
Основной способ: удвоение кавычек в литерале
Правило языка простое: чтобы кавычка оказалась внутри строки, её нужно написать дважды. Платформа при разборе литерала превращает пару кавычек в одну, и в памяти остаётся корректный текст.
Наименование = "ООО ""Ромашка""";
Сообщить("Пользователь сказал: ""Привет!""");
Если кавычка стоит в самом конце строки, итоговая последовательность выглядит как три кавычки подряд: две — удвоенная внутренняя, третья — закрывающая литерал. Это нормально и не является ошибкой, хотя визуально сбивает с толку.
Текст = "Слово в кавычках: ""тест""";
Проверить результат можно через Сообщить или вывод в отладчике: в итоговой строке должны быть одинарные кавычки там, где в коде стояли двойные.
Многострочные строки и символ переноса
Строковый литерал в 1С может занимать несколько строк кода. Каждая новая строка литерала открывается вертикальной чертой |, и внутри таких фрагментов действует то же правило удвоения кавычек.
ТекстПисьма = "Уважаемый клиент!
|Ваша заявка ""Поставка-17"" принята в работу.
|Срок исполнения уточняйте у менеджера.";
Если нужен управляющий символ (перевод строки, табуляция) внутри одиночной строки, используют Символы.ПС, Символы.Таб и конкатенацию. Кавычки при этом по-прежнему удваиваются.
Формирование строк через СтрШаблон и подстановку
Когда кавычки содержатся в переменной и их нужно вставить в готовый текст, удобнее СтрШаблон. Функция подставляет параметры вместо %1, %2 и так далее, а кавычки внутри подставляемых значений не требуют никакой обработки — они приходят «как есть».
Текст = СтрШаблон("Документ ""%1"" от %2 проведён", НомерДокумента, Формат(ДатаДокумента, "ДЛФ=D"));
Обратите внимание: кавычки вокруг %1 в шаблоне — это часть литерала, поэтому они удвоены. А вот значение переменной НомерДокумента подставляется без изменений, даже если само содержит кавычки.
Этот приём особенно удобен в сообщениях пользователю, заголовках форм и текстах писем, где шаблон один, а данные меняются.
Кавычки в динамических данных: СтрЗаменить и Символ(34)
Если строка приходит извне — из файла, формы, веб-сервиса — и нужно добавить или убрать кавычки программно, используют СтрЗаменить либо символ с кодом 34 (двойная кавычка в Unicode).
Кавычка = Символ(34);
Результат = Кавычка + ИсходнаяСтрока + Кавычка;
БезКавычек = СтрЗаменить(ИсходнаяСтрока, Кавычка, "");
Символ(34) полезен и тогда, когда код с удвоенными кавычками становится нечитаемым — например, при сборке сложных строк с множеством кавычек. Вместо визуальной «каши» из четырёх-пяти кавычек подряд получается понятная конструкция.
Кавычка = Символ(34);
Текст = "ООО " + Кавычка + "Ромашка" + Кавычка;
Сообщить(Текст); // ООО "Ромашка"Кавычки в тексте запроса и параметрах
Передавать строковые значения в запрос конкатенацией — плохая практика: придётся вручную удваивать кавычки и обрамлять значение, а любая кавычка в данных сломает текст запроса. Правильный путь — параметры запроса.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты ГДЕ Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", "ООО ""Ромашка""");
Параметр передаётся в запрос как значение, а не как фрагмент текста, поэтому кавычки внутри него безопасны. Здесь удвоение нужно только потому, что значение задано литералом в коде; если значение берётся из переменной или реквизита, никакой обработки не требуется вообще.
Кавычки при обмене данными: JSON и XML
При выгрузке в JSON не нужно экранировать кавычки вручную — это делает сериализатор. Используйте ЗаписатьJSON или ЗаписьJSON, и платформа сама превратит кавычки в управляющую последовательность \".
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Новый Структура("Контрагент", "ООО ""Ромашка"""));
Результат = Запись.Закрыть();
Ручная сборка JSON конкатенацией строк — частый источник битых файлов: одна необработанная кавычка в наименовании делает весь документ невалидным. То же относится к XML: атрибуты с кавычками формируйте через ЗаписьXML, а не склейкой строк.
Проверка результата и отладка
Убедиться, что строка сформирована правильно, проще всего через Сообщить или просмотр значения в отладчике: внутренние кавычки должны отображаться по одной. Если видите двойные кавычки в готовой строке — вы удвоили их лишний раз, скорее всего в переменной, а не в литерале.
Для JSON и XML дополнительная проверка — открыть результат в любом валидаторе или попробовать прочитать его обратно через ЧтениеJSON. Если чтение проходит без исключения, экранирование корректно.
Как проверить результат
Внутренние кавычки отображаются по одной
Двойные кавычки в готовом значении — лишнее удвоение
Модуль проходит проверку без ошибок
Ошибка 'Ожидается символ' — непарная кавычка в литерале
ЧтениеJSON разбирает строку без исключения
Ошибка разбора — кавычки не экранированы
Что важно запомнить
В литерале кода кавычка удваивается. В переменных и параметрах запроса никакой обработки не нужно. JSON и XML формируйте штатными объектами записи — они экранируют кавычки сами. Для читаемости сложных строк используйте Символ(34) и СтрШаблон.
Частые вопросы
Как вывести кавычки-ёлочки вместо прямых?
Используйте символы Unicode: Символ(171) для открывающей « и Символ(187) для закрывающей ». Они не конфликтуют с синтаксисом литералов, поэтому их можно вставлять в строку без удвоения — например, при оформлении текстов писем и печатных форм.
Почему в значении из реквизита появились двойные кавычки?
Скорее всего, при записи значения к нему применили удвоение, которое нужно только для литералов в коде. Данные из формы, файла или реквизита хранятся как есть — обрабатывать их не требуется. Найдите место записи и уберите лишнее удвоение.
Работает ли удвоение кавычек в тексте запроса?
Да, в литералах внутри текста запроса действует то же правило удвоения. Но если значение приходит из переменных, надёжнее передать его через УстановитьПараметр — тогда о кавычках можно не думать вовсе.
Как передать строку с кавычками в COM-соединение или внешний метод?
Строка передаётся как обычное значение типа Строка — внутри неё кавычки хранятся в одинарном виде и дополнительной обработки не требуют. Удвоение нужно только в момент написания литерала в исходном коде.
Что делать, если строка содержит и кавычки, и переносы строк?
Скомбинируйте приёмы: кавычки удвойте, а переносы добавьте через Символы.ПС конкатенацией либо используйте многострочный литерал с вертикальной чертой. Для длинных текстов удобнее макет текстового документа — там кавычки вообще не требуют обработки.