Как отформатировать и обработать JSON-данные в 1С 7.7?

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

В процессе обмена данными между 1С 7.7 и внешними веб-сервисами мы часто сталкиваемся с форматом JSON. Поскольку штатных средств для работы с этим форматом в старой версии платформы 1С 7.7 не предусмотрено, нам необходимо использовать внешние компоненты. Самым доступным и проверенным решением является использование MSScriptControl.ScriptControl, который позволяет задействовать возможности JScript прямо внутри кода 1С.

Подготовка среды для работы с JSON

Для начала работы нам нужно инициализировать объект MSScriptControl.ScriptControl. Этот объект позволит нам выполнять скрипты на языке JavaScript, что значительно упрощает парсинг JSON-структур. Разберем по шагам, как подготовить такую функцию.

Создадим процедуру, которая инициализирует объект и добавляет в него необходимые методы для разбора объектов и массивов:


Процедура СкриптКонтролИнит(scriptCtrl)
    scriptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
    scriptCtrl.Language="jscript";
    код = "
    | function parseJSON(strJSON) {
    |  var tmpFunc = (new Function('return('+strJSON+');'))();
    |  return(tmpFunc);
    | }
    | function aGet(Array, index) {
    |  return(Array[index]);
    | }
    | function oKey(Obj, index) {
    |  var size = 0, key;
    |  for (key in Obj) {
    |   if (size == index) break;
    |   if (Obj.hasOwnProperty(key)) size++;
    |  }
    |  return(key);
    | }
    | function oValueByKey(Obj, key) {
    |  return(Obj[key]);
    | }
    | Object.size = function(obj) {
    |  var size = 0, key;
    |  for (key in obj) {
    |   if (obj.hasOwnProperty(key)) size++;
    |  }
    |  return(size);
    | }
    | function oSize(Obj) {
    |  return(Object.size(Obj));
    | }
    | function eType(Element) {
    |  if (Element instanceof Array) {
    |    return(""array"");
    |  } else if (Object.prototype.toString.call(Element) === '[object Array]') {
    |    return(""array"");
    |  } else {
    |   return(typeof(Element));
    |  }
    | }
    |";
    scriptCtrl.AddCode(код);
КонецПроцедуры

Парсинг и преобразование данных в структуру 1С

После инициализации скриптового движка мы можем конвертировать JSON-строку в удобный для 1С 7.7 вид, например, в СписокЗначений. Это позволит нам обращаться к данным по ключам или индексам. Рассмотрим функцию, которая рекурсивно обходит структуру JSON:


Функция jsonВСписок(obj)
    // Предварительная инициализация scriptCtrl...
    сп = СоздатьОбъект("СписокЗначений");            
    ТипОбъекта = scriptCtrl.run("eType", obj);
    Если ТипОбъекта = "object" Тогда
        Для н=0 По scriptCtrl.run("oSize", obj)-1 Цикл                
            Ключ = scriptCtrl.run("oKey", obj, н);            
            Значение = scriptCtrl.run("oValueByKey", obj, Ключ);
            // Рекурсивный вызов для вложенных структур
            сп.ДобавитьЗначение(jsonВСписок(Значение), Ключ);
        КонецЦикла;                                     
    ИначеЕсли ТипОбъекта = "array" Тогда
        Для н=0 По obj.length-1 Цикл
            Значение = scriptCtrl.run("aGet", obj, н);  
            сп.ДобавитьЗначение(jsonВСписок(Значение), СокрЛП(Строка(н)));
        КонецЦикла;
    КонецЕсли;    
    Возврат сп;
КонецФункции

Решение задачи форматирования (Pretty Print)

Если ваша задача — не просто прочитать данные, а сделать JSON «удобоваримым» для анализа структуры, мы можем дополнить наш скрипт. Вы можете добавить метод formatJSON в строку кода, передаваемую в AddCode:

  1. Добавьте в JScript-код функцию JSON.stringify(obj, null, 4).
  2. Параметр 4 указывает на отступ в четыре пробела, что делает структуру визуально понятной.
  3. При вызове scriptCtrl.run("formatJSON", сыраяСтрока) вы получите отформатированную строку обратно в 1С.

Важное примечание: Если вы столкнулись с ошибкой \"Объект не определен\", убедитесь, что в системе установлен актуальный движок JScript (обычно это обеспечивается установкой Internet Explorer 8 или выше, так как он обновляет системные библиотеки сценариев).

Альтернативные подходы для разработчиков

Если формат JSON крайне сложен или объем данных слишком велик для MSScriptControl, мы рекомендуем следующие подходы:

Работая с JSON в 1С 7.7, мы получаем мощный инструмент, превращая платформу в полноценный участник обмена данными, несмотря на её почтенный возраст.

← На главную