Как экранировать кавычки в 1С и ставить «ёлочки» в документах
Содержание
Чтобы написать кавычку внутри строки в коде 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).