Разработка и Конфигурация · 9 мин
Как заменить кавычку в 1С: рабочие способы и примеры кода
Как заменить кавычку в 1С: функция СтрЗаменить, удвоение кавычек в строковых литералах, замена на «ёлочки», работа в запросах и макетах. Примеры кода и типичные ошибки.
Замена кавычек в 1С — типовая задача, которая возникает при формировании печатных форм, выгрузке данных в CSV и XML, очистке наименований номенклатуры и подготовке текстов запросов. Сложность в том, что кавычка во встроенном языке 1С — служебный символ: она обозначает границы строкового литерала. Поэтому просто написать кавычку внутри строки нельзя — её нужно экранировать.
Основной инструмент замены — функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены). Она заменяет все вхождения подстроки и возвращает новую строку, не изменяя исходную переменную. Чтобы указать саму кавычку как искомый символ, её удваивают: литерал """" означает одну кавычку.
Ниже разобраны рабочие приёмы: замена прямой кавычки, замена на типографские «ёлочки», экранирование при выгрузке в файлы, работа в запросах и типичные ошибки, из-за которых код не компилируется или портит данные.
Как записать кавычку в строковом литерале 1С
Во встроенном языке строка заключается в двойные кавычки. Если внутри строки нужна сама кавычка, она записывается дважды. Это базовое правило, без понимания которого любая замена превращается в синтаксическую ошибку.
Примеры литералов:
ОднаКавычка = """"; // строка из одного символа "
ДвеКавычки = """"""; // строка из двух символов ""
ТекстСКавычками = "Фирма ""Ромашка"""; // Фирма "Ромашка"
Частая путаница — посчитать кавычки «на глаз». Правило простое: открывающая и закрывающая кавычки литерала плюс удвоенная кавычка на каждый нужный символ. Для одной кавычки внутри строки получается четыре знака подряд: """".
Замена кавычки функцией СтрЗаменить
Базовый сценарий — убрать кавычки из строки или заменить их на другой символ. Функция СтрЗаменить принимает три параметра: исходную строку, что искать и на что заменить.
Наименование = "Организация ""Вега""";
// Удалить кавычки полностью
БезКавычек = СтрЗаменить(Наименование, """", "");
// Результат: Организация Вега
// Заменить кавычку на апостроф
САпострофами = СтрЗаменить(Наименование, """", "'");
// Результат: Организация 'Вега'
Обратите внимание: функция возвращает новое значение. Вызов СтрЗаменить(Наименование, """", "") без присваивания результата не меняет переменную — это одна из самых частых ошибок новичков. Результат нужно присвоить той же или другой переменной.
Функция заменяет все вхождения подстроки, а не только первое. Если в тексте несколько пар кавычек, обрабатывать их по одной не требуется.
Результат = СтрЗаменить(ИсходнаяСтрока, """", ""); // удалить все кавычкиЗамена прямых кавычек на типографские «ёлочки»
При формировании печатных форм и писем прямые кавычки часто требуется заменить на типографские « » — так текст выглядит аккуратнее. Символы «ёлочек» можно вставить в код напрямую, они не конфликтуют со служебными кавычками литерала.
Текст = "Договор с ООО ""Спектр"" расторгнут";
// Простая замена всех прямых кавычек на левую «ёлочку» — НЕПРАВИЛЬНО
// Правильно: различать открывающую и закрывающую кавычки
Функция ЗаменитьНаЕлочки(Знач Текст)
Результат = "";
Открыта = Ложь;
Для Поз = 1 По СтрДлина(Текст) Цикл
Символ = Сред(Текст, Поз, 1);
Если Символ = """" Тогда
Результат = Результат + ?(Открыта, "»", "«");
Открыта = Не Открыта;
Иначе
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Логика проста: первая встреченная кавычка считается открывающей и заменяется на «, вторая — закрывающей и заменяется на », и так поочерёдно. Если число кавычек в тексте нечётное, последняя будет обработана как открывающая — такой текст стоит проверить вручную.
Альтернатива без цикла — использовать символы по кодам: Символ(171) для « и Символ(187) для ». Это удобно, когда раскладка или редактор не позволяет ввести «ёлочки» напрямую.
Экранирование кавычек при выгрузке в файлы
При выгрузке в CSV, JSON-подобные структуры или при ручной сборке XML кавычки внутри значений нужно не удалять, а экранировать — иначе файл будет некорректно прочитан принимающей стороной.
В формате CSV значение, содержащее кавычки или разделитель, обрамляется кавычками, а внутренние кавычки удваиваются:
Функция ЭкранироватьДляCSV(Знач Значение)
// Удвоить внутренние кавычки и обернуть значение
Возврат """" + СтрЗаменить(Значение, """", """""") + """";
КонецФункции
// Для значения: Труба 3/4"
// Получим: "Труба 3/4"""
В XML кавычки внутри значений атрибутов заменяют на сущность ", а амперсанд — на &. При этом порядок замен важен: сначала амперсанд, иначе вставленные сущности будут испорчены повторной заменой.
Кавычки в запросах и динамическом коде
Когда кавычка нужна внутри текста запроса, который собирается строкой, действует то же правило удвоения. Например, поиск по наименованию, содержащему кавычку:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Наименование";
Запрос.УстановитьПараметр("Наименование", "%""%"); // ищем любые кавычки
Предпочтительный приём — передавать искомое значение через параметр запроса, а не подставлять его конкатенацией в текст. Это исключает и ошибки с кавычками, и риск некорректной интерпретации спецсимволов.
Аналогично при использовании Выполнить() или Вычислить() с динамически собираемым кодом: каждая кавычка внутри вложенного строкового литерала должна быть удвоена относительно внешней строки, что быстро приводит к нечитаемым конструкциям. Если уровней вложенности больше одного, лучше вынести текст в макет или шаблон.
Групповая замена кавычек в данных справочников
Если кавычки нужно заменить в уже существующих данных — например, в наименованиях товаров после некорректной загрузки — используется обработка с явной транзакцией и предварительным просмотром.
- 1Сделайте резервную копию базы или выполняйте работу на копии
- 2Запросом отберите записи, где наименование содержит кавычку (ПОДОБНО "%""%")
- 3Выведите список найденных записей и убедитесь, что лишнего не затронуто
- 4В транзакции для каждой записи выполните СтрЗаменить и запишите объект
- 5Проверьте несколько записей вручную после завершения
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Наименование = СтрЗаменить(Объект.Наименование, """", "'");
Объект.Записать();
КонецЦикла;
Учитывайте, что изменение наименования может повлиять на печатные формы, обмены с сайтом и сопоставление при загрузках. Если наименование участвует в синхронизации с внешними системами, замену согласуйте с ответственными за обмен.
Как проверить результат
Модуль сохраняется без синтаксических ошибок
Ошибка «Ожидается символ» рядом с кавычками — пересчитайте литерал
В строке целевые символы заменены, остальной текст не изменён
Исчезли лишние символы или кавычки остались — проверьте параметры поиска
Принимающая программа открывает файл без ошибок разбора
Строки «разъезжаются» по колонкам — кавычки не экранированы
FAQ
Как заменить кавычку на пробел в 1С?
Используйте СтрЗаменить с удвоенной кавычкой в параметре поиска: Результат = СтрЗаменить(Текст, """", " "). Учтите, что слова, ранее обрамлённые кавычками, получат лишние пробелы по краям — при необходимости дополнительно примените СокрЛП.
Почему СтрЗаменить не меняет мою строку?
Функция не изменяет исходную переменную, а возвращает новую строку. Присвойте результат: Текст = СтрЗаменить(Текст, """", ""). Вызов без присваивания просто теряет результат.
Как вставить кавычку в сообщение пользователю?
Удвойте кавычку внутри литерала: Сообщить("Документ ""Реализация"" не проведён"). Пользователь увидит одинарные кавычки вокруг слова.
Как заменить кавычки в макете печатной формы без кода?
Откройте макет в конфигураторе и используйте стандартную замену (Ctrl+F, вкладка «Заменить»). Это работает для статического текста шаблона; значения параметров, подставляемые из данных, обрабатывайте в коде перед выводом.
Можно ли заменить кавычки регулярными выражениями?
Во встроенном языке 1С нет штатной поддержки регулярных выражений. Для простых замен достаточно СтрЗаменить, для посимвольной логики — цикл со Сред(). Внешние компоненты с регулярными выражениями подключают только при реальной необходимости сложных шаблонов.
Чем замена кавычки отличается в толстом и тонком клиенте?
Синтаксис СтрЗаменить и правила экранирования кавычек одинаковы во всех клиентах и на сервере. Различий в поведении строковых функций между режимами нет, поэтому код замены переносится без изменений.
Что важно запомнить
Кавычка внутри строкового литерала 1С записывается удвоением; замена выполняется через СтрЗаменить с обязательным присваиванием результата. Для «ёлочек» различайте открывающую и закрывающую кавычки, при выгрузке в файлы экранируйте, а не удаляйте, а массовую замену в данных делайте только после резервной копии и предварительного отбора.