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

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

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

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

Во встроенном языке 1С строковый литерал заключается в двойные кавычки, поэтому обычная кавычка внутри текста «ломает» строку и вызывает синтаксическую ошибку ещё на этапе проверки модуля. Это одна из самых частых проблем начинающих разработчиков: нужно вывести фразу вида ООО «Ромашка», а конфигуратор ругается на непарную кавычку.

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

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

Основной способ: удвоение кавычек в литерале

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

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

Сообщить("Пользователь сказал: ""Привет!""");

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

Текст = "Слово в кавычках: ""тест""";

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

Многострочные строки и символ переноса

Строковый литерал в 1С может занимать несколько строк кода. Каждая новая строка литерала открывается вертикальной чертой |, и внутри таких фрагментов действует то же правило удвоения кавычек.

ТекстПисьма = "Уважаемый клиент!

|Ваша заявка ""Поставка-17"" принята в работу.

|Срок исполнения уточняйте у менеджера.";

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

Формирование строк через СтрШаблон и подстановку

Когда кавычки содержатся в переменной и их нужно вставить в готовый текст, удобнее СтрШаблон. Функция подставляет параметры вместо %1, %2 и так далее, а кавычки внутри подставляемых значений не требуют никакой обработки — они приходят «как есть».

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

Обратите внимание: кавычки вокруг %1 в шаблоне — это часть литерала, поэтому они удвоены. А вот значение переменной НомерДокумента подставляется без изменений, даже если само содержит кавычки.

Этот приём особенно удобен в сообщениях пользователю, заголовках форм и текстах писем, где шаблон один, а данные меняются.

Кавычки в динамических данных: СтрЗаменить и Символ(34)

Если строка приходит извне — из файла, формы, веб-сервиса — и нужно добавить или убрать кавычки программно, используют СтрЗаменить либо символ с кодом 34 (двойная кавычка в Unicode).

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

Результат = Кавычка + ИсходнаяСтрока + Кавычка;

БезКавычек = СтрЗаменить(ИсходнаяСтрока, Кавычка, "");

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

bsl
Кавычка = Символ(34);
Текст = "ООО " + Кавычка + "Ромашка" + Кавычка;
Сообщить(Текст); // ООО "Ромашка"

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

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

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

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

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

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

Кавычки при обмене данными: JSON и XML

При выгрузке в JSON не нужно экранировать кавычки вручную — это делает сериализатор. Используйте ЗаписатьJSON или ЗаписьJSON, и платформа сама превратит кавычки в управляющую последовательность \".

Запись = Новый ЗаписьJSON;

Запись.УстановитьСтроку();

ЗаписатьJSON(Запись, Новый Структура("Контрагент", "ООО ""Ромашка"""));

Результат = Запись.Закрыть();

Ручная сборка JSON конкатенацией строк — частый источник битых файлов: одна необработанная кавычка в наименовании делает весь документ невалидным. То же относится к XML: атрибуты с кавычками формируйте через ЗаписьXML, а не склейкой строк.

Типичные ошибки
01
Одиночная кавычка внутри литерала — модуль не проходит синтаксическую проверку, код не выполняется
02
Конкатенация пользовательского ввода в текст запроса — запрос падает с ошибкой на первом же наименовании с кавычками
03
Ручная сборка JSON строками — невалидный файл при первой кавычке в данных
04
Удвоение кавычек в значении переменной — в данных появляются лишние кавычки, ведь удваивать нужно только литералы в коде
05
Путаница между типами кавычек при вставке текста из Word — «ёлочки» и прямые кавычки визуально похожи, но обрабатываются по-разному

Проверка результата и отладка

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

Для JSON и XML дополнительная проверка — открыть результат в любом валидаторе или попробовать прочитать его обратно через ЧтениеJSON. Если чтение проходит без исключения, экранирование корректно.

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

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

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

Внутренние кавычки отображаются по одной

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

Двойные кавычки в готовом значении — лишнее удвоение

Синтаксическая проверка модуля
Норма

Модуль проходит проверку без ошибок

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

Ошибка 'Ожидается символ' — непарная кавычка в литерале

Чтение JSON обратно
Норма

ЧтениеJSON разбирает строку без исключения

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

Ошибка разбора — кавычки не экранированы

Итог

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

В литерале кода кавычка удваивается. В переменных и параметрах запроса никакой обработки не нужно. JSON и XML формируйте штатными объектами записи — они экранируют кавычки сами. Для читаемости сложных строк используйте Символ(34) и СтрШаблон.

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

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

Используйте символы Unicode: Символ(171) для открывающей « и Символ(187) для закрывающей ». Они не конфликтуют с синтаксисом литералов, поэтому их можно вставлять в строку без удвоения — например, при оформлении текстов писем и печатных форм.

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

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

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

Да, в литералах внутри текста запроса действует то же правило удвоения. Но если значение приходит из переменных, надёжнее передать его через УстановитьПараметр — тогда о кавычках можно не думать вовсе.

Как передать строку с кавычками в COM-соединение или внешний метод?

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

Что делать, если строка содержит и кавычки, и переносы строк?

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