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

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

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

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

Суть проблемы: почему кавычек так много?

В языке 1С строковый литерал ограничивается кавычками с обеих сторон. Например:

МояСтрока = "Привет, мир!";

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

Давайте посчитаем, сколько кавычек нам нужно написать в коде, чтобы получить строку, содержащую одну кавычку ":

  1. Открывающая кавычка строки.
  2. Сама кавычка (экранируемая), поэтому пишем две: "".
  3. Закрывающая кавычка строки.

Итого: """" (четыре символа) в коде равны одному символу " в значении переменной.

А теперь представим задачу автора: нам нужно найти две кавычки подряд "". Применяем арифметику экранирования:

  1. Две кавычки, которые мы ищем, нужно удвоить. Получаем четыре кавычки: """".
  2. Добавляем открывающую и закрывающую кавычки строкового литерала.

В результате получаем конструкцию из шести кавычек подряд.

Решение 1: Классическая замена через СтрЗаменить

Самый простой и быстрый способ, работающий на всех версиях платформы (7.7, 8.х) — это использование встроенной функции СтрЗаменить. По своей сути это базовая операция, такая же фундаментальная, как и простой поиск подстроки в строке. Основываясь на правиле шести кавычек, которое мы разобрали выше, решение выглядит следующим образом.

Нам нужно заменить подстроку "" (в коде это """""") на подстроку " (в коде это """").


// Наим - это исходная строка, например: 'Деталь ""Гайка""'
Наим = СтрЗаменить(Наим, """""", """");

Этот код найдет все вхождения двойных кавычек и превратит их в одинарные. Если в строке было 'Деталь ""Гайка""', то станет 'Деталь "Гайка"'.

Решение 2: Использование функции Символ (для читаемости)

Иногда конструкции из множества кавычек ("""""") трудно воспринимать визуально — легко ошибиться в их количестве. Чтобы сделать код более читаемым, мы можем использовать функцию Символ. Код кавычки в таблице Unicode (и ASCII) — 34.

Давайте перепишем решение с использованием этой функции. Это сделает логику более прозрачной для любого, кто будет читать ваш код впоследствии, даже если это пример примитивной автоматизации или скрипт разовой обработки.


Кавычка = Символ(34); // Это один символ "
ДвеКавычки = Кавычка + Кавычка; // Это строка ""

Наим = СтрЗаменить(Наим, ДвеКавычки, Кавычка);

Такой подход удобен, если вы формируете сложные запросы или JSON-строки вручную, где кавычки встречаются постоянно.

Решение 3: Замена любого количества повторяющихся кавычек

Что делать, если в строке встречается не две, а три (""") или четыре ("""") кавычки подряд? Функция СтрЗаменить сработает только один раз. Например, три кавычки превратятся в две (пара заменится на одну, третья останется). Если запустить замену еще раз, две оставшиеся превратятся в одну.

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


// Пока в строке есть хотя бы одна пара кавычек
Пока СтрНайти(Наим, """""") > 0 Цикл
    Наим = СтрЗаменить(Наим, """""", """");
КонецЦикла;

Этот алгоритм надежно "схлопнет" любую последовательность кавычек (хоть 10 подряд) в одну единственную.

Решение 4: Современный подход — Регулярные выражения (Platform 8.3.23+)

Начиная с версии платформы 8.3.23, в 1С появились нативные функции для работы с регулярными выражениями. Ранее для таких задач приходилось использовать внешние компоненты или подсистему для работы с регулярными выражениями. Теперь это можно решать элегантнее, без циклов и нагромождения кавычек.

Рассмотрим функцию СтрЗаменитьПоРегулярномуВыражению. Нам нужно составить шаблон, который означает "две и более кавычки". В регулярных выражениях квантификатор {2,} означает "от 2 до бесконечности раз".

Шаблон будет выглядеть так: "{2,}. Не забываем, что саму кавычку в шаблоне тоже нужно экранировать при написании строкового литерала в 1С.


// Ищем 2 и более кавычки подряд и меняем их на одну
// Шаблон в коде 1С: """{2,}"
// Строка замены: """"
Наим = СтрЗаменитьПоРегулярномуВыражению(Наим, """{2,}", """");

Этот метод является наиболее производительным и правильным, если вы работаете на свежих версиях платформы.

Дополнительная задача: Удаление повторяющихся символов (не только кавычек)

В обсуждении также была затронута интересная тема: как убрать повторы любых символов (например, превратить "аааББвв" в "аБв"). Простая замена здесь не подойдет, так как мы не знаем, какой именно символ будет дублироваться. Эта логика чем-то напоминает задачу, где реализуется отбор на соответствие шаблону, но с динамическим поиском дублей.

Давайте рассмотрим алгоритм, предложенный участниками обсуждения, который проходит по строке и удаляет дубликаты, игнорируя регистр букв, но сохраняя исходный регистр первого вхождения.


Функция УбратьПовторяющиесяБуквы(Знач ИсходнаяСтрока) Экспорт
    
    ИтоговаяСтрока = "";
    ПредыдущаяБуква = "";
    
    // Проходим по каждому символу строки по очереди
    Для Сч = 1 По СтрДлина(ИсходнаяСтрока) Цикл
        
        // Получаем текущий символ
        ТекущаяБуква = Сред(ИсходнаяСтрока, Сч, 1);
        
        // Сравниваем с предыдущим, приведя оба к нижнему регистру для надежности
        // Если буквы разные - добавляем в результат
        Если НРег(ТекущаяБуква) <> НРег(ПредыдущаяБуква) Тогда
            ИтоговаяСтрока = ИтоговаяСтрока + ТекущаяБуква;
            ПредыдущаяБуква = ТекущаяБуква;
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат ИтоговаяСтрока;
    
КонецФункции

Как это работает:

  1. Мы идем по строке слева направо.
  2. Запоминаем последний добавленный символ.
  3. Если новый символ совпадает с предыдущим — мы его пропускаем.
  4. Если отличается — добавляем в новую строку и обновляем "предыдущий".

Пример: строка "Гайка""". Сначала берем Г, потом а... доходим до первой ", добавляем её. Следующий символ снова " — он равен предыдущему, пропускаем. В итоге получаем очищенную строку.

Заключение

Мы выяснили, что для простой замены двойных кавычек на одинарные в 1С необходимо использовать конструкцию СтрЗаменить(Текст, """""", """"). Это связано с тем, что каждая кавычка внутри строки должна экранироваться другой кавычкой.

Для более сложных случаев, когда количество кавычек неизвестно или велико, лучше использовать цикл Пока или, если позволяет версия платформы, функцию СтрЗаменитьПоРегулярномуВыражению.

← На главную