Как убрать кавычки-ёлочки и спецсимволы из строки в 1С

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

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

Анализ типичных ошибок при работе со строками

Проанализируем распространенные ошибки, которые возникают при попытке удалить кавычки из текста:

  1. Некорректное обращение к объекту Символы: В платформе 1С глобальный объект Символы содержит только строго определенный набор управляющих символов: ВК (возврат каретки), ПС (перевод строки), Таб (табуляция), НПП (неразрывный пробел) и некоторые другие. Попытка вызвать несуществующее свойство вроде Символы."«" приводит к синтаксической ошибке на этапе выполнения.
  2. Потеря промежуточного результата при цепочке замен: Если результат первой функции СтрЗаменить записывается в новую переменную, а во второй вызов передается исходная строка, первая замена полностью аннулируется.
  3. Различие похожих символов в Unicode: Визуально похожие символы могут иметь совершенно разные коды (например, кавычки-лапки „ “ ”, угловые скобки ‹ › или знаки сравнения << и >>). Если код символа в строке не совпадает с литералом в коде, замена не произойдет.

Способ 1. Замена символов по их кодам (функция Символ)

Выясним причину популярности этого метода: использование кодов символов защищает исходный код от проблем с кодировками файлов конфигурации и исключает ошибки визуального восприятия кавычек в редакторе модулей.

Кавычки-ёлочки имеют следующие коды:

  1. Открывающая кавычка « — код 171 (шестнадцатеричный 0x00AB).
  2. Закрывающая кавычка » — код 187 (шестнадцатеричный 0x00BB).

Посмотрим на пример удаления обеих кавычек через вложенный вызов функций:


ИсходнаяСтрока = "Детский туберкулёзный санаторий «Петродворец»";

// Выполняем последовательную замену открывающей и закрывающей кавычки
Результат = СтрЗаменить(СтрЗаменить(ИсходнаяСтрока, Символ(171), ""), Символ(187), "");

// Результат: "Детский туберкулёзный санаторий Петродворец"

Способ 2. Использование прямых строковых литералов

Функция СтрЗаменить прекрасно работает с прямыми строковыми литералами. Главное — правильно выстроить последовательность вызовов или использовать вложенность. Если вместе с ёлочками требуется удалить и обычную двойную кавычку ", помним, что внутри строкового литерала 1С она экранируется удвоением.

Разберем по шагам очистку строки от разных видов кавычек:


СтрокаОбработки = "ООО «Торговый дом ""Северный""»";

// Удаляем кавычки-елочки
Результат = СтрЗаменить(СтрокаОбработки, "«", "");
Результат = СтрЗаменить(Результат, "»", "");

// Удаляем стандартные двойные кавычки (экранируются как """")
Результат = СтрЗаменить(Результат, """", "");

// Результат: "ООО Торговый дом Северный"

Способ 3. Использование регулярных выражений (платформа 8.3.23 и выше)

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

Рассмотрим пример использования метода глобального контекста СтрЗаменитьПоРегулярномуВыражению:


ИсходнаяСтрока = "Санаторий «Петродворец» / ""Южный""";

// В квадратных скобках перечисляем все варианты кавычек, подлежащих удалению
ШаблонКавычек = "[«»""„“”‹›]";
Результат = СтрЗаменитьПоРегулярномуВыражению(ИсходнаяСтрока, ШаблонКавычек, "");

// Результат: "Санаторий Петродворец / Южный"

Способ 4. Очистка через VBScript.RegExp (для более ранних версий под Windows)

Если конфигурация работает на платформе ниже 8.3.23 под управлением операционной системы Windows, можно задействовать COM-объект регулярных выражений.


РегВыр = Новый COMОбъект("VBScript.RegExp");
РегВыр.Global = Истина;
РегВыр.IgnoreCase = Истина;
РегВыр.Pattern = "[«»""]";

ИсходнаяСтрока = "Санаторий «Петродворец»";
Результат = РегВыр.Replace(ИсходнаяСтрока, "");

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

← На главную