В процессе обмена данными между 1С 7.7 и внешними веб-сервисами мы часто сталкиваемся с форматом JSON. Поскольку штатных средств для работы с этим форматом в старой версии платформы 1С 7.7 не предусмотрено, нам необходимо использовать внешние компоненты. Самым доступным и проверенным решением является использование MSScriptControl.ScriptControl, который позволяет задействовать возможности JScript прямо внутри кода 1С.
Для начала работы нам нужно инициализировать объект 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(код);
КонецПроцедуры
После инициализации скриптового движка мы можем конвертировать 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ВСписок(Значение), СокрЛП(Строка(н)));
КонецЦикла;
КонецЕсли;
Возврат сп;
КонецФункции
Если ваша задача — не просто прочитать данные, а сделать JSON «удобоваримым» для анализа структуры, мы можем дополнить наш скрипт. Вы можете добавить метод formatJSON в строку кода, передаваемую в AddCode:
JSON.stringify(obj, null, 4).4 указывает на отступ в четыре пробела, что делает структуру визуально понятной.scriptCtrl.run("formatJSON", сыраяСтрока) вы получите отформатированную строку обратно в 1С.Важное примечание: Если вы столкнулись с ошибкой \"Объект не определен\", убедитесь, что в системе установлен актуальный движок JScript (обычно это обеспечивается установкой Internet Explorer 8 или выше, так как он обновляет системные библиотеки сценариев).
Если формат JSON крайне сложен или объем данных слишком велик для MSScriptControl, мы рекомендуем следующие подходы:
КомандаСистемы() внешние скрипты (например, на PowerShell), которые принимают JSON, форматируют его и сохраняют в файл.Работая с JSON в 1С 7.7, мы получаем мощный инструмент, превращая платформу в полноценный участник обмена данными, несмотря на её почтенный возраст.