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

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

———

Почему 1С"не понимает" кавычки внутри кавычек?

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

Примеры проблемных ситуаций:

  • 🔹 Формирование SQL-запроса с условием WHERE Наименование ="ООО"Ромашка"" — лишняя кавычка ломает синтаксис.
  • 🔹 Создание JSON-строки для API, где значения содержат кавычки: {"name":"Иванов"Петр""}.
  • 🔹 Вывод текста в отчёт с цитатами: "Клиент сказал:"Срочно!"".

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

📊 Как часто вы сталкиваетесь с необходимостью экранировать кавычки в 1С?
Постоянно (ежедневно)
Иногда (раз в неделю)
Реде (раз в месяц)
Никогда не приходилось

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

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

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

  1. В Запросах:
    Запрос.Текст ="ВЫБРАТЬ Наименование
    

    |ИЗ Справочник.Контрагенты

    |ГДЕ Наименование =""ООО""Ромашка"""";

  2. В Строках встроенного языка:
    Сообщение ="Клиент сказал:""Срочно!""";
  3. В Текстовых документах:
    ТекстДок.ДобавитьСтроку("Примечание:""Товар хрупкий""");

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

Минусы: визуально усложняет чтение кода, особенно в длинных строках с множеством кавычек.

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

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

Способ 2: Функция СтрЗначениеВнутр — для динамических строк

Если кавычки содержатся в переменных или формируются динамически, удобнее использовать функцию СтрЗначениеВнутр. Она автоматически экранирует специальные символы, включая кавычки, для безопасного включения в строковые выражения.

Синтаксис:

СтрЗначениеВнутр(Значение[, Формат])

Примеры:

  • 📌 Экранирование переменной с кавычками:
    ИмяФирмы ='ООО"Ромашка"';
    

    Запрос.Текст ="ВЫБРАТЬ Наименование

    |ИЗ Справочник.Контрагенты

    |ГДЕ Наименование =" + СтрЗначениеВнутр(ИмяФирмы);

  • 📌 Формирование JSON:
    Данные = Новый Структура;
    

    Данные.Вставить("name",'Иванов"Петр"');

    JSONСтрока ="{""name"":" + СтрЗначениеВнутр(Данные.name) +"}";

🔹 Важно: функция работает только для значений, передаваемых как переменные. Для статических строк (например, "ООО"Ромашка"") проще использовать удвоение.

💡

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

Способ 3: Символьные коды — альтернатива для редких случаев

В некоторых сценариях (например, при работе с HTML или XML в 1С) удобнее использовать символьные коды вместо кавычек. Для двойной кавычки это:

  • 🔢 " — HTML-код (например, для вывода в веб-клиенте).
  • 🔢 Char(34) — функция возвращает символ по ASCII-коду (34 — код кавычки).

Примеры:

// Использование Char(34) в строке

Текст ="Наименование:" + Char(34) +"Товар" + Char(34);

// HTML-вывод с "

