Как найти и заменить кавычки в строке в 1С?

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

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

Причина 1. Особенность работы функции СтрЗаменить

Проанализируем частую логическую ошибку начинающих разработчиков. Функция СтрЗаменить не изменяет переданную ей переменную по ссылке, а возвращает новую строку с произведенными заменами. Если вызвать метод без присвоения результата, строковое значение останется неизменным.

Посмотрим на пример правильного переприсвоения:


// Неправильно: исходная строка не изменится
СтрЗаменить(Контрагент, """", "_");

// Правильно: результат возвращается в переменную
Контрагент = СтрЗаменить(Контрагент, """", "_");

Причина 2. Тип данных переменной и сохранение в базу

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

Разберем две ситуации:

  1. Если требуется получить строку для вывода на экран или отчета: необходимо явно обратиться к реквизиту Наименование или воспользоваться явным приведением через Строка(): НаименованиеБезКавычек = СтрЗаменить(Контрагент.Наименование, """", "_");
  2. Если требуется перезаписать данные в самой базе: простого присвоения переменной недостаточно. Для записи изменений на сервере обязательно получаем объект:
    
    ОбъектКонтрагента = Контрагент.ПолучитьОбъект();
    ОбъектКонтрагента.Наименование = СтрЗаменить(ОбъектКонтрагента.Наименование, """", "_");
    ОбъектКонтрагента.Записать();
    

Причина 3. Экранирование и альтернативное указание символа кавычки

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

Если такая запись ухудшает читаемость кода, воспользуемся функцией Символ с кодом ASCII 34:


СимволКавычки = Символ(34); // Двойная кавычка "
Контрагент = СтрЗаменить(Контрагент, СимволКавычки, "_");

Причина 4. Нестандартные и типографические сорта кавычек

Бывают ситуации, когда код написан корректно, но замена всё равно не происходит. Это означает, что визуально похожий символ на самом деле не является стандартной двойной кавычкой с кодом 34. В наименованиях контрагентов, скопированных из внешних систем, Word или таблиц Excel, часто встречаются различные типографические знаки.

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

Код = КодСимвола("«"); // Вернет код конкретного символа

Среди популярных разновидностей кавычек встречаются:

  1. «Ёлочки» и „лапки“;
  2. ‘Английские одиночные’ и “английские двойные”;
  3. Одинарные апострофы с кодом 39;
  4. Двойные штрихи секунд или дюймов (Prime, код 8243);
  5. Две одинарные кавычки подряд, которые визуально неотличимы от двойной.

Рассмотрим несколько надежных способов пакетной обработки таких символов.

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

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


// Заменяем любые стандартные и типографические кавычки
Результат = СтрЗаменитьПоРегулярномуВыражению(Контрагент, "[\""'«»„“”‘’]", "_");

Способ 2. Замена через СтрРазделить и СтрСоединить

Если версия платформы ниже 8.3.23, используем функционал метода СтрРазделить (доступен с платформы 8.3.6). Особенность этой функции в том, что строка разделителя воспринимается как набор одиночных разделителей, а не единая фраза:


ВсеКавычки = """'«»„“”‘’";
// Третий параметр Истина обязателен, чтобы не потерять пустые подстроки
Части = СтрРазделить(Контрагент, ВсеКавычки, Истина);
Результат = СтрСоединить(Части, "_");

Способ 3. Очистка строки средствами БСП

Если конфигурация разработана на базе Библиотеки стандартных подсистем (БСП) и стоит задача оставить в наименовании исключительно русские буквы и пробелы, заменим все остальные символы через функцию подсистемы:


Длина = СтрДлина(Контрагент);
Результат = "";

Для Индекс = 1 По Длина Цикл
    СимволСтроки = Сред(Контрагент, Индекс, 1);
    
    Если СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(СимволСтроки) Или СимволСтроки = " " Тогда
        Результат = Результат + СимволСтроки;
    Иначе
        Результат = Результат + "_";
    КонецЕсли;
КонецЦикла;

Способ 4. Замена кавычек непосредственно в запросе (с платформы 8.3.20)

Когда требуется подготовить данные без лишних символов сразу при выборке из базы, используем функцию СТРЗАМЕНИТЬ прямо в тексте запроса. Это снимает вычислительную нагрузку с сервера 1С и делегирует операцию СУБД:


ВЫБРАТЬ
    СТРЗАМЕНИТЬ(Контрагенты.Наименование, """", "_") КАК НаименованиеБезКавычек
ИЗ
    Справочник.Контрагенты КАК Контрагенты
← На главную