При интеграции систем часто возникает задача выгрузки данных из 1С в формат JSON. Одной из специфических проблем является корректное экранирование спецсимволов, в частности, прямого (/) и обратного (\) слешей. Если в наименовании номенклатуры или других строковых данных встречаются эти символы, простая замена может привести к неожиданным результатам, например, к «двойному экранированию», когда уже замененный символ подвергается повторной обработке. Разберем детально, как решить эту задачу правильно, используя как алгоритмические подходы, так и встроенные средства платформы 1С.
Рассмотрим ситуацию, когда нам нужно заменить и /, и \ на некую последовательность, например, /\. Если мы будем использовать функцию СтрЗаменить последовательно, возникнет логическая ошибка. Проанализируем пример:
/ на /\. Строка "A/B" превращается в "A/\B".\ на /\. Но в нашей строке уже есть \, который появился на предыдущем шаге! В итоге мы получим "A//\B", что является невалидным результатом.Чтобы избежать этой ситуации, необходимо использовать более сложные алгоритмы или специализированные инструменты.
Если по каким-то причинам вы не можете использовать встроенные объекты платформы и вынуждены формировать строку вручную, воспользуемся методом промежуточного кодирования. Суть метода заключается в использовании символов-маркеров, которые гарантированно отсутствуют в исходной строке.
Разберем алгоритм по шагам:
@ и % (или непечатаемые символы, такие как табуляция Символы.ВТаб)./) на первый маркер.\) на второй маркер.Посмотрим на пример кода, реализующий этот подход:
// Исходная строка с разными видами слешей
ИсходнаяСтрока = "Товар / Категория \ Подкатегория";
// Шаг 1 и 2: Замена на временные маркеры
Результат = СтрЗаменить(ИсходнаяСтрока, "/", "@");
Результат = СтрЗаменить(Результат, "\", "%");
// Шаг 3: Замена маркеров на целевую последовательность
Результат = СтрЗаменить(Результат, "@", "/\");
Результат = СтрЗаменить(Результат, "%", "/\");
// Теперь Результат содержит корректно обработанные данные
Проанализируем более современный и надежный способ. Начиная с версии платформы 8.3.6, в 1С реализован мощный механизм работы с JSON через объект ЗаписьJSON. Это рекомендуемый метод, так как он автоматически учитывает требования стандарта RFC 7159.
Преимущества этого метода:
\\. Платформа сделает это за вас.Рассмотрим пример использования ЗаписьJSON с настройкой параметров:
Запись = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина);
// Истина в третьем параметре позволяет управлять экранированием спецсимволов
Запись.УстановитьСтроку(ПараметрыЗаписи);
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Наименование", "Номенклатура / со слешем \");
ЗаписатьJSON(Запись, СтруктураДанных);
РезультатСтрокой = Запись.Закрыть();
// Платформа автоматически превратит это в валидный JSON с экранированием
Выясним, как выполнить замену за один проход, не прибегая к промежуточным символам. Для этого идеально подходят регулярные выражения. Используя паттерн [\\\/], мы можем найти все вхождения обоих видов слешей одновременно.
Проанализируем ситуацию на примере COM-объекта:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
RegExp.MultiLine = Истина;
// Паттерн ищет либо \, либо /
RegExp.Pattern = "[\\\/]";
ИсходнаяСтрока = "Путь/к\файлу";
// Выполняем замену всех найденных символов на /\ за один проход
Результат = RegExp.Replace(ИсходнаяСтрока, "/\");
Этот метод исключает риск повторной замены, так как поиск и замена происходят в рамках одного цикла обработки строки движком регулярных выражений.
Важно помнить, что стандарт JSON (RFC 7159) требует экранирования обратного слеша именно как \\. Если ваша принимающая система требует /\, это является отклонением от стандарта. В большинстве случаев использования штатного метода ЗаписатьJSON() достаточно для того, чтобы файл успешно прочитался любой внешней системой (Java, Python, JavaScript и др.).
Мы рассмотрели три принципиально разных подхода к экранированию. Выбор конкретного метода зависит от ваших задач:
ЗаписьJSON. Это гарантирует валидность структуры файла и избавляет от необходимости вручную следить за каждым спецсимволом.Использование правильных инструментов не только упрощает код, но и предотвращает трудноуловимые ошибки при обмене данными между информационными системами.