В практике программирования на платформе 1С:Предприятие мы часто сталкиваемся с задачами обработки строковых данных. Это может быть как сложный подсчет количества слов в тексте, так и банальная очистка введенных пользователем значений. Одна из самых распространенных и в то же время запутывающих ситуаций — это работа с кавычками внутри строк. Особенно часто эта проблема возникает при загрузке номенклатуры или контрагентов из внешних файлов (например, CSV или Excel), где кавычки могут дублироваться из-за особенностей формата.
Давайте подробно разберем, как правильно написать код для замены двух кавычек на одну, почему синтаксис 1С требует такого количества кавычек подряд, и рассмотрим современные методы решения этой задачи, включая регулярные выражения.
В языке 1С строковый литерал ограничивается кавычками с обеих сторон. Например:
МояСтрока = "Привет, мир!";
Однако, если внутри самой строки нам нужно использовать символ кавычки, возникает конфликт: платформа может воспринять внутреннюю кавычку как конец строки. Чтобы этого не произошло, в 1С принято правило экранирования: любая кавычка внутри строки должна быть удвоена.
Давайте посчитаем, сколько кавычек нам нужно написать в коде, чтобы получить строку, содержащую одну кавычку ":
"".Итого: """" (четыре символа) в коде равны одному символу " в значении переменной.
А теперь представим задачу автора: нам нужно найти две кавычки подряд "". Применяем арифметику экранирования:
"""".В результате получаем конструкцию из шести кавычек подряд.
Самый простой и быстрый способ, работающий на всех версиях платформы (7.7, 8.х) — это использование встроенной функции СтрЗаменить. По своей сути это базовая операция, такая же фундаментальная, как и простой поиск подстроки в строке. Основываясь на правиле шести кавычек, которое мы разобрали выше, решение выглядит следующим образом.
Нам нужно заменить подстроку "" (в коде это """""") на подстроку " (в коде это """").
// Наим - это исходная строка, например: 'Деталь ""Гайка""'
Наим = СтрЗаменить(Наим, """""", """");
Этот код найдет все вхождения двойных кавычек и превратит их в одинарные. Если в строке было 'Деталь ""Гайка""', то станет 'Деталь "Гайка"'.
Иногда конструкции из множества кавычек ("""""") трудно воспринимать визуально — легко ошибиться в их количестве. Чтобы сделать код более читаемым, мы можем использовать функцию Символ. Код кавычки в таблице Unicode (и ASCII) — 34.
Давайте перепишем решение с использованием этой функции. Это сделает логику более прозрачной для любого, кто будет читать ваш код впоследствии, даже если это пример примитивной автоматизации или скрипт разовой обработки.
Кавычка = Символ(34); // Это один символ "
ДвеКавычки = Кавычка + Кавычка; // Это строка ""
Наим = СтрЗаменить(Наим, ДвеКавычки, Кавычка);
Такой подход удобен, если вы формируете сложные запросы или JSON-строки вручную, где кавычки встречаются постоянно.
Что делать, если в строке встречается не две, а три (""") или четыре ("""") кавычки подряд? Функция СтрЗаменить сработает только один раз. Например, три кавычки превратятся в две (пара заменится на одну, третья останется). Если запустить замену еще раз, две оставшиеся превратятся в одну.
Если мы не знаем точно, сколько мусорных кавычек в строке, но хотим оставить только одну (например, чтобы подготовить данные под интеллектуальное сравнение строк), нам поможет цикл. Мы будем заменять двойные кавычки на одинарные до тех пор, пока в строке остаются двойные кавычки.
// Пока в строке есть хотя бы одна пара кавычек
Пока СтрНайти(Наим, """""") > 0 Цикл
Наим = СтрЗаменить(Наим, """""", """");
КонецЦикла;
Этот алгоритм надежно "схлопнет" любую последовательность кавычек (хоть 10 подряд) в одну единственную.
Начиная с версии платформы 8.3.23, в 1С появились нативные функции для работы с регулярными выражениями. Ранее для таких задач приходилось использовать внешние компоненты или подсистему для работы с регулярными выражениями. Теперь это можно решать элегантнее, без циклов и нагромождения кавычек.
Рассмотрим функцию СтрЗаменитьПоРегулярномуВыражению. Нам нужно составить шаблон, который означает "две и более кавычки". В регулярных выражениях квантификатор {2,} означает "от 2 до бесконечности раз".
Шаблон будет выглядеть так: "{2,}. Не забываем, что саму кавычку в шаблоне тоже нужно экранировать при написании строкового литерала в 1С.
// Ищем 2 и более кавычки подряд и меняем их на одну
// Шаблон в коде 1С: """{2,}"
// Строка замены: """"
Наим = СтрЗаменитьПоРегулярномуВыражению(Наим, """{2,}", """");
Этот метод является наиболее производительным и правильным, если вы работаете на свежих версиях платформы.
В обсуждении также была затронута интересная тема: как убрать повторы любых символов (например, превратить "аааББвв" в "аБв"). Простая замена здесь не подойдет, так как мы не знаем, какой именно символ будет дублироваться. Эта логика чем-то напоминает задачу, где реализуется отбор на соответствие шаблону, но с динамическим поиском дублей.
Давайте рассмотрим алгоритм, предложенный участниками обсуждения, который проходит по строке и удаляет дубликаты, игнорируя регистр букв, но сохраняя исходный регистр первого вхождения.
Функция УбратьПовторяющиесяБуквы(Знач ИсходнаяСтрока) Экспорт
ИтоговаяСтрока = "";
ПредыдущаяБуква = "";
// Проходим по каждому символу строки по очереди
Для Сч = 1 По СтрДлина(ИсходнаяСтрока) Цикл
// Получаем текущий символ
ТекущаяБуква = Сред(ИсходнаяСтрока, Сч, 1);
// Сравниваем с предыдущим, приведя оба к нижнему регистру для надежности
// Если буквы разные - добавляем в результат
Если НРег(ТекущаяБуква) <> НРег(ПредыдущаяБуква) Тогда
ИтоговаяСтрока = ИтоговаяСтрока + ТекущаяБуква;
ПредыдущаяБуква = ТекущаяБуква;
КонецЕсли;
КонецЦикла;
Возврат ИтоговаяСтрока;
КонецФункции
Как это работает:
Пример: строка "Гайка""". Сначала берем Г, потом а... доходим до первой ", добавляем её. Следующий символ снова " — он равен предыдущему, пропускаем. В итоге получаем очищенную строку.
Мы выяснили, что для простой замены двойных кавычек на одинарные в 1С необходимо использовать конструкцию СтрЗаменить(Текст, """""", """"). Это связано с тем, что каждая кавычка внутри строки должна экранироваться другой кавычкой.
Для более сложных случаев, когда количество кавычек неизвестно или велико, лучше использовать цикл Пока или, если позволяет версия платформы, функцию СтрЗаменитьПоРегулярномуВыражению.