При обработке текстовой информации, импорте данных или нормализации наименований контрагентов и номенклатуры разработчики часто сталкиваются с задачей очистки текста от лишних символов. Одной из типичных проблем является удаление типографских кавычек (так называемых «ёлочек» — « и »). Разберем причины, по которым стандартная замена может не срабатывать с первого раза, и рассмотрим надежные способы решения этой задачи.
Проанализируем распространенные ошибки, которые возникают при попытке удалить кавычки из текста:
Символы: В платформе 1С глобальный объект Символы содержит только строго определенный набор управляющих символов: ВК (возврат каретки), ПС (перевод строки), Таб (табуляция), НПП (неразрывный пробел) и некоторые другие. Попытка вызвать несуществующее свойство вроде Символы."«" приводит к синтаксической ошибке на этапе выполнения.СтрЗаменить записывается в новую переменную, а во второй вызов передается исходная строка, первая замена полностью аннулируется.„ “ ”, угловые скобки ‹ › или знаки сравнения << и >>). Если код символа в строке не совпадает с литералом в коде, замена не произойдет.Выясним причину популярности этого метода: использование кодов символов защищает исходный код от проблем с кодировками файлов конфигурации и исключает ошибки визуального восприятия кавычек в редакторе модулей.
Кавычки-ёлочки имеют следующие коды:
« — код 171 (шестнадцатеричный 0x00AB).» — код 187 (шестнадцатеричный 0x00BB).Посмотрим на пример удаления обеих кавычек через вложенный вызов функций:
ИсходнаяСтрока = "Детский туберкулёзный санаторий «Петродворец»";
// Выполняем последовательную замену открывающей и закрывающей кавычки
Результат = СтрЗаменить(СтрЗаменить(ИсходнаяСтрока, Символ(171), ""), Символ(187), "");
// Результат: "Детский туберкулёзный санаторий Петродворец"
Функция СтрЗаменить прекрасно работает с прямыми строковыми литералами. Главное — правильно выстроить последовательность вызовов или использовать вложенность. Если вместе с ёлочками требуется удалить и обычную двойную кавычку ", помним, что внутри строкового литерала 1С она экранируется удвоением.
Разберем по шагам очистку строки от разных видов кавычек:
СтрокаОбработки = "ООО «Торговый дом ""Северный""»";
// Удаляем кавычки-елочки
Результат = СтрЗаменить(СтрокаОбработки, "«", "");
Результат = СтрЗаменить(Результат, "»", "");
// Удаляем стандартные двойные кавычки (экранируются как """")
Результат = СтрЗаменить(Результат, """", "");
// Результат: "ООО Торговый дом Северный"
Начиная с версии платформы 8.3.23, в 1С появилась встроенная поддержка регулярных выражений. Это наиболее компактный и производительный способ, когда требуется за один вызов очистить строку сразу от целого набора различных кавычек и спецсимволов.
Рассмотрим пример использования метода глобального контекста СтрЗаменитьПоРегулярномуВыражению:
ИсходнаяСтрока = "Санаторий «Петродворец» / ""Южный""";
// В квадратных скобках перечисляем все варианты кавычек, подлежащих удалению
ШаблонКавычек = "[«»""„“”‹›]";
Результат = СтрЗаменитьПоРегулярномуВыражению(ИсходнаяСтрока, ШаблонКавычек, "");
// Результат: "Санаторий Петродворец / Южный"
Если конфигурация работает на платформе ниже 8.3.23 под управлением операционной системы Windows, можно задействовать COM-объект регулярных выражений.
РегВыр = Новый COMОбъект("VBScript.RegExp");
РегВыр.Global = Истина;
РегВыр.IgnoreCase = Истина;
РегВыр.Pattern = "[«»""]";
ИсходнаяСтрока = "Санаторий «Петродворец»";
Результат = РегВыр.Replace(ИсходнаяСтрока, "");
Важный нюанс: данный способ не является кроссплатформенным и вызовет исключение при выполнении на сервере под управлением Linux. Для кроссплатформенного кода на старых версиях платформы рекомендуется использовать функции СтрЗаменить или посимвольный перебор строки.