Почему при формировании JSON в 1С дублируется обратный слеш и как это исправить?

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

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

Выясняем причину: стандарт RFC 7159 и механизм экранирования

Для начала проанализируем ситуацию с точки зрения мировых стандартов. Формат JSON строго регламентирован документом RFC 7159. Согласно этому стандарту, обратный слеш является служебным символом, который используется для начала управляющих последовательностей (например, \n — перевод строки, \t — табуляция).

Чтобы интерпретатор JSON понял, что мы хотим передать именно символ обратного слеша, а не управляющую команду, этот символ обязан быть экранирован самим собой. Таким образом, последовательность \\ внутри JSON-строки — это единственно верный способ передать один символ \.

Рассмотрим пример. Если мы передадим в 1С строку:

ПутьКФайлу = "C:\Users\Admin";

Платформа при вызове функции ЗаписатьJSON сформирует следующий текст (используйте Просмотр JSON с форматированием для проверки):


{
  "path": "C:\\Users\\Admin"
}

Важный момент: если принимающая система (написанная на Python, JavaScript, PHP или Java) использует стандартную библиотеку для парсинга JSON, то после прочтения этого файла она автоматически преобразует \\ обратно в \. Проблема возникает только в том случае, если принимающая сторона читает файл не как JSON, а как обычный текст, или если используется некорректно настроенный парсер.

Почему настройки ЭкранированиеСимволовJSON не помогают?

Многие разработчики пытаются решить проблему, используя объект ПараметрыЗаписиJSON. Давайте разберем, почему стандартные настройки не дают ожидаемого эффекта в случае с обратным слешем. Рассмотрим типичную попытку отключить экранирование:


ПараметрыJSON = Новый ПараметрыЗаписиJSON(,,, ЭкранированиеСимволовJSON.Нет,,, , , Ложь);
ЗаписатьJSON(ЗаписьJSON, Массив, ПараметрыJSON);

В 1С перечисление ЭкранированиеСимволовJSON.Нет управляет только необязательным экранированием. К нему относятся:

  1. Символы кириллицы (преобразование в \uXXXX).
  2. Прямой слеш / (который в JSON можно писать и так, и как \/).

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

Способ 1: Использование прямого слеша для путей

Если ваша задача связана с передачей путей к файлам в операционной системе Windows, самым элегантным решением будет замена обратного слеша на прямой /. Современные операционные системы и практически все языки программирования прекрасно понимают прямой слеш в путях.

Проанализируем пример трансформации данных перед записью:


ИсходныйПуть = "C:\Pictures\Photo.jpg";
БезопасныйПуть = СтрЗаменить(ИсходныйПуть, "\", "/");
// Результат: "C:/Pictures/Photo.jpg"

При записи такой строки в JSON никакого дополнительного экранирования не произойдет, и строка останется читаемой и валидной.

Способ 2: Постобработка итоговой строки (если "очень нужно")

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

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

  1. Формируем JSON в строку с помощью ЗаписьJSON.УстановитьСтроку().
  2. Закрываем запись и получаем итоговый текст.
  3. Применяем функцию СтрЗаменить для удаления дублей.

Пример кода:


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

// Принудительно убираем двойные слеши
ФинальныйТекст = СтрЗаменить(РезультатJSON, "\\", "\");

Внимание: Этот метод потенциально опасен. Если в ваших данных встречаются настоящие управляющие символы (например, перевод строки, который 1С записала как \n), после такой замены они превратятся в n, и структура данных будет безнадежно испорчена. Используйте этот метод только в том случае, если вы на 100% уверены в составе передаваемых данных.

Способ 3: Ручное формирование JSON-строки

Для очень простых структур, где использование ЗаписатьJSON кажется избыточным, а требования к формату специфичны, можно прибегнуть к ручной сборке строки. Это позволит вам полностью контролировать каждый символ.

Рассмотрим пример создания простого JSON-объекта вручную:


ШаблонJSON = "{ ""code"": ""%1"" }";
Данные = "032\04";
ИтоговыйJSON = СтрШаблон(ШаблонJSON, Данные);
// Получим: { "code": "032\04" }

Посмотрим на этот метод критически: он лишает вас преимуществ автоматической обработки спецсимволов, кавычек и дат, которые предоставляет платформа. Это "крайний" метод для решения узкоспециализированных задач интеграции.

Резюме

Мы выяснили, что дублирование слеша в 1С — это не ошибка, а признак высокого качества реализации платформы, которая заботится о валидности данных. Прежде чем пытаться "исправить" это поведение, рекомендуем проверить принимающую сторону. Скорее всего, после стандартного парсинга JSON-строки в целевой системе, двойной слеш сам превратится в одиночный. Если же вы ограничены жесткими рамками стороннего API, используйте замену на прямой слеш / или аккуратную постобработку строки функцией СтрЗаменить.

← На главную