Разработка и Конфигурация · 10 мин
Как заменить двойную кавычку в 1С
Как заменить двойную кавычку в 1С: функция СтрЗаменить, экранирование кавычек в строковых литералах, Символ(34), обработка CSV и типичные ошибки разработчика.
Замена двойной кавычки в строке — частая задача при выгрузке данных в CSV, формировании XML и JSON, очистке наименований номенклатуры перед обменом с сайтом. Сложность в том, что кавычка в языке 1С является служебным символом: она открывает и закрывает строковый литерал, поэтому записать её «как есть» в коде нельзя.
Решается задача двумя способами: удвоением кавычки внутри строкового литерала ("""" — это строка из одной кавычки) или через функцию Символ(34), где 34 — код двойной кавычки в Unicode. Оба варианта корректны и дают одинаковый результат, выбор зависит от читаемости кода.
Ниже разобраны рабочие примеры кода, нюансы для конфигураций на обычных и управляемых формах, обработка файлов и ошибки, из-за которых замена «молча» не срабатывает.
Базовый синтаксис: СтрЗаменить и способы задать кавычку
Основной инструмент — функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены). Она заменяет все вхождения подстроки и возвращает новую строку: исходная переменная не изменяется, результат нужно присвоить.
Кавычку как аргумент можно задать тремя способами:
// Способ 1. Удвоенная кавычка в литерале
Результат = СтрЗаменить(Наименование, """", "'");
// Способ 2. Через код символа (рекомендуется)
Результат = СтрЗаменить(Наименование, Символ(34), Символ(39));
// Способ 3. Удаление кавычек (замена на пустую строку)
Результат = СтрЗаменить(Наименование, Символ(34), "");
Второй способ с Символ(34) предпочтителен: конструкция из четырёх кавычек подряд трудно читается, легко ошибиться в их количестве, а редактор кода и подсветка синтаксиса иногда «путаются» в таких литералах. Код 34 — стабильный идентификатор двойной кавычки, одинаковый во всех версиях платформы.
Как удвоение кавычек работает в строковых литералах
В языке 1С действует правило: чтобы внутри строки получить одну кавычку, её нужно написать дважды. Отсюда неочевидные комбинации:
""""— строка из одной двойной кавычки;"Кабель 2""5 мм"— строкаКабель 2"5 мм;""""""— строка из двух кавычек подряд.
Типичная ошибка — посчитать, что """ (три кавычки) означает кавычку. На самом деле это незакрытый литерал: первая кавычка открывает строку, две следующие дают одну кавычку в значении, но закрывающей кавычки нет — компилятор выдаст синтаксическую ошибку. Правило простое: общее число кавычек в литерале должно быть чётным.
Если в коде нужно сравнить символ с кавычкой, например при посимвольном разборе, сравнение тоже записывают через удвоение или Символ(34):
Если Сред(Строка, Позиция, 1) = Символ(34) Тогда
// найдена двойная кавычка
КонецЕсли;
Практические сценарии замены
Очистка наименований перед выгрузкой
Наименования товаров часто содержат кавычки: «Труба стальная 2"», «Гвоздь 3"5». При выгрузке в CSV или на сайт такие символы ломают разметку. Перед записью в файл наименование обрабатывают:
ЧистоеНаименование = СтрЗаменить(Номенклатура.Наименование, Символ(34), Символ(39));
Замена на апостроф сохраняет смысл (дюймовое обозначение остаётся читаемым), а удаление кавычки совсем может исказить значение: «Труба 2"» превратится в «Труба 2», и размер потеряется.
Экранирование при формировании CSV
В формате CSV поле, содержащее кавычки или разделитель, заключается в кавычки, а внутренние кавычки удваиваются. Правильное формирование поля:
Поле = СтрЗаменить(Значение, Символ(34), Символ(34) + Символ(34));
СтрокаCSV = """" + Поле + """";
Здесь каждая кавычка внутри значения заменяется на две, а всё поле обрамляется кавычками. Если просто удалить кавычки, файл откроется, но данные исказятся; если не удвоить — сторонняя программа «разорвёт» поле и сместит колонки.
Замена в многострочном тексте и файлах
Для текстового документа (например, загруженного файла обмена) сначала читают весь текст, затем применяют СтрЗаменить к нему целиком — это корректно работает с любым объёмом:
Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Содержимое = Текст.Прочитать();
Текст.Закрыть();
Содержимое = СтрЗаменить(Содержимое, Символ(34), "");
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Запись.Записать(Содержимое);
Запись.Закрыть();
Выбор символа-замены и условия применения
Чем заменить кавычку, зависит от того, куда уйдут данные:
| Куда выгружаются данные | Рекомендуемая замена | Причина |
|---|---|---|
| CSV, Excel | Удвоение кавычки | Стандарт формата, данные сохраняются полностью |
| Сайт, наименования | Апостроф (Символ(39)) | Сохраняет смысл дюймовых обозначений |
| XML, JSON | Спецсимволы формата | Кавычка ломает разметку атрибутов и строк |
| Поисковый индекс, артикулы | Удаление (пустая строка) | Кавычки мешают сравнению и поиску |
Как выбрать действие
Проверка результата и типичные ошибки
После замены результат проверяют поиском оставшихся вхождений: функция СтрНайти(Результат, Символ(34)) должна вернуть 0. Если кавычки остались — значит, в исходной строке были не те символы.
Частая ловушка — «ёлочки» и другие типографские кавычки. В наименованиях, введённых пользователями или пришедших из Word, встречаются символы « (код 171), » (код 187), “ (код 8220), ” (код 8221). СтрЗаменить с Символ(34) их не затронет. Для полной очистки заменяют каждый вид отдельно:
Результат = СтрЗаменить(Исходная, Символ(171), ""); // «
Результат = СтрЗаменить(Результат, Символ(187), ""); // »
Результат = СтрЗаменить(Результат, Символ(8220), "");
Результат = СтрЗаменить(Результат, Символ(8221), "");
Результат = СтрЗаменить(Результат, Символ(34), "");
Ещё одна ошибка — применять замену к значениям, которые потом участвуют в запросах. Если параметр запроса передан как значение (через Запрос.УстановитьПараметр), кавычки в нём безопасны и заменять их не нужно: платформа сама корректно передаёт строку. Экранирование требуется только при небезопасной подстановке текста прямо в тело запроса — так делать вообще не следует.
Альтернативы: регулярные выражения и внешние обработки
Встроенного механизма регулярных выражений в языке 1С нет. Для сложных шаблонов (например, «заменить кавычки только внутри тегов») применяют либо посимвольный разбор с флагом состояния, либо подключают VBScript.RegExp через COM-объект на Windows-клиенте:
// Только для толстого/тонкого клиента на Windows
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = """";
Результат = RegExp.Replace(ИсходнаяСтрока, "'");
Этот способ не работает на сервере под Linux и в веб-клиенте, поэтому для типовых замен достаточно СтрЗаменить — она быстрее и кроссплатформенна. Регулярные выражения оправданы только при сложных условиях поиска.
Как проверить результат
СтрНайти(Результат, Символ(34)) = 0
Функция возвращает позицию больше 0 — кавычки остались или это типографские символы
Файл открывается в Excel, колонки не съезжают, кавычки в данных сохранены
Строки разрываются, данные попадают не в те колонки
Размеры в дюймах читаются через апостроф
Размеры исчезли вместе с кавычками
Модуль компилируется без ошибок
Ошибка 'Ожидается символ' рядом с литералом из кавычек
FAQ
Как вставить одну двойную кавычку в строку в коде 1С?
Удвойте её внутри литерала: """" — это строка из одной кавычки. Более читаемый вариант — Символ(34): функция возвращает символ по коду Unicode, и в коде сразу видно намерение.
Почему СтрЗаменить не меняет мою переменную?
Функция не модифицирует исходную строку, а возвращает новую. Запись вида СтрЗаменить(Строка, Символ(34), "") без присвоения результата ничего не делает. Правильно: Строка = СтрЗаменить(Строка, Символ(34), "").
Замена сработала, но часть кавычек осталась. Почему?
В данных, скорее всего, типографские кавычки: «ёлочки» (коды 171, 187) или «лапки» (коды 8220, 8221). Это другие символы Unicode, и Символ(34) их не находит. Заменяйте каждый вид отдельным вызовом СтрЗаменить.
Чем заменить кавычки при выгрузке на сайт?
Обычно апострофом — Символ(39): дюймовые обозначения остаются понятными, а разметка не ломается. Полное удаление допустимо, только если кавычки не несут смысла, иначе потеряются размеры и характеристики.
Нужно ли экранировать кавычки в параметрах запроса?
Нет. Если строка передаётся через Запрос.УстановитьПараметр(), платформа корректно обрабатывает любые символы. Экранирование требуется только при подстановке текста прямо в тело запроса конкатенацией — такой подход сам по себе является ошибкой и угрозой безопасности.
Как заменить кавычки во всём текстовом файле целиком?
Прочитайте файл через ЧтениеТекста в строку, примените СтрЗаменить к полученной строке и запишите результат обратно через ЗаписьТекста. Перед обработкой сделайте копию файла — обратной операции у замены нет.
Что важно запомнить
Двойная кавычка в коде 1С задаётся удвоением ("") или через Символ(34). Замену выполняет СтрЗаменить, результат обязательно присваивают. Учитывайте типографские кавычки «» и “”, выбирайте символ-замену по назначению данных, а перед массовой обработкой делайте резервную копию.