Работа со строковыми данными — одна из базовых задач разработчика в 1С. Однако замена кавычек часто вызывает трудности: код выполняется без явных ошибок, но строка остается прежней. Разберем по шагам, почему функция замены может не срабатывать, как правильно экранировать кавычки и как гарантированно обработать любые разновидности типографических символов.
Проанализируем частую логическую ошибку начинающих разработчиков. Функция СтрЗаменить не изменяет переданную ей переменную по ссылке, а возвращает новую строку с произведенными заменами. Если вызвать метод без присвоения результата, строковое значение останется неизменным.
Посмотрим на пример правильного переприсвоения:
// Неправильно: исходная строка не изменится
СтрЗаменить(Контрагент, """", "_");
// Правильно: результат возвращается в переменную
Контрагент = СтрЗаменить(Контрагент, """", "_");
Выясним причину, почему замена может не примениться к данным в информационной базе. Нередко в переменной находится не примитивная строка, а ссылка на справочник — СправочникСсылка.Контрагенты.
Разберем две ситуации:
Наименование или воспользоваться явным приведением через Строка():
НаименованиеБезКавычек = СтрЗаменить(Контрагент.Наименование, """", "_");
ОбъектКонтрагента = Контрагент.ПолучитьОбъект();
ОбъектКонтрагента.Наименование = СтрЗаменить(ОбъектКонтрагента.Наименование, """", "_");
ОбъектКонтрагента.Записать();
В синтаксисе встроенного языка 1С символ двойной кавычки внутри строкового литерала экранируется точно такой же кавычкой. Чтобы передать строку, состоящую ровно из одного символа двойной кавычки, мы пишем четыре кавычки подряд: """" (две обрамляющие строковый литерал и две для экранирования самого знака).
Если такая запись ухудшает читаемость кода, воспользуемся функцией Символ с кодом ASCII 34:
СимволКавычки = Символ(34); // Двойная кавычка "
Контрагент = СтрЗаменить(Контрагент, СимволКавычки, "_");
Бывают ситуации, когда код написан корректно, но замена всё равно не происходит. Это означает, что визуально похожий символ на самом деле не является стандартной двойной кавычкой с кодом 34. В наименованиях контрагентов, скопированных из внешних систем, Word или таблиц Excel, часто встречаются различные типографические знаки.
Выясним код символа с помощью отладчика. Для этого выделим спорный символ в табло отладчика и вызовем функцию определения кода:
Код = КодСимвола("«"); // Вернет код конкретного символа
Среди популярных разновидностей кавычек встречаются:
Рассмотрим несколько надежных способов пакетной обработки таких символов.
Начиная с версии платформы 8.3.23, в глобальном контексте появилась штатная функция СтрЗаменитьПоРегулярномуВыражению. Она позволяет перечислить все возможные символы кавычек в одном шаблоне за один вызов:
// Заменяем любые стандартные и типографические кавычки
Результат = СтрЗаменитьПоРегулярномуВыражению(Контрагент, "[\""'«»„“”‘’]", "_");
Если версия платформы ниже 8.3.23, используем функционал метода СтрРазделить (доступен с платформы 8.3.6). Особенность этой функции в том, что строка разделителя воспринимается как набор одиночных разделителей, а не единая фраза:
ВсеКавычки = """'«»„“”‘’";
// Третий параметр Истина обязателен, чтобы не потерять пустые подстроки
Части = СтрРазделить(Контрагент, ВсеКавычки, Истина);
Результат = СтрСоединить(Части, "_");
Если конфигурация разработана на базе Библиотеки стандартных подсистем (БСП) и стоит задача оставить в наименовании исключительно русские буквы и пробелы, заменим все остальные символы через функцию подсистемы:
Длина = СтрДлина(Контрагент);
Результат = "";
Для Индекс = 1 По Длина Цикл
СимволСтроки = Сред(Контрагент, Индекс, 1);
Если СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(СимволСтроки) Или СимволСтроки = " " Тогда
Результат = Результат + СимволСтроки;
Иначе
Результат = Результат + "_";
КонецЕсли;
КонецЦикла;
Когда требуется подготовить данные без лишних символов сразу при выборке из базы, используем функцию СТРЗАМЕНИТЬ прямо в тексте запроса. Это снимает вычислительную нагрузку с сервера 1С и делегирует операцию СУБД:
ВЫБРАТЬ
СТРЗАМЕНИТЬ(Контрагенты.Наименование, """", "_") КАК НаименованиеБезКавычек
ИЗ
Справочник.Контрагенты КАК Контрагенты