Разработка и Конфигурация · 10 мин
Как заменить кавычки в строке в 1С
Как заменить кавычки в строке в 1С: функция СтрЗаменить, экранирование двойных кавычек, работа с кавычками-ёлочками, примеры кода и типичные ошибки.
Замена кавычек в строке — типовая задача при разработке на встроенном языке 1С: она возникает при формировании XML и JSON, выгрузке данных в CSV, подготовке текстов запросов и очистке пользовательского ввода. Основная сложность состоит в том, что двойная кавычка в 1С является служебным символом: она обозначает границу строкового литерала, поэтому просто написать её внутри строки нельзя.
Встроенный язык 1С предлагает несколько инструментов для решения задачи: функцию СтрЗаменить, экранирование кавычек удвоением, функцию Символ с кодом 34, а также конструкцию СтрШаблон для сложных случаев. Выбор зависит от того, какие именно кавычки нужно заменить (прямые или типографские «ёлочки») и куда дальше пойдёт строка — в файл, в запрос или на печать.
Ниже разобраны рабочие приёмы с готовыми примерами кода, особенности платформы 8.3 и ошибки, которые чаще всего приводят к синтаксическим ошибкам или «битым» выгрузкам.
Почему кавычка в 1С — особый символ
Во встроенном языке 1С строковые литералы заключаются в двойные кавычки: "Текст". Поэтому, если нужно поместить саму кавычку внутрь строки, компилятор воспримет её как конец литерала и выдаст ошибку «Ожидается символ ';'» или подобную.
Чтобы включить двойную кавычку в строку, её нужно удвоить. Запись "Он сказал: ""Привет""" означает строку: Он сказал: "Привет". Это первое правило, без понимания которого любая замена кавычек превращается в борьбу с синтаксическими ошибками.
Второй нюанс — кавычки бывают разными. Прямая двойная кавычка (код 34), одиночная (код 39), типографские «ёлочки» (коды 171 и 187), «лапки» (коды 132 и 147) — это разные символы. Если пользователь вставил текст из Word, в нём почти наверняка будут «ёлочки» или «лапки», и замена обычной кавычки их не затронет.
Базовый способ: функция СтрЗаменить
Функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены) заменяет все вхождения подстроки и возвращает новую строку. Исходная строка не изменяется — результат нужно присвоить переменной.
Пример замены двойных кавычек на одиночные:
Текст = "Название товара: ""Кресло офисное""";
Результат = СтрЗаменить(Текст, """", "'");
// Результат: Название товара: 'Кресло офисное'
Обратите внимание на конструкцию """" — четыре кавычки подряд. Первые две открывают литерал и задают символ кавычки, третья и четвёртая закрывают литерал. Это самое частое место ошибки у начинающих разработчиков.
Чтобы полностью удалить кавычки, передайте пустую строку в качестве замены:
Результат = СтрЗаменить(Текст, """", "");
- 1Определите, какие именно кавычки в строке: прямые (код 34), одиночные (39) или типографские (171/187)
- 2Напишите вызов СтрЗаменить с удвоенной кавычкой в параметре поиска: """"
- 3Передайте строку замены: одиночную кавычку, пробел или пустую строку
- 4Присвойте результат переменной — исходная строка не изменяется
- 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 Тогда
Сообщить("В строке остались двойные кавычки");
КонецЕсли;
Для диагностики неизвестных символов используйте КодСимвола(): пройдите по строке циклом и выведите коды подозрительных позиций. Это быстрее, чем гадать, какая именно кавычка пришла из внешнего файла.
Сравнение способов замены
Разные приёмы уместны в разных ситуациях. Сводная таблица поможет выбрать подходящий.
| Способ | Когда применять | Ограничение |
|---|---|---|
| СтрЗаменить с """" | Разовая замена прямых кавычек | Плохо читается в сложных выражениях |
| СтрЗаменить + Символ(34) | Множественные замены, разные виды кавычек | Нужно знать коды символов |
| Параметры запроса | Передача строк в запрос | Не применимо вне запросов |
| ЗаписьXML / ЗаписьJSON | Формирование файлов обмена | Требует работы через объектную модель |
Сравнение вариантов
Быстрый вариант для одной-двух замен; минус — низкая читаемость конструкции """
Наглядно при массовой очистке текста от разных видов кавычек; требует знания кодов Unicode
Самый надёжный путь для запросов и файлов обмена; ручная замена вообще не нужна
В большинстве прикладных задач достаточно первого или второго варианта. Третий следует считать обязательным там, где строка уходит в запрос или в структурированный файл — это устраняет целый класс ошибок ещё до их появления.
Что важно запомнить
Кавычка внутри строки 1С пишется удвоенной (""), а замена выполняется функцией СтрЗаменить. Для читаемости используйте Символ(34). Проверяйте, какие именно кавычки в исходном тексте, и не экранируйте вручную там, где работают параметры запроса и штатные средства записи XML/JSON.
Частые вопросы
Почему СтрЗаменить не заменяет кавычки, хотя код написан верно?
Скорее всего, в строке не прямые кавычки (код 34), а типографские «ёлочки» или «лапки» — например, текст скопирован из Word. Определите код символа функцией КодСимвола() и заменяйте именно его через Символ(171), Символ(187) и т.д.
Как добавить кавычки вокруг строки, а не заменить их?
Используйте конкатенацию с удвоенными кавычками: Результат = """" + Текст + """"; — либо функцию СтрШаблон: СтрШаблон(""%1"", Текст). Оба варианта обрамляют значение прямыми кавычками.
Можно ли заменить кавычки сразу во всех элементах справочника?
Да, но только программно: обход выборки в цикле, замена значения реквизита и запись объекта в транзакции. Перед массовой обработкой сделайте резервную копию базы и сначала протестируйте код на одном элементе, поскольку изменение наименований может повлиять на поиск и синхронизацию данных.
Чем отличается СтрЗаменить от ПодставитьПараметрыВСтроку?
СтрЗаменить ищет и заменяет конкретную подстроку в готовом тексте. ПодставитьПараметрыВСтроку (и СтрШаблон) работают наоборот: вставляют значения в шаблон с местозаполнителями %1, %2 и т.д. Для замены кавычек нужна именно СтрЗаменить.
Как выгрузить строку с кавычками в CSV, чтобы Excel открыл её корректно?
По стандарту CSV поле, содержащее кавычки или разделитель, заключается в двойные кавычки, а внутренние кавычки удваиваются. В 1С это делается так: """" + СтрЗаменить(Поле, """", """""") + """". Для сложных выгрузок надёжнее сформировать табличный документ и сохранить его в формате Excel напрямую.
Работает ли СтрЗаменить на тонком и веб-клиенте?
Да, СтрЗаменить, Символ и КодСимвола доступны во всех режимах исполнения: толстый, тонкий, веб-клиент и сервер. Ограничений по контексту у этих функций нет.