Как экранировать кавычки в 1С и ставить «ёлочки» в документах

· 10 мин

Содержание

Чтобы написать кавычку внутри строки в коде 1С, её нужно удвоить: "ООО ""Ромашка""" даст на выходе ООО "Ромашка". Строки во встроенном языке 1С берутся только в двойные кавычки, а одинарные кавычки — это литерал даты ('20240131'), а не строка. В документах и справочниках, наоборот, ничего удваивать не надо: пользователь вводит кавычки как есть, прямые или «ёлочки».

Правила простые, но путаница возникает на стыках: текст запроса внутри модуля, выгрузка в JSON и CSV, печатная форма с наименованием контрагента. По каждому такому месту — свой разбор с примерами кода, которые можно копировать.

Как кавычки работают в строках встроенного языка

Во встроенном языке 1С строковый литерал открывается и закрывается двойной кавычкой ". Других способов задать строку нет: ни одинарные кавычки, ни обратные апострофы строкой не считаются.

Три правила, которые закрывают почти все случаи:

  • ✌️ Кавычка внутри строки удваивается. Два знака "" внутри литерала превращаются в один " в значении.
  • 📅 Одинарные кавычки — это дата. '20240131' — 31 января 2024 года, '20240131235959' — та же дата с временем. Буквы внутри одинарных кавычек вызовут ошибку.
  • 🔤 «Ёлочки» и апостроф — обычные символы. Внутри строки их ничем экранировать не надо: "ООО «Ромашка»" и "Д'Артаньян" записываются как есть.

Несколько примеров, чтобы набить руку:

Текст1 = "Он сказал: ""Готово""";        // Он сказал: "Готово"
Текст2 = """";                           // одна кавычка "
Текст3 = """""";                         // две кавычки ""
Текст4 = "";                             // пустая строка
Текст5 = "ООО «Ромашка»";                // ёлочки без экранирования
Дата1  = '20240131';                     // это дата, а не строка

Посчитать кавычки в """ легко запутаться. Помогает приём: крайние кавычки — это границы строки, всё, что между ними, читайте парами.

Кавычка через код символа

Если удвоение мешает читать код, кавычку можно получить функцией Символ(). Код прямой двойной кавычки — 34, «ёлочек» — 171 и 187.

Кавычка = Символ(34);
Текст = "ООО " + Кавычка + "Ромашка" + Кавычка;   // ООО "Ромашка"

ОткрЁлочка = Символ(171);   // «
ЗакрЁлочка = Символ(187);   // »

