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

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

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

Как заменить кавычки в строке в 1С: функция СтрЗаменить, экранирование двойных кавычек, работа с кавычками-ёлочками, примеры кода и типичные ошибки.

Замена кавычек в строке — типовая задача при разработке на встроенном языке 1С: она возникает при формировании XML и JSON, выгрузке данных в CSV, подготовке текстов запросов и очистке пользовательского ввода. Основная сложность состоит в том, что двойная кавычка в 1С является служебным символом: она обозначает границу строкового литерала, поэтому просто написать её внутри строки нельзя.

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

Ниже разобраны рабочие приёмы с готовыми примерами кода, особенности платформы 8.3 и ошибки, которые чаще всего приводят к синтаксическим ошибкам или «битым» выгрузкам.

Почему кавычка в 1С — особый символ

Во встроенном языке 1С строковые литералы заключаются в двойные кавычки: "Текст". Поэтому, если нужно поместить саму кавычку внутрь строки, компилятор воспримет её как конец литерала и выдаст ошибку «Ожидается символ ';'» или подобную.

Чтобы включить двойную кавычку в строку, её нужно удвоить. Запись "Он сказал: ""Привет""" означает строку: Он сказал: "Привет". Это первое правило, без понимания которого любая замена кавычек превращается в борьбу с синтаксическими ошибками.

Второй нюанс — кавычки бывают разными. Прямая двойная кавычка (код 34), одиночная (код 39), типографские «ёлочки» (коды 171 и 187), «лапки» (коды 132 и 147) — это разные символы. Если пользователь вставил текст из Word, в нём почти наверняка будут «ёлочки» или «лапки», и замена обычной кавычки их не затронет.

Базовый способ: функция СтрЗаменить

Функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены) заменяет все вхождения подстроки и возвращает новую строку. Исходная строка не изменяется — результат нужно присвоить переменной.

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

Текст = "Название товара: ""Кресло офисное""";

