При интеграции устаревших систем на платформе 1С:Предприятие 7.7 с современными веб-сервисами или базами данных на платформе 8.3 программисты часто сталкиваются с проблемой передачи ссылочных данных. В 1С 7.7 уникальный идентификатор объекта обычно извлекается с помощью функции ЗначениеВСтрокуВнутр. Результат этой функции представляет собой сложную строку, содержащую фигурные скобки, запятые и двойные кавычки, например: {"B","0","0","84","0","0"," 52851 "}.
Проблема заключается в том, что формат JSON сам использует фигурные скобки для определения объектов и кавычки для строк. Если просто вставить внутренний идентификатор 1С в JSON-структуру, любой стандартный парсер сочтет такой файл некорректным или попытается интерпретировать внутренние скобки как начало нового объекта. В данной статье мы разберем несколько способов решения этой задачи, от простого экранирования до использования внешних библиотек.
Разберем самый доступный способ, не требующий внешних компонент. Чтобы JSON-парсер воспринял внутренний идентификатор как обычную строку, нам необходимо «спрятать» кавычки, которые находятся внутри этой строки. Согласно стандарту JSON, символ двойной кавычки внутри значения должен предваряться обратной косой чертой \.
Проанализируем ситуацию на примере. Допустим, у нас есть идентификатор номенклатуры. Нам нужно превратить его в валидную часть JSON-строки. Для этого воспользуемся функцией СтрЗаменить.
Рассмотрим пример кода на языке 1С 7.7:
// Получаем внутренний идентификатор объекта
ВнутрИд = ЗначениеВСтрокуВнутр(ВыбНоменклатура);
// Экранируем кавычки: заменяем " на \"
// В 1С 7.7 кавычка в строке пишется как ""
ПодготовленныйИд = СтрЗаменить(ВнутрИд, """", "\""");
// Формируем итоговую JSON строку
ТекстJSON = "{""type"": ""balance"", ""nomenclature"": """ + ПодготовленныйИд + """}";
После выполнения этого кода строка примет следующий вид, который будет корректно прочитан любым парсером:
{"type": "balance", "nomenclature": "{\"B\",\"0\",\"0\",\"84\",\"0\",\"0\",\" 52851 \"}"}
Если структура внутреннего идентификатора слишком сложна или содержит символы, которые трудно обрабатывать вручную (например, переносы строк в других типах данных), мы можем прибегнуть к «классике» программирования — упаковке данных в Base64. Этот метод превращает любую строку в набор латинских букв и цифр, который гарантированно не содержит скобок или кавычек.
Выясним преимущества этого подхода:
Для реализации в 1С 7.7 можно использовать объект v7plus.dll или сторонние функции преобразования. На стороне получателя останется только декодировать строку перед вызовом ЗначениеИзСтрокиВнутр.
Поскольку в 1С 7.7 нет встроенных средств работы с JSON, ручная сборка строк часто приводит к ошибкам вроде «лишней запятой» или неправильного экранирования. Проанализируем более надежный способ — использование системного движка JScript через MSScriptControl.ScriptControl.
Этот метод позволяет делегировать формирование JSON полноценному интерпретатору JavaScript, который сделает все преобразования автоматически. Посмотрим на пример реализации:
// Создаем объект скрипта
sc = СоздатьОбъект("MSScriptControl.ScriptControl");
sc.Language = "JScript";
// Создаем пустой объект в JS
sc.AddCode("var data = {};");
// Заполняем свойства
ВнутрИд = ЗначениеВСтрокуВнутр(ВыбНоменклатура);
sc.Run("eval", "data.type = 'balance'");
sc.Run("eval", "data.nomenclature = '" + ВнутрИд + "'");
// Получаем JSON строку через стандартный метод stringify
// (Требует наличия библиотеки json2.js или современной ОС)
JSONРезультат = sc.Eval("JSON.stringify(data)");
Важно помнить, что в старых версиях Windows объект JSON в JScript может отсутствовать. В этом случае программисты обычно подгружают код библиотеки json2.js прямо в объект ScriptControl через метод AddCode.
Разберем еще один альтернативный подход — перевод строки в шестнадцатеричный (Hex) формат. Это проще в реализации, чем Base64, если у вас нет под рукой готовых библиотек. Каждая буква внутреннего идентификатора заменяется на её числовой код в 16-ричной системе.
Например, символ { превратится в 7B. Строка {"B"} превратится в 7B2242227D. Такая строка абсолютно безопасна для передачи в JSON и не требует никаких дополнительных манипуляций. На принимающей стороне выполняется обратная операция (каждые два символа переводятся обратно в один символ строки).
Проанализируем технические детали, которые могут повлиять на результат:
" 52851 ". Внутренний формат 1С 7.7 жестко фиксирован по длине. Если вы случайно удалите лишние пробелы при обработке строки, функция ЗначениеИзСтрокиВнутр на другой стороне не сможет восстановить объект.\, он должен быть заменен на \\ в итоговом JSON.Подводя итог, можно сказать, что для быстрых решений «на коленке» идеально подходит простое экранирование кавычек через СтрЗаменить. Однако для построения надежных систем обмена данными лучше использовать Base64 или специализированные компоненты, которые гарантируют валидность итоговой JSON-структуры независимо от содержимого передаваемых полей.