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

Разработка и Конфигурация · 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Спецсимволы форматаКавычка ломает разметку атрибутов и строк
    Поисковый индекс, артикулыУдаление (пустая строка)Кавычки мешают сравнению и поиску
    Маршрут решения

    Как выбрать действие

    Данные уходят в CSV и должны читаться обратно без потерьУдваивайте кавычки и обрамляйте поле кавычками по правилам формата
    Кавычки обозначают дюймы в наименованиях для сайта или печатиЗаменяйте на апостроф — Символ(39), чтобы не потерять размер
    Кавычки мешают сравнению строк или поискуУдаляйте их заменой на пустую строку
    Формируется XML или JSON вручнуюЗаменяйте на сущности формата либо используйте объекты ЗаписьXML/ЗаписьJSON вместо конкатенации строк

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

    После замены результат проверяют поиском оставшихся вхождений: функция СтрНайти(Результат, Символ(34)) должна вернуть 0. Если кавычки остались — значит, в исходной строке были не те символы.

    Частая ловушка — «ёлочки» и другие типографские кавычки. В наименованиях, введённых пользователями или пришедших из Word, встречаются символы « (код 171), » (код 187), “ (код 8220), ” (код 8221). СтрЗаменить с Символ(34) их не затронет. Для полной очистки заменяют каждый вид отдельно:

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

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

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

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

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

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

    Ещё одна ошибка — применять замену к значениям, которые потом участвуют в запросах. Если параметр запроса передан как значение (через Запрос.УстановитьПараметр), кавычки в нём безопасны и заменять их не нужно: платформа сама корректно передаёт строку. Экранирование требуется только при небезопасной подстановке текста прямо в тело запроса — так делать вообще не следует.

    Альтернативы: регулярные выражения и внешние обработки

    Встроенного механизма регулярных выражений в языке 1С нет. Для сложных шаблонов (например, «заменить кавычки только внутри тегов») применяют либо посимвольный разбор с флагом состояния, либо подключают VBScript.RegExp через COM-объект на Windows-клиенте:

    // Только для толстого/тонкого клиента на Windows
    

    RegExp = Новый COMОбъект("VBScript.RegExp");

    RegExp.Global = Истина;

    RegExp.Pattern = """";

    Результат = RegExp.Replace(ИсходнаяСтрока, "'");

    Этот способ не работает на сервере под Linux и в веб-клиенте, поэтому для типовых замен достаточно СтрЗаменить — она быстрее и кроссплатформенна. Регулярные выражения оправданы только при сложных условиях поиска.

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

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

    Остались ли двойные кавычки
    Норма

    СтрНайти(Результат, Символ(34)) = 0

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

    Функция возвращает позицию больше 0 — кавычки остались или это типографские символы

    Корректность CSV-файла
    Норма

    Файл открывается в Excel, колонки не съезжают, кавычки в данных сохранены

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

    Строки разрываются, данные попадают не в те колонки

    Сохранность смысла наименований
    Норма

    Размеры в дюймах читаются через апостроф

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

    Размеры исчезли вместе с кавычками

    Синтаксис модуля
    Норма

    Модуль компилируется без ошибок

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

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

    FAQ

    Как вставить одну двойную кавычку в строку в коде 1С?

    Удвойте её внутри литерала: """" — это строка из одной кавычки. Более читаемый вариант — Символ(34): функция возвращает символ по коду Unicode, и в коде сразу видно намерение.

    Почему СтрЗаменить не меняет мою переменную?

    Функция не модифицирует исходную строку, а возвращает новую. Запись вида СтрЗаменить(Строка, Символ(34), "") без присвоения результата ничего не делает. Правильно: Строка = СтрЗаменить(Строка, Символ(34), "").

    Замена сработала, но часть кавычек осталась. Почему?

    В данных, скорее всего, типографские кавычки: «ёлочки» (коды 171, 187) или «лапки» (коды 8220, 8221). Это другие символы Unicode, и Символ(34) их не находит. Заменяйте каждый вид отдельным вызовом СтрЗаменить.

    Чем заменить кавычки при выгрузке на сайт?

    Обычно апострофом — Символ(39): дюймовые обозначения остаются понятными, а разметка не ломается. Полное удаление допустимо, только если кавычки не несут смысла, иначе потеряются размеры и характеристики.

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

    Нет. Если строка передаётся через Запрос.УстановитьПараметр(), платформа корректно обрабатывает любые символы. Экранирование требуется только при подстановке текста прямо в тело запроса конкатенацией — такой подход сам по себе является ошибкой и угрозой безопасности.

    Как заменить кавычки во всём текстовом файле целиком?

    Прочитайте файл через ЧтениеТекста в строку, примените СтрЗаменить к полученной строке и запишите результат обратно через ЗаписьТекста. Перед обработкой сделайте копию файла — обратной операции у замены нет.

    Итог

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

    Двойная кавычка в коде 1С задаётся удвоением ("") или через Символ(34). Замену выполняет СтрЗаменить, результат обязательно присваивают. Учитывайте типографские кавычки «» и “”, выбирайте символ-замену по назначению данных, а перед массовой обработкой делайте резервную копию.