Как правильно передать внутренний идентификатор 1С 7.7 в формате JSON

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При интеграции устаревших систем на платформе 1С:Предприятие 7.7 с современными веб-сервисами или базами данных на платформе 8.3 программисты часто сталкиваются с проблемой передачи ссылочных данных. В 1С 7.7 уникальный идентификатор объекта обычно извлекается с помощью функции ЗначениеВСтрокуВнутр. Результат этой функции представляет собой сложную строку, содержащую фигурные скобки, запятые и двойные кавычки, например: {"B","0","0","84","0","0"," 52851 "}.

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

Метод 1: Экранирование двойных кавычек

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

Проанализируем ситуацию на примере. Допустим, у нас есть идентификатор номенклатуры. Нам нужно превратить его в валидную часть JSON-строки. Для этого воспользуемся функцией СтрЗаменить.

Рассмотрим пример кода на языке 1С 7.7:


// Получаем внутренний идентификатор объекта
ВнутрИд = ЗначениеВСтрокуВнутр(ВыбНоменклатура);

// Экранируем кавычки: заменяем " на \"
// В 1С 7.7 кавычка в строке пишется как ""
ПодготовленныйИд = СтрЗаменить(ВнутрИд, """", "\""");

// Формируем итоговую JSON строку
ТекстJSON = "{""type"": ""balance"", ""nomenclature"": """ + ПодготовленныйИд + """}";

После выполнения этого кода строка примет следующий вид, который будет корректно прочитан любым парсером:

{"type": "balance", "nomenclature": "{\"B\",\"0\",\"0\",\"84\",\"0\",\"0\",\" 52851 \"}"}

Метод 2: Использование кодирования Base64

Если структура внутреннего идентификатора слишком сложна или содержит символы, которые трудно обрабатывать вручную (например, переносы строк в других типах данных), мы можем прибегнуть к «классике» программирования — упаковке данных в Base64. Этот метод превращает любую строку в набор латинских букв и цифр, который гарантированно не содержит скобок или кавычек.

Выясним преимущества этого подхода:

  1. Полное отсутствие проблем со спецсимволами (кавычки, скобки, слеши).
  2. Исключение ошибок кодировки при передаче кириллицы (если идентификатор содержит текстовые части).
  3. Стандартная поддержка декодирования Base64 практически во всех современных языках программирования (JS, Python, PHP, 1С 8.3).

Для реализации в 1С 7.7 можно использовать объект v7plus.dll или сторонние функции преобразования. На стороне получателя останется только декодировать строку перед вызовом ЗначениеИзСтрокиВнутр.

Метод 3: Работа через Microsoft Script Control

Поскольку в 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.

Метод 4: Использование Hex-кодирования

Разберем еще один альтернативный подход — перевод строки в шестнадцатеричный (Hex) формат. Это проще в реализации, чем Base64, если у вас нет под рукой готовых библиотек. Каждая буква внутреннего идентификатора заменяется на её числовой код в 16-ричной системе.

Например, символ { превратится в 7B. Строка {"B"} превратится в 7B2242227D. Такая строка абсолютно безопасна для передачи в JSON и не требует никаких дополнительных манипуляций. На принимающей стороне выполняется обратная операция (каждые два символа переводятся обратно в один символ строки).

Важные нюансы при передаче данных

Проанализируем технические детали, которые могут повлиять на результат:

Подводя итог, можно сказать, что для быстрых решений «на коленке» идеально подходит простое экранирование кавычек через СтрЗаменить. Однако для построения надежных систем обмена данными лучше использовать Base64 или специализированные компоненты, которые гарантируют валидность итоговой JSON-структуры независимо от содержимого передаваемых полей.

← На главную