Работа с текстовыми данными в 1С:Предприятие 8.3 часто сталкивается с необходимостью использовать кавычки внутри кавычек — будь то SQL-запросы, программный код или формирование строковых выражений. Ошибка в экранировании приводит к синтаксическим сбоям, некорректному выполнению запросов или даже падению системы. Особенно актуальна проблема для разработчиков, которые пишут сложные отчёты, обрабатывают JSON-данные или интегрируют 1С с внешними системами.
В этой статье разберём 5 проверенных способов указать кавычку внутри кавычек — от стандартных методов платформы до малоизвестных приёмов для специфических задач. Вы узнаете, как избежать ошибок при работе с Запросами, Строками и Текстовыми документами, а также получите готовые примеры кода для типичных сценариев.
———
Почему 1С"не понимает" кавычки внутри кавычек?
Платформа 1С:Предприятие использует двойные кавычки (") для обозначения строковых литералов — как в языке запросов, так и в встроенном языке программирования. Когда внутри такой строки встречается ещё одна кавычка, система воспринимает её как конец строки, что приводит к ошибке компиляции или выполнения.
Примеры проблемных ситуаций:
- 🔹 Формирование SQL-запроса с условием
WHERE Наименование ="ООО"Ромашка""— лишняя кавычка ломает синтаксис. - 🔹 Создание JSON-строки для API, где значения содержат кавычки:
{"name":"Иванов"Петр""}. - 🔹 Вывод текста в отчёт с цитатами:
"Клиент сказал:"Срочно!"".
В других языках программирования (например, в JavaScript или Python) эту проблему решают экранированием с помощью обратного слэша (\). Однако в 1С подход иной — здесь используются удвоение кавычек или специальные функции.
Способ 1: Удвоение кавычек — стандартный метод платформы
Самый распространённый и рекомендуемый способ — заменить одиночную кавычку внутри строки на две подряд. Платформа 1С автоматически интерпретирует их как один символ.
Примеры использования:
- В
Запросах:Запрос.Текст ="ВЫБРАТЬ Наименование|ИЗ Справочник.Контрагенты
|ГДЕ Наименование =""ООО""Ромашка"""";
- В
Строкахвстроенного языка:Сообщение ="Клиент сказал:""Срочно!"""; - В
Текстовых документах:ТекстДок.ДобавитьСтроку("Примечание:""Товар хрупкий""");
✅ Плюсы метода: работает во всех версиях 1С, не требует дополнительных функций, поддерживается во всех контекстах (запросы, код, отчёты).
❌ Минусы: визуально усложняет чтение кода, особенно в длинных строках с множеством кавычек.
☑️ Проверка удвоения кавычек
Способ 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С не поддерживает \ как экранированиеСообщение ="Клиент сказал: \"Срочно!\""; // Не сработает!
🔹 Решение: используйте удвоение или
Char(34). - Путаница с апострофами:
// Ошибка: апострофы в стандартном запросе 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С для этого:
- Используйте
СтрЗначениеВнутрдля значений. - Заменяйте кавычки вручную через
СтрЗаменить:
JSONЗначение = СтрЗаменить(СтрЗначениеВнутр(Текст),"""","\""");
Как проверить, правильно ли экранированы кавычки в запросе?
Возможные способы:
- 🔹 Выведите текст запроса в
Сообщитьи визуально проверьте парность кавычек. - 🔹 Используйте Синтакс-помощник в конфигураторе (он подсветит ошибки).
- 🔹 Выполните запрос в отладчике пошагово, чтобы увидеть итоговую строку.
Есть ли разница в экранировании кавычек в тонком клиенте и веб-клиенте?
Нет, механизм экранирования кавычек не зависит от режима работы (тонкий клиент, веб-клиент, толстый клиент). Все описанные методы (удвоение, СтрЗначениеВнутр, Char(34)) работают одинаково во всех режимах.
Исключение — вывод в HTML (веб-клиент), где для отображения кавычек может потребоваться замена на ".