Как правильно экранировать прямые и обратные слеши при выгрузке данных в JSON?

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

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

Проблема «двойного прохода» при ручной замене

Рассмотрим ситуацию, когда нам нужно заменить и /, и \ на некую последовательность, например, /\. Если мы будем использовать функцию СтрЗаменить последовательно, возникнет логическая ошибка. Проанализируем пример:

  1. Мы заменяем / на /\. Строка "A/B" превращается в "A/\B".
  2. Затем мы заменяем \ на /\. Но в нашей строке уже есть \, который появился на предыдущем шаге! В итоге мы получим "A//\B", что является невалидным результатом.

Чтобы избежать этой ситуации, необходимо использовать более сложные алгоритмы или специализированные инструменты.

Решение 1: Многоэтапная замена через промежуточные символы

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

Разберем алгоритм по шагам:

  1. Выбираем уникальные символы, например @ и % (или непечатаемые символы, такие как табуляция Символы.ВТаб).
  2. Заменяем все прямые слеши (/) на первый маркер.
  3. Заменяем все обратные слеши (\) на второй маркер.
  4. На финальном этапе заменяем оба маркера на нужную нам последовательность экранирования.

Посмотрим на пример кода, реализующий этот подход:


// Исходная строка с разными видами слешей
ИсходнаяСтрока = "Товар / Категория \ Подкатегория";

// Шаг 1 и 2: Замена на временные маркеры
Результат = СтрЗаменить(ИсходнаяСтрока, "/", "@");
Результат = СтрЗаменить(Результат, "\", "%");

// Шаг 3: Замена маркеров на целевую последовательность
Результат = СтрЗаменить(Результат, "@", "/\");
Результат = СтрЗаменить(Результат, "%", "/\");

// Теперь Результат содержит корректно обработанные данные

Решение 2: Использование встроенного объекта ЗаписьJSON

Проанализируем более современный и надежный способ. Начиная с версии платформы 8.3.6, в 1С реализован мощный механизм работы с JSON через объект ЗаписьJSON. Это рекомендуемый метод, так как он автоматически учитывает требования стандарта RFC 7159.

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

Рассмотрим пример использования ЗаписьJSON с настройкой параметров:


Запись = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина); 
// Истина в третьем параметре позволяет управлять экранированием спецсимволов

Запись.УстановитьСтроку(ПараметрыЗаписи);

СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Наименование", "Номенклатура / со слешем \");

ЗаписатьJSON(Запись, СтруктураДанных);

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

Решение 3: Регулярные выражения (VBScript.RegExp)

Выясним, как выполнить замену за один проход, не прибегая к промежуточным символам. Для этого идеально подходят регулярные выражения. Используя паттерн [\\\/], мы можем найти все вхождения обоих видов слешей одновременно.

Проанализируем ситуацию на примере COM-объекта:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
RegExp.MultiLine = Истина;

// Паттерн ищет либо \, либо /
RegExp.Pattern = "[\\\/]";

ИсходнаяСтрока = "Путь/к\файлу";
// Выполняем замену всех найденных символов на /\ за один проход
Результат = RegExp.Replace(ИсходнаяСтрока, "/\");

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

Важное замечание о стандартах

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

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

Мы рассмотрели три принципиально разных подхода к экранированию. Выбор конкретного метода зависит от ваших задач:

  1. Для простых задач и старых версий 1С: Используйте метод многоэтапной замены через промежуточные символы (маркеры).
  2. Для профессиональной разработки: Всегда отдавайте предпочтение объекту ЗаписьJSON. Это гарантирует валидность структуры файла и избавляет от необходимости вручную следить за каждым спецсимволом.
  3. Для сложных нестандартных замен: Используйте регулярные выражения через COM или внешние компоненты, чтобы обеспечить замену за один проход.

Использование правильных инструментов не только упрощает код, но и предотвращает трудноуловимые ошибки при обмене данными между информационными системами.

← На главную