Обратная функция КодСимвола("""") вернёт 34. Это удобно, когда нужно проверить, какая именно кавычка пришла из внешнего файла.

Многострочные строки и шаблоны

Длинный текст переносят на новую строку, начиная продолжение с вертикальной черты |. Кавычки внутри по-прежнему удваиваются, черта на них не влияет.

Сообщение = "Документ ""Счёт на оплату""
|не проведён.
|Проверьте поле ""Контрагент"".";

Для подстановки значений удобнее СтрШаблон(): кавычки остаются в шаблоне, а значение подставляется в %1.

Имя = "Ромашка";
Текст = СтрШаблон("Контрагент ""%1"" не найден", Имя);
// Контрагент "Ромашка" не найден

Кавычки в тексте запроса: два уровня экранирования

В языке запросов строковые константы тоже пишутся в двойных кавычках. В консоли запросов или в конструкторе вы пишете "%Ромашка%" с одной парой кавычек.

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

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

Здесь ""%Ромашка%"" в модуле превращается в "%Ромашка%" в тексте запроса. А если искомое значение само содержит кавычки, понадобится уже четыре знака подряд — читать такой код невозможно.

Правильный путь — параметры

Значение с кавычками не нужно вшивать в текст запроса. Передайте его параметром, и вопрос экранирования внутри запроса исчезнет:

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

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

Для ПОДОБНО шаблон тоже можно передать параметром, склеив процент в коде: "%" + Строка + "%". Если в искомой строке есть % или _, их экранируют через СПЕЦСИМВОЛ, иначе они сработают как маска.

Если открыть конструктор запроса из модуля (через контекстное меню на тексте запроса), он сам удвоит кавычки при возврате текста в код. Копировать запрос из консоли в модуль руками — частый источник ошибок.

Одинарные кавычки в запросах не работают

В языке запросов нет литерала даты в одинарных кавычках. Дату задают функцией ДАТАВРЕМЯ(2024, 1, 31) или, что лучше, параметром. Привычка из SQL писать 'ООО' в 1С даст синтаксическую ошибку.

Кавычки в документах, справочниках и печатных формах

В пользовательском режиме удваивать кавычки не нужно. Поле наименования, комментарий, назначение платежа принимают любые символы как обычный текст.

Какие кавычки ставить и как их набрать

В русских документах принято писать «ёлочки»: ООО «Ромашка», договор «На поставку». Прямые кавычки “…” тоже допустимы, но в одной базе лучше держаться одного варианта.

СимволКак набрать в WindowsГде уместен
" прямаяShift+2 в русской раскладке, Shift+Э в английскойКод, технические поля, выгрузки
« открывающая ёлочкаAlt+0171 на цифровом блокеНаименования, тексты документов
» закрывающая ёлочкаAlt+0187 на цифровом блокеТо же
' апострофклавиша Э в английской раскладкеФамилии и названия с апострофом

Комбинации Alt работают при включённом NumLock и только с цифрового блока клавиатуры. На ноутбуке без цифрового блока проще скопировать «ёлочки» из любого текста или наименования в базе.

Почему важна единообразность

Для 1С «Ромашка» и "Ромашка" — разные строки. Это проявляется в трёх местах:

  • 🔎 Поиск в списке. Ввели в строку поиска "Ромашка" с прямыми кавычками, а в справочнике записано с ёлочками — элемент не найдётся. Ищите по слову без кавычек.
  • 👯 Дубли контрагентов. Один пользователь завёл «Ромашку» с ёлочками, другой — с прямыми кавычками. Проверка дублей по наименованию их не свяжет, выручает поиск по ИНН.
  • 🧾 Печатные формы. Наименование попадает в счёт, акт и счёт-фактуру ровно в том виде, как записано в карточке. Кавычки в документе для покупателя будут такими же.

Если контрагента заполняют по ИНН из реестра, наименование приходит в том виде, как оно записано в источнике. Править его вручную не обязательно, но для внутреннего единообразия лучше договориться о стандарте.

Кавычки в макете печатной формы

В макете табличного документа текст ячейки — не строка кода. Пишите кавычки так, как они должны выглядеть на бумаге: Счёт на оплату по договору «[Договор]» — без всякого удвоения.

Удвоение нужно только там, где текст ячейки задаётся из модуля, например через Область.Параметры.Заголовок = "...". Правило здесь то же, что для любой строки кода.

Кавычки в JSON, XML и CSV при обмене данными

У каждого формата обмена своя схема экранирования. Главный совет — не собирать эти форматы склейкой строк, а использовать объекты платформы, которые экранируют сами.

ФорматКак экранируется кавычкаЧем писать в 1С
JSON\" (обратная косая черта)ЗаписьJSON + ЗаписатьJSON()
XML (атрибут)"ЗаписьXML
XML (текст элемента)можно не экранироватьЗаписьXML
CSVудвоение "", поле в кавычкахсвоя функция, пример ниже

JSON

Объект ЗаписьJSON сам превратит кавычку в \". Ничего заменять вручную не нужно:

Данные = Новый Структура("Наименование", "ООО ""Ромашка""");

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
Результат = Запись.Закрыть();
// В результате будет: "Наименование": "ООО \"Ромашка\""

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

XML

ЗаписьXML экранирует спецсимволы сама: в значениях атрибутов кавычка станет ", амперсанд — &, знак «меньше» — <. Ёлочки экранировать не нужно, это обычные символы Юникода.

Ручная склейка XML ломается чаще всего не на кавычках, а на амперсанде: наименование вроде ООО "Смит & Ко" в атрибуте без экранирования даст ошибку при загрузке.

CSV для Excel

В CSV поле, которое содержит кавычку, разделитель или перенос строки, берут в кавычки, а кавычки внутри удваивают. Готового объекта для этого в платформе нет, поэтому пригодится короткая функция:

