Кавычка внутри строки 1С: удвоение, Символ(34) и параметры запроса
Содержание
Чтобы указать кавычку внутри строки в коде 1С:Предприятие, её удваивают: "Он сказал ""да""" даёт текст Он сказал "да". Второй способ — вставить символ по коду: Символ(34). Удвоение удобно для коротких литералов, Символ(34) — когда кавычек много и код должен читаться.
В тексте запроса кавычки приходится удваивать дважды, поэтому там лучше вообще не писать значения строкой, а передавать их параметром. При загрузке CSV, JSON и XML кавычки обрабатывают по правилам формата, и для каждого есть свой приём. Всё это одинаково работает в любой конфигурации на платформе 8.3: это правила встроенного языка, а не БП или ЗУП.
Как платформа читает кавычки в строковом литерале
Строка во встроенном языке 1С всегда ограничена двойными кавычками ". Платформа читает символы до следующей кавычки и считает, что литерал закончился. Поэтому одиночная кавычка внутри текста обрывает строку, а всё после неё компилятор пытается разобрать как код.
Правило экранирования одно: две кавычки подряд внутри литерала превращаются в одну кавычку в значении. Никаких обратных слэшей, как в C или JavaScript, в 1С нет. Запись \" синтаксис 1С не понимает: обратный слэш останется в строке обычным символом, а кавычка после него закроет литерал.
| Что пишем в коде | Что получится в значении |
|---|---|
"ООО ""Ромашка""" | ООО "Ромашка" |
"""" | " (одна кавычка) |
"""""" | "" (две кавычки) |
"" | пустая строка |
"Путь ""C:\Base""" | Путь "C:\Base" |
Как считать кавычки в сложном литерале:
- Первая кавычка открывает строку, последняя закрывает.
- Всё, что между ними, разбейте на пары
"": каждая пара — одна кавычка в тексте. - Если в конце литерала стоят три кавычки подряд
""", это одна кавычка в тексте плюс закрывающая.
Пример с выводом сообщения:
Наименование = "ООО ""Ромашка""";
Сообщить("Контрагент " + Наименование + " записан"); // Контрагент ООО "Ромашка" записан
Многострочный литерал подчиняется тому же правилу. Каждую следующую строку начинают с вертикальной черты |, а кавычки внутри удваивают как обычно:
Текст = "Уважаемый клиент!
|Ваш заказ ""№ 125"" готов к отгрузке.";
В Конфигураторе незакрытый литерал видно сразу: подсветка строки «протекает» на следующие строки модуля. Если весь хвост модуля стал цветом строковых констант, ищите кавычку без пары выше этого места.
Склейка строк с кавычками: оператор «+» и СтрШаблон
Когда кавычки обрамляют значение из переменной, удвоение быстро превращается в забор из """". Код читается проще, если вынести кавычку в отдельную переменную и склеивать части оператором +.
Кавычка = """";
Текст = "Договор " + Кавычка + Договор.Наименование + Кавычка + " от " + Формат(Договор.Дата, "ДЛФ=D");
Тот же результат даёт СтрШаблон. Подстановки %1, %2 подставляют значения, а кавычки вокруг них удваиваются в шаблоне один раз:
Текст = СтрШаблон("Договор ""%1"" от %2", Договор.Наименование, Формат(Договор.Дата, "ДЛФ=D"));
СтрШаблон есть в платформе 8.3 начиная с 8.3.6. В старых конфигурациях на 8.2 используют склейку.
Число со строкой не склеивайте напрямую: при склейке через + число превратится в строку с разделителем групп разрядов, например 1 250. Оберните его в Формат(Сумма, "ЧГ=0") или передайте в СтрШаблон уже отформатированную строку.
Кавычки в командной строке
Отдельный частый случай — пути с пробелами в ЗапуститьПриложение или КомандаСистемы. Windows требует кавычки вокруг пути, а 1С — их удвоения:
ЗапуститьПриложение("""C:\Program Files\1cv8\common\1cestart.exe"" ENTERPRISE /F""D:\Bases\Buh""");
Операционная система получит строку "C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"D:\Bases\Buh". Если запутались в количестве кавычек, соберите команду по частям через переменную Кавычка и выведите её Сообщить() перед запуском.
Кавычки в тексте запроса 1С
Текст запроса — это тоже строка встроенного языка, а внутри языка запросов строковые литералы ограничены теми же двойными кавычками. Получается два уровня:
- 🔹 в самом запросе литерал пишут как
"ООО Ромашка"; - 🔹 в модуле этот запрос уже лежит внутри строки, поэтому каждая кавычка удваивается:
""ООО Ромашка"".
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = ""7701234567""";
Если в самом значении есть кавычки, например ООО "Ромашка", литерал превращается в нечитаемую последовательность из восьми кавычек подряд. Правильный путь — параметр запроса. Платформа передаёт значение как есть, никакого экранирования не нужно:
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", "ООО ""Ромашка""");
Параметры решают сразу три задачи: не нужно считать кавычки, запрос не ломается от «неудобных» символов в данных, а план запроса СУБД может переиспользовать.
Конструктор запроса в Конфигураторе сам удваивает кавычки и расставляет | в начале строк, когда вставляет текст в модуль. Если правите запрос руками, проще открыть его снова в конструкторе, чем считать кавычки.
Поиск по части наименования с кавычками
Для ПОДОБНО кавычка — обычный символ, спецсимволами там считаются %, _ и квадратные скобки. Шаблон тоже передавайте параметром:
Запрос.Текст = "... ГДЕ Контрагенты.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%""Ромашка""%");
Такой запрос найдёт ООО "Ромашка", но не найдёт ООО «Ромашка»: прямые кавычки и ёлочки — разные символы. Как с этим бороться, разобрано ниже, в разделе про импорт.
Символ(34) и коды кавычек
Функция Символ(Код) возвращает символ по его коду Unicode, а КодСимвола(Строка, Позиция) — обратное. Для латинских символов коды совпадают с ASCII.
| Символ | Название | Код |
|---|---|---|
" | прямая двойная кавычка | 34 |
' | апостроф, одинарная кавычка | 39 |
« | ёлочка открывающая | 171 |
» | ёлочка закрывающая | 187 |
„ | лапка открывающая (нижняя) | 8222 |
“ | лапка открывающая (верхняя) | 8220 |
” | лапка закрывающая | 8221 |
Кавычка = Символ(34);
Текст = "Организация " + Кавычка + "Ромашка" + Кавычка; // Организация "Ромашка"
В системном перечислении Символы есть перевод строки, возврат каретки, табуляция и неразрывный пробел (Символы.ПС, Символы.ВК, Символы.Таб, Символы.НПП), а кавычки нет. Её получают только через Символ(34) или литерал """".
Узнать, какая кавычка на самом деле стоит в строке, помогает проверка кода. Это первое, что стоит сделать, когда «одинаковые» наименования не совпадают при сравнении:
Для Сч = 1 По СтрДлина(Наименование) Цикл
Код = КодСимвола(Наименование, Сч);
Если Код = 34 Или Код = 171 Или Код = 187 Или Код = 8220 Или Код = 8221 Или Код = 8222 Тогда
Сообщить(Формат(Сч, "ЧГ=0") + ": код " + Формат(Код, "ЧГ=0"));
КонецЕсли;
КонецЦикла;
Апостроф и двойная кавычка: где какая в 1С
Одинарная кавычка в 1С строку не ограничивает. У неё свои задачи, и путать их с двойной нельзя.
- 📅 Литерал даты.
'20250115'— это дата 15 января 2025 года,'20250115143000'— дата и время. Запись'Ромашка'компилятор примет за неверную константу даты и выдаст ошибку. - ⚙️ Значения внутри форматной строки. В функции
Форматапостроф обрамляет значение параметра:Формат(Дата, "ДФ='dd.MM.yyyy'"). Двойные кавычки здесь ограничивают всю форматную строку, апострофы — значение внутри неё. - 🌐 Мультиязычные строки
НСтр. Текст для каждого языка заключают в апострофы:НСтр("ru = 'Документ записан'; en = 'Document saved'"). Апостроф внутри такого текста удваивают:НСтр("en = 'Customer''s order'"). - ✏️ Обычный текст. В значении строки апостроф ничем не мешает:
"Д'Артаньян"пишется как есть, без экранирования.
Итог: в обычной строке экранируют только двойную кавычку, а апостроф — только внутри НСтр и форматных строк.
Как набрать кавычку в форме
Пользователю в режиме 1С:Предприятие ничего экранировать не нужно: поле ввода принимает любые символы. Прямая кавычка " в русской раскладке — Shift+2, в английской — Shift+'. Ёлочки набирают на цифровом блоке с включённым NumLock: Alt+0171 для « и Alt+0187 для ».
Кавычки при загрузке и выгрузке данных
На обмене данными кавычки ломаются чаще всего. Причина в том, что у каждого формата своё правило экранирования, а у источника данных — своя привычка ставить кавычки.
| Формат | Как экранируется кавычка | Что делать в 1С |
|---|---|---|
| CSV | поле в кавычках, кавычка внутри удвоена | разбирать построчно своим парсером |
| JSON | \" | ЗаписьJSON и ЧтениеJSON делают это сами |
| XML | " в атрибутах | ЗаписьXML, ЧтениеXML, XDTO — сами |
| Excel через табличный документ | не экранируется | читать значение ячейки как есть |
CSV: почему не подходит СтрРазделить
Поле с разделителем или кавычкой внутри CSV пишут в кавычках, а кавычку удваивают: 1;"ООО ""Ромашка"", филиал";100. СтрРазделить(Строка, ";") об этом не знает и порежет такое поле на куски. Разбирайте строку посимвольно:
Функция РазобратьСтрокуCSV(Строка, Разделитель = ";")
Результат = Новый Массив;
Поле = "";
ВКавычках = Ложь;
Длина = СтрДлина(Строка);
Сч = 1;
Пока Сч <= Длина Цикл
С = Сред(Строка, Сч, 1);
Если ВКавычках Тогда
Если С = """" Тогда
Если Сред(Строка, Сч + 1, 1) = """" Тогда
Поле = Поле + """";
Сч = Сч + 1;
Иначе
ВКавычках = Ложь;
КонецЕсли;
Иначе
Поле = Поле + С;
КонецЕсли;
ИначеЕсли С = """" Тогда
ВКавычках = Истина;
ИначеЕсли С = Разделитель Тогда
Результат.Добавить(Поле);
Поле = "";
Иначе
Поле = Поле + С;
КонецЕсли;
Сч = Сч + 1;
КонецЦикла;
Результат.Добавить(Поле);
Возврат Результат;
КонецФункции
Для строки из примера функция вернёт три поля: 1, ООО "Ромашка", филиал и 100. Поля с переносом строки внутри кавычек она не склеивает: если они встречаются, читайте файл целиком и разбирайте его тем же автоматом без деления на строки.
При выгрузке в CSV делайте обратное: удвойте кавычки и обрамите поле.
Функция ПолеCSV(Значение)
Возврат """" + СтрЗаменить(Значение, """", """""") + """";
КонецФункции
Ёлочки, лапки и прямые кавычки в наименованиях
Контрагенты из выписки банка приходят с прямыми кавычками, из ЕГРЮЛ — с ёлочками, из Word — с лапками. В справочнике появляются три «разных» ООО Ромашка, а поиск по наименованию находит только одно.
Перед сравнением приведите строку к одному виду:
Функция НормализоватьКавычки(Знач Текст)
Для Каждого Код Из СтрРазделить("171,187,8220,8221,8222", ",") Цикл
Текст = СтрЗаменить(Текст, Символ(Число(Код)), """");
КонецЦикла;
Возврат Текст;
КонецФункции
Если кавычки для сравнения вообще не важны, уберите их полностью: СтрЗаменить(Текст, """", "") после нормализации. Сравнивайте нормализованные строки, а в справочник записывайте наименование в том виде, который принят в вашей учётной политике. Надёжнее всего искать контрагента по ИНН и КПП, а не по наименованию.
Массовую замену кавычек в наименованиях справочника делайте только на копии базы и после согласования: наименование попадает в печатные формы, отчёты и выгрузки в ЭДО.
Частые ошибки с кавычками и как их найти
Частые вопросы
Можно ли в 1С экранировать кавычку обратным слэшем?
Как получить строку из одной кавычки?
"""" или Символ(34). Оба варианта дают одинаковое значение длиной в один символ.Нужно ли удваивать кавычки в значении параметра запроса?
"ООО ""Ромашка""". Второго удвоения для языка запросов не нужно, параметр передаётся в СУБД как значение.Как убрать все кавычки из наименования?
СтрЗаменить(Наименование, """", ""). Если в данных бывают ёлочки и лапки, сначала замените их на прямые кавычки, а затем удалите.Влияют ли кавычки в наименовании на выгрузку в XML и ЭДО?
ЗаписьXML или XDTO: платформа сама экранирует кавычки по правилам XML. Ломается только XML, собранный склейкой строк вручную.