HTMLТекст ="<divquote"">Цитата: "Привет"</div>";

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

  • 🚫 Char(34) не работает в тексте Запроса — только в коде встроенного языка.
  • 🚫 HTML-коды (") пригодны только для вывода в веб или печатные формы, но не для внутренней обработки.
Метод Применимость Пример Ограничения
Удвоение кавычек Запросы, строки, текстовые документы "ООО""Ромашка""" Усложняет чтение кода
СтрЗначениеВнутр Динамические переменные СтрЗначениеВнутр(ИмяФирмы) Не для статических строк
Char(34) Код встроенного языка "Текст" + Char(34) +"в кавычках" Не работает в запросах
" HTML/XML вывод <div>"Цитата"</div> Только для внешнего представления

Способ 4: Использование апострофов (') для обхода проблемы

В некоторых случаях (например, при работе с SQL-запросами к внешним базам) можно заменить двойные кавычки на апострофы ('). Это актуально, если:

  • 📌 Ваша СУБД поддерживает апострофы для обозначения строк (например, PostgreSQL, MySQL).
  • 📌 Вам нужно избежать конфликта с кавычками в JSON или XML.

Пример для SQL-запроса к внешней базе:

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

Запрос.Текст ="SELECT * FROM customers

|WHERE name ='ООО""Ромашка""'"; // Внешние апострофы, внутренние удвоенные кавычки

⚠️ Внимание: В стандартных запросах 1С апострофы не работают — только двойные кавычки. Этот метод применим исключительно при интеграции с внешними системами.

Когда апострофы не сработают?

В запросах к встроенной базе 1С апострофы вызовут ошибку синтаксиса. Также они не подходят для экранирования в JSON (там требуются именно двойные кавычки).

Способ 5: Шаблонные строки (1С 8.3.20+) — современный подход

Начиная с версии 8.3.20, в 1С появилась поддержка шаблонных строк (аналог template literals в JavaScript). Они позволяют вставлять переменные в строку без ручного экранирования, используя конструкцию | (вертикальная черта) и ${}.

Пример:

ИмяФирмы ="ООО""Ромашка""";

Запрос.Текст = $|ВЫБРАТЬ Наименование

|ИЗ Справочник.Контрагенты

|ГДЕ Наименование ="${ИмяФирмы}"|;

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

  • 🔹 Автоматическое экранирование кавычек и специальных символов.
  • 🔹 Улучшенная читаемость кода.
  • 🔹 Поддержка многострочных запросов без конкатенации.

⚠️ Внимание: Шаблонные строки работают только в коде встроенного языка, но не в тексте запросов к базе данных (там по-прежнему нужно удваивать кавычки или использовать СтрЗначениеВнутр).

💡

Шаблонные строки — самый современный и безопасный способ работы с кавычками в 1С 8.3.20+, но они не заменяют удвоение кавычек в SQL-запросах.

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

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

  1. Непарные кавычки:
    // Ошибка: не хватает закрывающей кавычки
    

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

    🔹 Решение: всегда проверяйте парность кавычек в отладчике (подсвечиваются цветом).

  2. Использование обратного слэша (\):
    // Ошибка: 1С не поддерживает \ как экранирование
    

    Сообщение ="Клиент сказал: \"Срочно!\""; // Не сработает!

    🔹 Решение: используйте удвоение или Char(34).

  3. Путаница с апострофами:
    // Ошибка: апострофы в стандартном запросе 1С
    

    Запрос.Текст ='ВЫБРАТЬ Наименование ИЗ Справочник.Контрагенты'; // Синтаксическая ошибка

    🔹 Решение: в запросах 1С всегда используйте двойные кавычки.

🛠 Инструменты для проверки:

  • 🔹 Синтакс-помощник в конфигураторе (показывает ошибки экранирования).
  • 🔹 Отладчик — выполните код пошагово, чтобы увидеть итоговую строку.
  • 🔹 Внешние валидаторы (например, для JSON можно использовать JSONLint).
💡

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

Практические примеры для разных задач

Рассмотрим реальные сценарии, где требуется экранирование кавычек, и оптимальные решения для них.

1. Формирование SQL-запроса с фильтром по наименованию

Задача: Выбрать контрагентов, в наименовании которых есть кавычки (например, ООО"Альфа").

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

Запрос.Текст ="ВЫБРАТЬ Наименование

|ИЗ Справочник.Контрагенты

|ГДЕ Наименование ПОДОБНО""%""""%"""; // Ищем любые кавычки в наименовании

2. Экспорт данных в JSON с кавычками

Задача: Сформировать JSON-строку для отправки в API, где значения содержат кавычки.

Данные = Новый Структура;

Данные.Вставить("company","ООО""Ромашка""");

Данные.Вставить("note","Примечание:""Срочно!""");

JSONСтрока ="{"

+"""" +"company" +""":" + СтрЗначениеВнутр(Данные.company) +","

+"""" +"note" +""":" + СтрЗначениеВнутр(Данные.note)

+"}";

3. Вывод текста с цитатами в печатную форму

Задача: Сформировать документ с текстом, содержащим кавычки (например, договор с условиями в кавычках).

ТекстДок = Новый ТекстовыйДокумент;

ТекстДок.ДобавитьСтроку("Условия поставки:""Оплата в течение 5 дней с момента""отгрузки"" товара""");

4. Интеграция с внешней базой данных (PostgreSQL)

Задача: Выполнить запрос к PostgreSQL, где строки обозначены апострофами.

Соединение = Новый COMОбъект("ADODB.Connection");

Соединение.Open("Driver={PostgreSQL};Server=localhost;Database=test;Uid=user;Pwd=pass");

ЗапросТекст ="SELECT * FROM customers WHERE name ='ООО""Ромашка""'";

Результат = Соединение.Execute(ЗапросТекст);

⚠️ Внимание: При работе с внешними СУБД всегда уточняйте синтаксис экранирования в их документации. Например, в MySQL для экранирования кавычек внутри апострофов используется обратный слэш (\), но в 1С его нужно вставлять как Char(92).

FAQ: Ответы на частые вопросы

Можно ли использовать одинарные кавычки (') вместо двойных в запросах 1С?

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

Как экранировать кавычки в динамически формируемом запросе с параметрами?

Используйте функцию СтрЗначениеВнутр для всех переменных, содержащих кавычки. Пример:

Фильтр ='ООО"Ромашка"';

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

Это гарантирует корректное экранирование независимо от содержимого переменной.

Почему при удвоении кавычек в JSON получается некорректная строка?

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

  1. Используйте СтрЗначениеВнутр для значений.
  2. Заменяйте кавычки вручную через СтрЗаменить:
JSONЗначение = СтрЗаменить(СтрЗначениеВнутр(Текст),"""","\""");
Как проверить, правильно ли экранированы кавычки в запросе?

Возможные способы:

  • 🔹 Выведите текст запроса в Сообщить и визуально проверьте парность кавычек.
  • 🔹 Используйте Синтакс-помощник в конфигураторе (он подсветит ошибки).
  • 🔹 Выполните запрос в отладчике пошагово, чтобы увидеть итоговую строку.
Есть ли разница в экранировании кавычек в тонком клиенте и веб-клиенте?

Нет, механизм экранирования кавычек не зависит от режима работы (тонкий клиент, веб-клиент, толстый клиент). Все описанные методы (удвоение, СтрЗначениеВнутр, Char(34)) работают одинаково во всех режимах.

Исключение — вывод в HTML (веб-клиент), где для отображения кавычек может потребоваться замена на ".