Функция ПолеCSV(Знач Значение, Разделитель = ";") Экспорт

	Текст = Строка(Значение);
	НужныКавычки = СтрНайти(Текст, """") > 0
		Или СтрНайти(Текст, Разделитель) > 0
		Или СтрНайти(Текст, Символы.ПС) > 0;

	Если НужныКавычки Тогда
		Текст = """" + СтрЗаменить(Текст, """", """""") + """";
	КонецЕсли;

	Возврат Текст;

КонецФункции

Для строки ООО "Ромашка" функция вернёт "ООО ""Ромашка""", и Excel откроет файл с правильным наименованием в одной ячейке. Разделитель ; выбран потому, что русская версия Excel по умолчанию ожидает именно его.

При разборе CSV функция СтрРазделить() не годится, если в полях бывают кавычки: она разрежет "ООО ""Альфа; Бета""" по точке с запятой внутри наименования. Такой файл разбирают посимвольно, отслеживая, открыта ли сейчас кавычка.

Ошибки с кавычками, которые встречаются чаще других

Большинство проблем видно по симптому. Выберите свой случай:

Диагностика: выберите симптом

Отдельно про двойное экранирование: если строку с удвоенными кавычками сохранить в реквизит, а потом снова удвоить при выгрузке, в файле окажется ""Ромашка"". Удваивайте только в литералах кода и в CSV, а не в данных, которые хранятся в базе.

Автоматическая замена прямых кавычек на «ёлочки»

Когда в справочнике накопились наименования с прямыми кавычками, их можно привести к единому виду обработкой. Простое чередование «открыть — закрыть» ломается на вложенных кавычках, поэтому надёжнее смотреть на соседний символ: после пробела, скобки или в начале строки кавычка открывающая, иначе — закрывающая.

Функция ПрямыеВЁлочки(Знач Текст) Экспорт

	Результат = "";
	Предыдущий = "";

	Для Индекс = 1 По СтрДлина(Текст) Цикл

		Знак = Сред(Текст, Индекс, 1);

		Если Знак = """" Тогда
			Открывающая = (Предыдущий = "")
				Или (Предыдущий = " ")
				Или (Предыдущий = "(")
				Или (Предыдущий = Символ(171));
			Результат = Результат + ?(Открывающая, Символ(171), Символ(187));
		Иначе
			Результат = Результат + Знак;
		КонецЕсли;

		Предыдущий = Знак;

	КонецЦикла;

	Возврат Результат;

КонецФункции

Проверим на примерах. ООО "Ромашка" станет ООО «Ромашка». АО "Завод "Прогресс"" станет АО «Завод «Прогресс»»: обе внутренние кавычки после пробела и после буквы определены верно.

Переменная названа Знак, а не Символ, чтобы не перекрыть одноимённую глобальную функцию — иначе вызов Символ(171) внутри цикла сломается.

Массовая замена в наименованиях меняет то, что увидят покупатели в печатных формах и что уйдёт в обмены и ЭДО. Перед запуском обработки на рабочей базе сделайте резервную копию и проверьте результат на нескольких элементах.

Обработку удобно запускать на выборке через запрос с условием Наименование ПОДОБНО "%""%" (в модуле — с удвоением, как разбиралось выше). Так вы затронете только элементы, где прямые кавычки действительно есть.

Что изменилось между 8.2 и 8.3

Сам синтаксис кавычек между версиями платформы не менялся: удвоение, двойные кавычки для строк, одинарные для дат, вертикальная черта для переноса работают одинаково. Код с кавычками из 8.2 переносится в 8.3 без правок.

Разница — в инструментах вокруг строк. Они появились в 8.3, начиная с версии платформы 8.3.6:

  • 🧩 СтрШаблон() — подстановка значений в текст без склейки и лишних кавычек.
  • ✂️ СтрНайти() и СтрРазделить() — поиск и разбиение строк.
  • 📦 ЗаписьJSON и ЧтениеJSON — работа с JSON с автоматическим экранированием.

В 8.2 JSON приходилось собирать вручную и экранировать кавычки самостоятельно, через СтрЗаменить. Если вы сопровождаете старый код с такой ручной сборкой, при переходе на 8.3 его стоит переписать на штатные объекты: это убирает целый класс ошибок с кавычками.

Частые вопросы

Нужно ли экранировать апостроф в строке 1С?
Нет. Внутри строки в двойных кавычках апостроф — обычный символ: "Д'Артаньян" записывается как есть.
Как проверить, есть ли в строке кавычка?
Используйте СтрНайти(Текст, """") > 0. Для ёлочек — СтрНайти(Текст, Символ(171)) > 0.
Как убрать все кавычки из наименования?
Вызовите СтрЗаменить() для каждого вида кавычек: СтрЗаменить(Текст, """", ""), затем то же для Символ(171) и Символ(187).
Почему в выгруженном CSV кавычки стоят двойными?
Так требует формат: кавычка внутри поля удваивается. Excel при открытии файла покажет одну кавычку.
Можно ли писать ёлочки прямо в коде модуля?
Да. Это обычные символы, экранировать их не нужно. Модуль сохраняется в Юникоде, текст не испортится.