Как заменить одинарные и двойные кавычки в строке 1С: подробное руководство

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С программисты часто сталкиваются с необходимостью обработки строк, содержащих специальные символы. Одним из самых коварных символов является кавычка. Трудности возникают как при попытке заменить стандартную двойную кавычку, которая сама является ограничителем строки в коде, так и при работе с одинарными кавычками (апострофами), которые часто встречаются во внешних данных или SQL-запросах. В этой статье мы подробно разберем все способы решения этой задачи, проанализируем нюансы экранирования и рассмотрим лучшие практики написания читаемого кода.

Метод 1: Использование стандартной функции СтрЗаменить

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

Если нам нужно заменить одинарную кавычку (апостроф ') на двойную кавычку ", мы должны четко понимать, как эти символы воспринимаются компилятором 1С. Разберем пример кода:


ОрдинарнаяКавычка = "'"; // Символ апострофа внутри двойных кавычек
Кавычка = """";          // Экранированная двойная кавычка
Результат = СтрЗаменить(ИсходнаяСтрока, ОрдинарнаяКавычка, Кавычка);

Важный нюанс: Обратите внимание на переменную Кавычка. В языке 1С двойная кавычка внутри строкового литерала всегда экранируется еще одной кавычкой. Таким образом, чтобы записать строку, состоящую из одного символа ", нам нужно поставить две кавычки внутри открывающей и закрывающей кавычек. Итого получается четыре символа подряд.

Метод 2: Работа через коды символов (ASCII)

Чтобы избежать путаницы с количеством кавычек в коде и сделать его более «чистым» и понятным для коллег, мы рекомендуем использовать функцию Символ. Этот метод позволяет обращаться к символу напрямую по его коду в таблице символов. Для двойной кавычки это код 34, для одинарной — 39.

Рассмотрим ситуацию, когда нам нужно заменить все двойные кавычки на их удвоенный вариант (частая задача при формировании CSV-файлов или сложных строковых команд). Проанализируем, как это выглядит в коде:


КодКавычки = 34;
СимволКавычки = Символ(КодКавычки);
СтрокаЗамены = СимволКавычки + СимволКавычки;

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

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

Метод 3: Подготовка данных для SQL-запросов (ADO)

Часто замена одинарных кавычек требуется при интеграции 1С с внешними базами данных через интерфейс ADO. В языке SQL одинарная кавычка ' является системным ограничителем. Если в передаваемой строке (например, в фамилии «О’Генри») встречается этот символ, SQL-сервер вернет ошибку синтаксиса или, что еще хуже, возникнет уязвимость типа SQL-инъекции.

Разберем, как правильно экранировать такие данные. В SQL кавычка экранируется путем ее удвоения. Посмотрим на реализацию функции подготовки строки:


Функция ПодготовитьСтрокуДляSQL(Знач ИсхТекст) Экспорт
    // Заменяем одну одинарную кавычку на две одинарных
    Возврат СтрЗаменить(ИсхТекст, "'", "''");
КонецФункции

При использовании этого метода строка О'Генри превратится в О''Генри, что позволит SQL-серверу корректно воспринять текст как единое значение.

Метод 4: Сложная замена с помощью регулярных выражений

В случаях, когда простая замена СтрЗаменить не справляется (например, если нужно заменить кавычки только в определенных словах или игнорировать те, что уже экранированы), мы можем использовать объект VBScript.RegExp. Этот метод требует обращения к COM-объектам Windows, но он крайне эффективен для сложных парсеров текста.

Проанализируем пример использования регулярных выражений для замены кавычек:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
RegExp.MultiLine = Истина;

// Шаблон для поиска кавычек, перед которыми нет пробела
RegExp.Pattern = "([^\s])"""; 
Результат = RegExp.Replace(ИсходнаяСтрока, "$1''");

Использование регулярных выражений позволяет гибко настраивать логику поиска, учитывая контекст (пробелы, знаки препинания, начало или конец строки).

Метод 5: Работа с форматами JSON и XML

Если ваша задача — передача данных в веб-сервисы, важно помнить, что ручная замена кавычек через СтрЗаменить в этих форматах является плохим тоном и может привести к ошибкам валидации. Платформа 1С предоставляет встроенные инструменты, которые делают это автоматически.

Для формата JSON:

Используйте объект ЗаписьJSON. Он автоматически преобразует все запрещенные символы (включая кавычки) в корректные escape-последовательности (например, " превратится в \").

Для формата XML:

Объект ЗаписьXML самостоятельно заменит кавычки на специальные сущности " или ' в соответствии со стандартом.


Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Запись.ЗаписатьАтрибут("Название", "Текст с ""кавычками""");
Результат = Запись.Закрыть(); // Платформа сама сделает замену символов

Метод 6: Проблема типографских («умных») кавычек

Часто в систему попадают тексты, скопированные из Microsoft Word или других текстовых редакторов. В таких текстах используются не прямые программные кавычки, а типографские: «елочки» или „лапки“. СтрЗаменить не увидит их, если искать только стандартную кавычку ".

Выясним причину, почему это важно: при поиске по строке или выгрузке в другие системы такие символы могут превратиться в «кракозябры» из-за разницы кодировок. Для нормализации текста мы рекомендуем выполнять массив замен по списку кодов:

  1. Символ(171) и Символ(187) — «елочки»
  2. Символ(8220) и Символ(8221) — верхние парные кавычки
  3. Символ(8222) — нижняя лапка

Рассмотрим, как реализовать комплексную очистку текста:


МассивКавычек = Новый Массив;
МассивКавычек.Добавить(Символ(171));  // «
МассивКавычек.Добавить(Символ(187));  // »
МассивКавычек.Добавить(Символ(8220)); // “
МассивКавычек.Добавить(Символ(8221)); // ”

Для Каждого ТекСимвол Из МассивКавычек Цикл
    Текст = СтрЗаменить(Текст, ТекСимвол, """");
КонецЦикла;

Вопросы производительности

Напоследок проанализируем ситуацию с производительностью. Функция СтрЗаменить реализована на уровне платформы и работает очень быстро. Однако стоит помнить, что строки в 1С являются неизменяемыми объектами. Это означает, что при каждой замене в памяти создается новая копия строки. Если вы обрабатываете файл размером в несколько десятков мегабайт, многократный вызов СтрЗаменить в цикле может привести к существенным задержкам.

В таких случаях лучше использовать объект ЧтениеТекста и ЗаписьТекста, обрабатывая данные порциями, или подготавливать данные один раз перед записью в базу данных.

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

← На главную