Кавычка внутри строки 1С: удвоение, Символ(34) и параметры запроса

· 10 мин

Содержание

Чтобы указать кавычку внутри строки в коде 1С:Предприятие, её удваивают: "Он сказал ""да""" даёт текст Он сказал "да". Второй способ — вставить символ по коду: Символ(34). Удвоение удобно для коротких литералов, Символ(34) — когда кавычек много и код должен читаться.

В тексте запроса кавычки приходится удваивать дважды, поэтому там лучше вообще не писать значения строкой, а передавать их параметром. При загрузке CSV, JSON и XML кавычки обрабатывают по правилам формата, и для каждого есть свой приём. Всё это одинаково работает в любой конфигурации на платформе 8.3: это правила встроенного языка, а не БП или ЗУП.

Как платформа читает кавычки в строковом литерале

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

Правило экранирования одно: две кавычки подряд внутри литерала превращаются в одну кавычку в значении. Никаких обратных слэшей, как в C или JavaScript, в 1С нет. Запись \" синтаксис 1С не понимает: обратный слэш останется в строке обычным символом, а кавычка после него закроет литерал.

Что пишем в кодеЧто получится в значении
"ООО ""Ромашка"""ООО "Ромашка"
""""" (одна кавычка)
"""""""" (две кавычки)
""пустая строка
"Путь ""C:\Base"""Путь "C:\Base"

Как считать кавычки в сложном литерале:

  1. Первая кавычка открывает строку, последняя закрывает.
  2. Всё, что между ними, разбейте на пары "": каждая пара — одна кавычка в тексте.
  3. Если в конце литерала стоят три кавычки подряд """, это одна кавычка в тексте плюс закрывающая.

Пример с выводом сообщения:

Наименование = "ООО ""Ромашка""";
Сообщить("Контрагент " + Наименование + " записан"); // Контрагент ООО "Ромашка" записан

Многострочный литерал подчиняется тому же правилу. Каждую следующую строку начинают с вертикальной черты |, а кавычки внутри удваивают как обычно:

Текст = "Уважаемый клиент!
|Ваш заказ ""№ 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, собранный склейкой строк вручную.