Как правильно передавать специальные символы и одинарные кавычки в JSON из 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При интеграции систем 1С с внешними веб-сервисами через формат JSON разработчики часто сталкиваются с ситуацией, когда стандартные методы формирования строки не срабатывают или принимающая сторона (сервер) некорректно обрабатывает переданные данные. Одной из самых коварных проблем является передача специальных символов, таких как двойные и одинарные кавычки, обратные слеши и символы переноса строк. Рассмотрим подробнее, почему возникают эти ошибки и как их эффективно обойти.

Причина возникновения проблемы: Стандарт JSON vs Реальность

Проанализируем техническую сторону вопроса. Согласно официальному стандарту RFC 8259, строки в JSON должны заключаться в двойные кавычки. Внутри этих строк обязательному экранированию (добавлению обратного слеша \ перед символом) подлежат только:

  1. Двойная кавычка " превращается в \"
  2. Обратный слеш \ превращается в \\
  3. Управляющие символы (такие как перенос строки или табуляция)

Важно понимать, что одинарная кавычка ' в базовом стандарте JSON не является спецсимволом и не требует экранирования. Однако на практике многие серверные парсеры (особенно самописные или использующие устаревшие библиотеки PHP/JavaScript) могут воспринимать JSON как JavaScript-объект, где одинарная кавычка может служить разделителем. Именно здесь начинаются трудности: попытка передать \' может быть отвергнута строгим парсером как ошибка, а неэкранированная кавычка может вызвать сбой на стороне базы данных сервера.

Вариант 1. Ручное экранирование спецсимволов через СтрЗаменить

Если вы используете собственные наработки для формирования JSON-строки (например, в старых конфигурациях 1С, где нет встроенных объектов), вам необходимо обеспечить корректную замену базовых символов. Разберем пример кода, который позволяет подготовить строку к передаче:


// Подготовка строки для вставки в JSON
ТекстДляВыгрузки = "Наименование 'Товар' \ ""Кавычки""";

// 1. Сначала обрабатываем обратные слеши, чтобы не испортить последующие замены
ТекстДляВыгрузки = СтрЗаменить(ТекстДляВыгрузки, "\", "\\");

// 2. Обрабатываем прямые слеши (часто требуется для корректности путей)
ТекстДляВыгрузки = СтрЗаменить(ТекстДляВыгрузки, "/", "\/");

// 3. Экранируем двойные кавычки
ТекстДляВыгрузки = СтрЗаменить(ТекстДляВыгрузки, """", "\""");

// 4. Решаем проблему с одинарной кавычкой (если сервер её не принимает)
// Попробуем универсальное Unicode-экранирование
ТекстДляВыгрузки = СтрЗаменить(ТекстДляВыгрузки, "'", "\u0027");

Обратите внимание на использование \u0027. Это самый надежный способ передачи любого капризного символа. Стандартный парсер на стороне сайта автоматически преобразует \u0027 обратно в символ одинарной кавычки при чтении файла, при этом структура JSON не будет нарушена.

Вариант 2. Использование HTML-сущностей как обходной путь

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


// Замена двойной кавычки на HTML-сущность "
// Это позволяет избежать конфликтов парсера JSON
ТекстЗапроса = СтрЗаменить(ИсходнаяСтрока, """", """);

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

Вариант 3. Использование системного объекта ЗаписьJSON (Рекомендуемый)

Выясним причину, по которой ручное формирование JSON считается плохой практикой. Современная платформа 1С (начиная с версии 8.3.6) предоставляет мощный инструмент — объект ЗаписьJSON. Этот объект берет на себя всю работу по соблюдению стандартов, включая корректное экранирование всех необходимых символов.

Рассмотрим, как правильно сформировать JSON с помощью системных средств:


// Создаем объект записи
Запись = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина);
Запись.УстановитьСтроку(ПараметрыЗаписи);

// Формируем структуру данных (например, Соответствие или Структура)
ДанныеДляВыгрузки = Новый Структура;
ДанныеДляВыгрузки.Вставить("Наименование", "Тапочки 'Три ноги' ""СпецКавычки""");
ДанныеДляВыгрузки.Вставить("Путь", "C:\Files\Data");

// Записываем данные - 1С сама расставит все слеши и кавычки
ЗаписатьJSON(Запись, ДанныеДляВыгрузки);

// Получаем готовый валидный текст
РезультатJSON = Запись.Закрыть();

Преимущества этого метода очевидны:

Итоги и рекомендации

Подведем итоги нашего анализа. Если вы столкнулись с проблемой передачи кавычек в JSON:

  1. В первую очередь попробуйте использовать объект ЗаписьJSON и метод ЗаписатьJSON(). Это решит 99% проблем со спецсимволами автоматически.
  2. Если вы вынуждены собирать строку вручную, используйте Unicode-последовательности (например, \u0027 для одиночной кавычки). Это сделает ваш JSON валидным и понятным для любого стандартного парсера.
  3. Избегайте простых замен типа \', так как они не входят в стандарт JSON и часто вызывают ошибки Invalid escape sequence.
  4. Если сервер «глупый» и требует особого подхода, только тогда используйте замену на HTML-сущности ", помня о последствиях для поиска и аналитики.

Совместное использование правильных методов кодирования и стандартов платформы 1С позволит вам создавать надежные интеграции, которые будут работать корректно с любыми веб-сервисами.

← На главную