При работе с обменом данными в формате JSON программисты 1С часто сталкиваются с особенностью: при записи строки, содержащей обратный слеш \ (например, путь к файлу или специфический идентификатор), в итоговом файле символ превращается в двойной \\. На первый взгляд это кажется ошибкой кодирования, но на самом деле мы имеем дело с базовыми принципами работы формата JSON. В этой статье мы подробно разберем, почему это происходит, и как добиться нужного результата, если принимающая сторона требует специфического формата.
Для начала проанализируем ситуацию с точки зрения мировых стандартов. Формат 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);
В 1С перечисление ЭкранированиеСимволовJSON.Нет управляет только необязательным экранированием. К нему относятся:
\uXXXX)./ (который в JSON можно писать и так, и как \/).Однако обратный слеш \ относится к обязательному экранированию. Платформа 1С строго следует стандарту и не позволяет создать невалидный JSON-файл, который нарушит работу других систем. Поэтому, какие бы параметры записи вы ни устанавливали, 1С всегда будет дублировать обратный слеш.
Если ваша задача связана с передачей путей к файлам в операционной системе Windows, самым элегантным решением будет замена обратного слеша на прямой /. Современные операционные системы и практически все языки программирования прекрасно понимают прямой слеш в путях.
Проанализируем пример трансформации данных перед записью:
ИсходныйПуть = "C:\Pictures\Photo.jpg";
БезопасныйПуть = СтрЗаменить(ИсходныйПуть, "\", "/");
// Результат: "C:/Pictures/Photo.jpg"
При записи такой строки в JSON никакого дополнительного экранирования не произойдет, и строка останется читаемой и валидной.
Бывают ситуации, когда внешняя система спроектирована с нарушениями стандартов и ожидает именно один слеш внутри кавычек. В этом случае нам придется вмешаться в работу механизмов 1С и обработать уже готовый текст JSON.
Перед тем как вмешаться в строку, убедитесь, что проверка на заполненность обязательных полей уже пройдена. Разберем по шагам, как это реализовать:
ЗаписьJSON.УстановитьСтроку().СтрЗаменить для удаления дублей.Пример кода:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ВашОбъект);
РезультатJSON = ЗаписьJSON.Закрыть();
// Принудительно убираем двойные слеши
ФинальныйТекст = СтрЗаменить(РезультатJSON, "\\", "\");
Внимание: Этот метод потенциально опасен. Если в ваших данных встречаются настоящие управляющие символы (например, перевод строки, который 1С записала как \n), после такой замены они превратятся в n, и структура данных будет безнадежно испорчена. Используйте этот метод только в том случае, если вы на 100% уверены в составе передаваемых данных.
Для очень простых структур, где использование ЗаписатьJSON кажется избыточным, а требования к формату специфичны, можно прибегнуть к ручной сборке строки. Это позволит вам полностью контролировать каждый символ.
Рассмотрим пример создания простого JSON-объекта вручную:
ШаблонJSON = "{ ""code"": ""%1"" }";
Данные = "032\04";
ИтоговыйJSON = СтрШаблон(ШаблонJSON, Данные);
// Получим: { "code": "032\04" }
Посмотрим на этот метод критически: он лишает вас преимуществ автоматической обработки спецсимволов, кавычек и дат, которые предоставляет платформа. Это "крайний" метод для решения узкоспециализированных задач интеграции.
Мы выяснили, что дублирование слеша в 1С — это не ошибка, а признак высокого качества реализации платформы, которая заботится о валидности данных. Прежде чем пытаться "исправить" это поведение, рекомендуем проверить принимающую сторону. Скорее всего, после стандартного парсинга JSON-строки в целевой системе, двойной слеш сам превратится в одиночный. Если же вы ограничены жесткими рамками стороннего API, используйте замену на прямой слеш / или аккуратную постобработку строки функцией СтрЗаменить.