Работа со строками в 1С:Предприятие 8.3 часто требует добавления кавычек — будь то для формирования SQL-запросов, динамического создания кода или обработки пользовательского ввода. Однако неопытные разработчики сталкиваются с ошибками компиляции, когда платформа воспринимает кавычку внутри строки как её окончание. Эта проблема особенно актуальна при работе с запросами 1С, где кавычки используются для обозначения строковых литералов, или при генерации кода через Выполнить().

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

Почему кавычки в строках 1С вызывают ошибки

Платформа 1С:Предприятие использует двойные кавычки (") для обозначения начала и конца строковых литералов. Когда внутри строки встречается ещё одна кавычка, компилятор воспринимает её как закрывающую и выдаёт синтаксическую ошибку. Например, этот код вызовет проблему:

Сообщить("Текст с "кавычкой" внутри");  // Ошибка: неожиданный конец строки

Аналогичная ситуация возникает в запросах 1С, где кавычки используются для обозначения строковых параметров:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура ГДЕ Наименование = "Пример"";

Здесь платформа "обрежет" строку на первом знаке " после =, что приведёт к ошибке выполнения. Решение этой проблемы зависит от контекста использования строки.

📊 Какой способ экранирования кавычек вы используете чаще?
Удвоение кавычек
Функция СтрЗаменить()
Символы Юникода
Другое

Способ 1: Удвоение кавычек (классический метод)

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

Сообщить("Текст с ""кавычкой"" внутри");  // Выведет: Текст с "кавычкой" внутри

Этот метод работает и в текстах запросов:

Запрос.Текст = "ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура ГДЕ Наименование = ""Пример""";
⚠️ Внимание: Удвоение кавычек не работает в динамически выполняемом коде через Выполнить(), если строка формируется с использованием других методов экранирования. В таких случаях требуется комбинировать подходы.

Преимущества метода:

  • 🔹 Поддерживается во всех версиях 1С:Предприятие (включая 7.7)
  • 🔹 Не требует дополнительных функций или библиотек
  • 🔹 Чётко видно в коде, где начинаются и заканчиваются строковые литералы

☑️ Проверка удвоения кавычек

Выполнено: 0 / 3

Способ 2: Использование функции СтрЗаменить()

Для динамического формирования строк с кавычками удобно использовать функцию СтрЗаменить(). Она позволяет заменить одинарные кавычки на удвоенные автоматически:

ТекстСКавычками = СтрЗаменить(ИсходныйТекст, """", """""");

Сообщить(ТекстСКавычками);

Пример для запроса:

ПараметрПоиска = "ООО ""Ромашка""";

Запрос.Текст = "ВЫБРАТЬ Наименование ИЗ Справочник.Контрагенты ГДЕ Наименование = " +

СтрЗаменить(ПараметрПоиска, """", """""");

Этот метод особенно полезен, когда строка с кавычками формируется из пользовательского ввода или внешнего источника. Например, при загрузке данных из Excel или JSON, где кавычки могут встречаться в произвольных местах.

Сценарий Пример кода Результат
Простая замена СтрЗаменить("Тест ""1""", """", """""") Тест ""1""
Запрос с параметром СтрЗаменить(Параметр, """", """""") Безопасный текст для запроса
Многоуровневая вложенность СтрЗаменить("А ""Б ""В""", """", """""") А ""Б ""В""""
💡

Если вам нужно экранировать кавычки в строке, которая потом будет использоваться в SQL-запросе через внешнее соединение (например, к PostgreSQL), используйте СтрЗаменить() с заменой на \"" вместо удвоения.

Способ 3: Символы Юникода для кавычек

В 1С:Предприятие 8.3 поддерживаются символы Юникода, что позволяет использовать альтернативные виды кавычек, не требующие экранирования:

  • 🔹 « » — французские ("ёлочки")
  • 🔹 „ “ — немецкие ("лапки")
  • 🔹 ‘ ’ — одинарные угловые

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

Сообщить("Текст с «кавычками» внутри");  // Не требует экранирования

Преимущества метода:

  • 🔹 Не требует экранирования
  • 🔹 Визуально отличается от стандартных кавычек (полезно для документов)
  • 🔹 Поддерживается в отчётах и печатных формах

Ограничения:

  • 🔸 Не подходит для SQL-запросов (только стандартные кавычки)
  • 🔸 Может вызвать проблемы при экспорте данных в системы, не поддерживающие Юникод
Как вставить символ Юникода в 1С без копирования?

Используйте функцию Символ() с кодом символа. Например, Символ(171) вернёт «, а Символ(187) — ». Полный список кодов кавычек: 8220, 8221 (англ. кавычки), 171, 187 (франц. кавычки).

Способ 4: Экранирование для динамического выполнения кода

При использовании функции Выполнить() или конструкций вроде Вычислить() экранирование кавычек требует особого подхода. Здесь удвоение кавычек внутри строки не сработает, так как строка сначала интерпретируется как аргумент функции, а потом — как исполняемый код.

Решение — тройное экранирование:

КодДляВыполнения = "Сообщить(""Текст с """"кавычками"""" внутри"");";

Выполнить(КодДляВыполнения);

Разберём по шагам:

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

Для упрощения можно использовать функцию СтрШаблон():

Шаблон = "Сообщить(""Текст с %1 внутри"")";

Результат = СтрШаблон(Шаблон, """"""""Кавычками"""""""");

Выполнить(Результат);

⚠️ Внимание: При динамическом формировании кода с кавычками всегда проверяйте итоговую строку через Сообщить() перед выполнением. Ошибки в экранировании могут привести к инъекциям кода или синтаксическим ошибкам.

Способ 5: Использование параметров запросов вместо строк

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

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура ГДЕ Наименование = &Параметр";

Запрос.УстановитьПараметр("Параметр", "ООО ""Ромашка""");

Результат = Запрос.Выполнить();

Преимущества подхода:

  • 🔹 Автоматическое экранирование специальных символов
  • 🔹 Защита от инъекций
  • 🔹 Улучшенная читаемость кода
  • 🔹 Поддержка сложных типов данных (даты, булевы значения)

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

💡

Использование параметров запросов — самый безопасный и поддерживаемый способ работы со строками, содержащими кавычки. Всегда отдавайте предпочтение этому методу перед ручным экранированием.

Типичные ошибки и как их избежать

Даже опытные разработчики иногда допускают ошибки при работе с кавычками. Вот наиболее распространённые случаи:

  1. Непарные кавычки: забывают удвоить обе кавычки в паре.
    // Ошибка:
    

    Сообщить("Текст с "кавычкой""); // Первая кавычка не экранирована

  2. Пробелы между удвоенными кавычками:
    // Ошибка:
    

    Сообщить("Текст с "" кавычкой """); // Пробелы разрывают экранирование

  3. Использование одинарных кавычек:
    // Ошибка в 1С (одинарные кавычки не поддерживаются):
    

    Сообщить('Текст с 'кавычкой'');

  4. Экранирование в динамическом коде:
    // Ошибка:
    

    Код = "Сообщить("Текст с ""кавычками"")"; // Требуется тройное экранирование

Для отладки сложных строк с кавычками используйте приём "поэтапного построения":

Часть1 = "ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура ГДЕ ";

Часть2 = "Наименование = """;

Часть3 = СтрЗаменить(ПараметрПоиска, """", """""");

Часть4 = """";

Запрос.Текст = Часть1 + Часть2 + Часть3 + Часть4;

⚠️ Внимание: При работе с внешними источниками данных (например, HTTP-сервисами или файлами JSON/XML) учитывайте, что правила экранирования кавычек могут отличаться. Например, в JSON используются обратные слеши (\), которые в 1С требуют дополнительной обработки.

FAQ: Частые вопросы по работе с кавычками в 1С

Как добавить кавычку в строку, которая потом будет записана в текстовый документ?

Для текстового документа (например, Word или PDF) лучше использовать символы Юникода («») или одинарные кавычки (‘’), если это допустимо по формату. Пример:

ТекстДляДокумента = "Пример текста с «кавычками» для отчёта";

Документ.ДобавитьТекст(ТекстДляДокумента);

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

ТекстДляДокумента = СтрЗаменить(ИсходныйТекст, """", """""");

Документ.ДобавитьТекст(ТекстДляДокумента);

Почему при удвоении кавычек в запросе выдаётся ошибка "Неопознанный идентификатор"?

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

Запрос.Текст = "ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура ГДЕ Наименование = &Параметр";

Запрос.УстановитьПараметр("Параметр", "ООО "Ромашка""); // Ошибка: кавычка не экранирована

Исправленный вариант:

Запрос.УстановитьПараметр("Параметр", "ООО ""Ромашка""");
Как экранировать кавычки в строке, которая будет передана в HTTP-запрос?

Для HTTP-сервисов (например, при работе с REST API) используйте функцию СтрЗаменить() с заменой на \" (обратный слеш + кавычка):

ТекстДляAPI = СтрЗаменить(ИсходныйТекст, """", "\""");

Запрос = Новый HTTPЗапрос("https://api.example.com/data");

Запрос.Заголовки.Вставить("Content-Type", "application/json");

Запрос.УстановитьТекст("{\"name\": \"" + ТекстДляAPI + "\"}");

Если сервис требует URL-энкодинг, используйте:

ТекстДляURL = СтрЗаменить(ИсходныйТекст, """", "%22");
Можно ли использовать одинарные кавычки вместо двойных в 1С?

Нет, 1С:Предприятие поддерживает только двойные кавычки для обозначения строковых литералов. Одинарные кавычки (как в JavaScript или PHP) вызовут синтаксическую ошибку. Пример неверного кода:

// Ошибка:

Сообщить('Это не сработает');

Исключение — одинарные кавычки внутри строк для обозначения символьных значений (например, в запросах к PostgreSQL через внешние соединения), но это уже относится к синтаксису конкретной СУБД, а не платформы 1С.

Как добавить кавычку в строку, которая используется в формуле расчётного поля?

В расчётных полях (например, в отчётах или динамических списках) используйте удвоение кавычек прямо в формуле:

ВЫРАЗИТЬ("Если Наименование = """"Пример"""" Тогда 1 Иначе 0 КонецЕсли"" как Булево)

Если формула формируется динамически, применяйте СтрЗаменить():

ТекстФормулы = "ВЫРАЗИТЬ(""Если Наименование = """""" + Параметр + """""" Тогда 1 Иначе 0 КонецЕсли"" как Булево)";

ТекстФормулы = СтрЗаменить(ТекстФормулы, """", """""");

Поле.Выражение = ТекстФормулы;