Результат = СтрЗаменить(Текст, """", "'");

// Результат: Название товара: 'Кресло офисное'

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

Чтобы полностью удалить кавычки, передайте пустую строку в качестве замены:

Результат = СтрЗаменить(Текст, """", "");
Как заменить кавычки в строке
  1. 1
    Определите, какие именно кавычки в строке: прямые (код 34), одиночные (39) или типографские (171/187)
  2. 2
    Напишите вызов СтрЗаменить с удвоенной кавычкой в параметре поиска: """"
  3. 3
    Передайте строку замены: одиночную кавычку, пробел или пустую строку
  4. 4
    Присвойте результат переменной — исходная строка не изменяется
  5. 5
    Проверьте результат через Сообщить() или в отладчике

Замена через Символ(34) — когда код читается тяжело

Конструкция из четырёх кавычек подряд плохо читается, особенно внутри длинных выражений. Альтернатива — функция Символ(34), которая возвращает символ по его коду в таблице Unicode. Код 34 — это прямая двойная кавычка.

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

Результат = СтрЗаменить(Текст, Кавычка, "'");

Такой вариант удобен, когда заменяется сразу несколько видов кавычек — код выглядит нагляднее и легче сопровождается:

Результат = СтрЗаменить(Текст, Символ(34), "'");   // прямые "

Результат = СтрЗаменить(Результат, Символ(171), "'"); // левая «

Результат = СтрЗаменить(Результат, Символ(187), "'"); // правая »

Результат = СтрЗаменить(Результат, Символ(147), "'"); // лапки ”

Последовательные вызовы работают, потому что каждый раз результат присваивается обратно в ту же переменную. Такой «конвейер» — стандартный приём очистки текста, полученного из внешних источников.

Замена типографских кавычек из Word и Excel

Текст, скопированный из Word, почти всегда содержит «ёлочки» или «лапки» вместо прямых кавычек. При выгрузке такого текста в XML или при передаче в веб-сервис это может привести к ошибкам разбора на принимающей стороне.

Универсальная функция очистки, которую можно разместить в общем модуле:

Функция ЗаменитьКавычки(Знач Текст) Экспорт

Результат = СтрЗаменить(Текст, Символ(171), """");

Результат = СтрЗаменить(Результат, Символ(187), """");

Результат = СтрЗаменить(Результат, Символ(132), """");

Результат = СтрЗаменить(Результат, Символ(147), """");

Возврат Результат;

КонецФункции

Здесь все виды типографских кавычек приводятся к обычной прямой кавычке. Если требуется наоборот — оформить текст для печатной формы по правилам типографики — поменяйте местами аргументы поиска и замены.

Обратная задача встречается при формировании печатных форм договоров: прямые кавычки из наименований контрагентов преобразуют в «ёлочки», чтобы документ выглядел аккуратно.

Кавычки в тексте запроса и при формировании XML/JSON

Отдельный сценарий — подстановка строковых значений в текст запроса 1С. В языке запросов строковый литерал тоже ограничивается двойными кавычками, поэтому значение с кавычками внутри «сломает» запрос. Правильное решение — не экранировать вручную, а использовать параметры:

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

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура

|ГДЕ Наименование = &Наименование";

Запрос.УстановитьПараметр("Наименование", НаименованиеСКавычками);

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

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

Проверка результата и типичные ошибки

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

Если СтрНайти(Результат, Символ(34)) > 0 Тогда

Сообщить("В строке остались двойные кавычки");

КонецЕсли;

Для диагностики неизвестных символов используйте КодСимвола(): пройдите по строке циклом и выведите коды подозрительных позиций. Это быстрее, чем гадать, какая именно кавычка пришла из внешнего файла.

Типичные ошибки
01
Написание """ вместо """" — нечётное количество кавычек вызывает синтаксическую ошибку компиляции
02
Забытое присваивание результата: СтрЗаменить возвращает новую строку, исходная переменная не меняется
03
Замена только прямой кавычки, когда в тексте типографские «ёлочки» из Word — замена не срабатывает
04
Ручное экранирование кавычек в XML/JSON вместо использования ЗаписьXML и ЗаписьJSON
05
Замена кавычек в значении, которое потом подставляется в запрос, вместо использования параметров запроса

Сравнение способов замены

Разные приёмы уместны в разных ситуациях. Сводная таблица поможет выбрать подходящий.

СпособКогда применятьОграничение
СтрЗаменить с """"Разовая замена прямых кавычекПлохо читается в сложных выражениях
СтрЗаменить + Символ(34)Множественные замены, разные виды кавычекНужно знать коды символов
Параметры запросаПередача строк в запросНе применимо вне запросов
ЗаписьXML / ЗаписьJSONФормирование файлов обменаТребует работы через объектную модель

Сравнение вариантов

СтрЗаменить с удвоенной кавычкой

Быстрый вариант для одной-двух замен; минус — низкая читаемость конструкции """

СтрЗаменить с Символ(34)

Наглядно при массовой очистке текста от разных видов кавычек; требует знания кодов Unicode

Параметры и штатные записи XML/JSON

Самый надёжный путь для запросов и файлов обмена; ручная замена вообще не нужна

В большинстве прикладных задач достаточно первого или второго варианта. Третий следует считать обязательным там, где строка уходит в запрос или в структурированный файл — это устраняет целый класс ошибок ещё до их появления.

Итог

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

Кавычка внутри строки 1С пишется удвоенной (""), а замена выполняется функцией СтрЗаменить. Для читаемости используйте Символ(34). Проверяйте, какие именно кавычки в исходном тексте, и не экранируйте вручную там, где работают параметры запроса и штатные средства записи XML/JSON.

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

Почему СтрЗаменить не заменяет кавычки, хотя код написан верно?

Скорее всего, в строке не прямые кавычки (код 34), а типографские «ёлочки» или «лапки» — например, текст скопирован из Word. Определите код символа функцией КодСимвола() и заменяйте именно его через Символ(171), Символ(187) и т.д.

Как добавить кавычки вокруг строки, а не заменить их?

Используйте конкатенацию с удвоенными кавычками: Результат = """" + Текст + """"; — либо функцию СтрШаблон: СтрШаблон(""%1"", Текст). Оба варианта обрамляют значение прямыми кавычками.

Можно ли заменить кавычки сразу во всех элементах справочника?

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

Чем отличается СтрЗаменить от ПодставитьПараметрыВСтроку?

СтрЗаменить ищет и заменяет конкретную подстроку в готовом тексте. ПодставитьПараметрыВСтроку (и СтрШаблон) работают наоборот: вставляют значения в шаблон с местозаполнителями %1, %2 и т.д. Для замены кавычек нужна именно СтрЗаменить.

Как выгрузить строку с кавычками в CSV, чтобы Excel открыл её корректно?

По стандарту CSV поле, содержащее кавычки или разделитель, заключается в двойные кавычки, а внутренние кавычки удваиваются. В 1С это делается так: """" + СтрЗаменить(Поле, """", """""") + """". Для сложных выгрузок надёжнее сформировать табличный документ и сохранить его в формате Excel напрямую.

Работает ли СтрЗаменить на тонком и веб-клиенте?

Да, СтрЗаменить, Символ и КодСимвола доступны во всех режимах исполнения: толстый, тонкий, веб-клиент и сервер. Ограничений по контексту у этих функций нет.