К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как удалить кавычки из строки в 1С

Способы удалить кавычки из строки в 1С: СтрЗаменить, СтрШаблон, обработка двойных и «ёлочек». Примеры кода, проверка результата, типичные ошибки разработчиков.

Кавычки в строках 1С встречаются повсеместно: в именах файлов, выгруженных из других систем, в наименованиях контрагентов, в данных, прочитанных из CSV, JSON или Excel. Если такую строку передать в запрос, использовать в пути к файлу или вывести в печатную форму без обработки, можно получить ошибку синтаксиса, битую ссылку на файл или некорректный документ.

Встроенный язык 1С не содержит отдельной функции «удалить кавычки», но задача решается штатными средствами за одну-две строки кода. Основной инструмент — функция СтрЗаменить(), а для сложных случаев применяются посимвольный разбор и регулярные выражения через COM-объект.

Ниже разобраны все рабочие варианты: от простого удаления прямых кавычек до обработки «ёлочек», угловых кавычек и экранированных символов. Каждый пример можно скопировать и выполнить в конфигураторе или в консоли кода.

Почему кавычки в строке 1С — это особый случай

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

Из-за этого при удалении кавычек новички часто пишут неработающий код вроде СтрЗаменить(Строка, """", "") — такая запись синтаксически корректна (четыре кавычки означают одну кавычку внутри строки), но плохо читается и провоцирует ошибки. Надёжнее использовать функцию Символ(34), где 34 — код символа прямой кавычки в Unicode.

Базовый способ: удаление кавычек через СтрЗаменить

Функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены) заменяет все вхождения подстроки. Чтобы удалить символ, в качестве замены передаётся пустая строка. Пример:

ИсходнаяСтрока = "ООО ""Ромашка""";

Результат = СтрЗаменить(ИсходнаяСтрока, Символ(34), "");

// Результат: ООО Ромашка

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

Если нужно удалить и одинарные кавычки, добавьте вторую замену: СтрЗаменить(Результат, "'", ""). Одинарная кавычка не является служебным символом в 1С, поэтому её можно указывать в литерале напрямую.

bsl
СтрокаБезКавычек = СтрЗаменить(ИсходнаяСтрока, Символ(34), "");

Удаление разных видов кавычек: «ёлочки», «лапки», угловые

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

Таблица кодов распространённых кавычек

СимволНазваниеКод Unicode
"Прямая двойная кавычка34
«Левая «ёлочка»171
»Правая «ёлочка»187
„Нижняя «лапка»8222
“Левая типографская8220
”Правая типографская8221

Универсальная функция для очистки строки от всех видов кавычек выглядит так:

Функция УдалитьКавычки(Строка)

КодыКавычек = Новый Массив;

КодыКавычек.Добавить(34); // "

КодыКавычек.Добавить(171); // «

КодыКавычек.Добавить(187); // »

КодыКавычек.Добавить(8220); // "

КодыКавычек.Добавить(8221); // "

КодыКавычек.Добавить(8222); // „

КодыКавычек.Добавить(39); // '

Результат = Строка;

Для Каждого Код Из КодыКавычек Цикл

Результат = СтрЗаменить(Результат, Символ(Код), "");

КонецЦикла;

Возврат Результат;

КонецФункции

Такой подход безопасен для любых входных данных: если какого-то вида кавычек в строке нет, соответствующая замена просто ничего не сделает.

Удаление только крайних кавычек (обрамление строки)

Не всегда нужно удалять все кавычки. При чтении CSV-файлов значения полей часто обрамлены кавычками целиком: "Иванов И.И.", при этом внутри значения кавычки тоже могут встречаться. Если применить СтрЗаменить ко всей строке, внутренние кавычки будут потеряны и данные исказятся.

Правильный подход — проверить первый и последний символы и срезать только их:

Функция СнятьОбрамление(Строка)

Результат = СокрЛП(Строка);

Если СтрДлина(Результат) >= 2 Тогда

Если Лев(Результат, 1) = Символ(34)

И Прав(Результат, 1) = Символ(34) Тогда

Результат = Сред(Результат, 2, СтрДлина(Результат) - 2);

КонецЕсли;

КонецЕсли;

Возврат Результат;

КонецФункции

Обратите внимание на предварительный СокрЛП(): перед кавычкой может стоять пробел, и тогда проверка первого символа не сработает. Проверка длины строки (не менее 2 символов) защищает от ошибки на строке, состоящей из одной кавычки.

Порядок действий при разборе CSV
  1. 1
    Прочитайте значение поля из файла
  2. 2
    Уберите пробелы по краям через СокрЛП()
  3. 3
    Проверьте, что первый и последний символы — кавычки (Символ(34))
  4. 4
    Срежьте крайние символы через Сред()
  5. 5
    Замените удвоенные внутренние кавычки "" на одинарные, если формат это предполагает

Альтернативные способы: посимвольный разбор и регулярные выражения

Посимвольный проход по строке

Если логика сложнее — например, удалять кавычки только вне скобок или считать их количество — используйте цикл по символам:

Результат = "";

Для Позиция = 1 По СтрДлина(ИсходнаяСтрока) Цикл

ТекСимвол = Сред(ИсходнаяСтрока, Позиция, 1);

Если ТекСимвол <> Символ(34) Тогда

Результат = Результат + ТекСимвол;

КонецЕсли;

КонецЦикла;

Этот способ медленнее СтрЗаменить на длинных строках из-за конкатенации в цикле, поэтому для простого удаления он не рекомендуется. Его ниша — нестандартная логика фильтрации.

Регулярные выражения через VBScript.RegExp

На Windows-сервере доступен COM-объект регулярных выражений:

RegExp = Новый COMОбъект("VBScript.RegExp");

RegExp.Pattern = "[""«»]";

RegExp.Global = Истина;

Результат = RegExp.Replace(ИсходнаяСтрока, "");

Ограничение: COM-объекты недоступны на Linux-сервере и в веб-клиенте, поэтому для кроссплатформенных решений этот вариант не подходит. В мобильной платформе и тонком клиенте также используйте СтрЗаменить.

Сравнение вариантов

СтрЗаменить + Символ(34)

Универсальный и самый быстрый способ. Работает везде: сервер, тонкий и веб-клиент, мобильная платформа. Удаляет все вхождения.

Срез крайних символов через Сред()

Подходит для снятия обрамления CSV-полей. Сохраняет внутренние кавычки, но требует проверок длины и крайних символов.

Посимвольный цикл

Для нестандартной логики фильтрации. Медленный на длинных строках, не используйте без необходимости.

RegExp через COM

Гибкие шаблоны, но работает только на Windows. Не подходит для веб-клиента и Linux.

Проверка результата и типичные ошибки

После обработки убедитесь, что результат соответствует ожиданиям. Самый простой способ — вывести строку в сообщение или проверить отсутствие кавычек функцией СтрНайти():

Если СтрНайти(Результат, Символ(34)) > 0 Тогда

Сообщить("В строке остались кавычки!");

КонецЕсли;

Типичные ошибки
01
Не присвоили результат СтрЗаменить переменной — функция возвращает новую строку, исходная не меняется
02
Использовали литерал """" вместо Символ(34) — код трудно читать, легко ошибиться в количестве кавычек
03
Удалили все кавычки там, где нужно было снять только обрамление, — внутренние данные искажены
04
Забыли про типографские кавычки из Word (коды 8220–8222) — часть символов осталась в строке
05
Не сделали СокрЛП() перед проверкой крайних символов — пробел перед кавычкой сломал проверку
Контрольные точки

Как проверить результат

СтрНайти(Результат, Символ(34))
Норма

Возвращает 0 — прямых кавычек нет

Тревожный признак

Возвращает позицию > 0 — кавычки остались

Длина результата
Норма

Уменьшилась ровно на число удалённых символов

Тревожный признак

Строка стала пустой или обрезалась сильнее ожидаемого

Внутренние данные
Норма

Текст внутри строки не изменился

Тревожный признак

Потеряны кавычки внутри значения, которые нужно было сохранить

Если строка дальше используется в запросе, помните: удалять кавычки из текста запроса вручную вообще не нужно — передавайте значения через параметры (Запрос.УстановитьПараметр()), тогда платформа сама корректно обработает любые спецсимволы.

Итог

Что важно запомнить

Для удаления всех кавычек используйте СтрЗаменить с Символ(34), для снятия обрамления — проверку и срез крайних символов. Учитывайте типографские кавычки из офисных документов и всегда присваивайте результат замены переменной.

Частые вопросы

Как вставить кавычку внутрь строки в 1С?

Удвойте её в литерале: "ООО ""Ромашка""" — такая запись даст строку ООО "Ромашка". Альтернатива — собрать строку через конкатенацию с Символ(34): "ООО " + Символ(34) + "Ромашка" + Символ(34). Второй вариант нагляднее при сложной сборке.

Почему СтрЗаменить не удаляет кавычки из моей строки?

Чаще всего результат функции не присвоен переменной: СтрЗаменить возвращает новую строку, а не меняет исходную. Вторая причина — в данных типографские кавычки (коды 8220–8222 или «ёлочки» 171/187), а заменяется только прямая кавычка с кодом 34.

Как удалить кавычки только в начале и конце строки?

Проверьте первый символ через Лев(Строка, 1) и последний через Прав(Строка, 1), сравнив их с Символ(34). Если оба совпадают, верните Сред(Строка, 2, СтрДлина(Строка) - 2). Перед проверкой примените СокрЛП(), чтобы исключить влияние пробелов.

Работает ли регулярное выражение для удаления кавычек в веб-клиенте?

Нет. COM-объект VBScript.RegExp доступен только в толстом и тонком клиенте на Windows. В веб-клиенте, на Linux-сервере и в мобильной платформе используйте СтрЗаменить или посимвольный цикл — они работают на всех платформах.

Как удалить кавычки из строки в запросе 1С?

В тексте запроса функции СтрЗаменить нет, но есть ВЫРАЗИТЬ и подстановка. Практичнее обработать строку до запроса встроенным языком и передать результат параметром: Запрос.УстановитьПараметр("Наименование", СтрЗаменить(Строка, Символ(34), "")). Это надёжнее и защищает от ошибок синтаксиса.

Чем опасно ручное удаление кавычек при формировании текста запроса?

Конкатенация пользовательских данных прямо в текст запроса — путь к ошибкам и аналогу SQL-инъекций. Даже если вы удалили кавычки, остаются другие спецсимволы. Всегда передавайте значения через параметры запроса — платформа сама выполнит корректное экранирование.