Как парсить JSON в 1С 7.7 и почему JScript-код не работает в Windows XP?

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

В современных реалиях разработчикам на платформе 1С 7.7 всё чаще приходится сталкиваться с необходимостью обработки данных в формате JSON. Поскольку в «семерке» нет встроенных механизмов для работы с этим форматом (в отличие от версии 8.3), программисты вынуждены использовать внешние компоненты или системные возможности Windows. Одним из самых популярных способов является использование MSScriptControl.ScriptControl для выполнения кода на языке JScript. Однако этот метод таит в себе множество нюансов, связанных с версиями операционных систем и безопасностью.

Разбор стандартного способа парсинга через JScript

Рассмотрим код, который часто встречается в старых обработках и вызывает вопросы у разработчиков. Суть метода заключается в создании динамической функции внутри движка JScript, которая интерпретирует строку JSON как объект JavaScript.


// Функция на стороне JScript
function parseJSON(strJSON) {
    var tmpFunc = (new Function('return(' + strJSON + ');'))();
    return(tmpFunc);
}

// Вызов из 1С 7.7
Ответ = scriptCtrl.Run("parseJSON", СтрокаJSON);

Проанализируем ситуацию: конструкция new Function('return(' + strJSON + ');')() фактически является аналогом функции eval(). Она берет текстовую строку и заставляет интерпретатор выполнить её как программный код. Если в строке находится валидный JSON, то результатом выполнения станет объект JScript (тип IDispatch в терминах COM).

Почему код работает в Windows 7/10, но не работает в Windows XP?

Выясним причину технического сбоя на старых системах. Основная проблема кроется в версии библиотеки Windows Script Host (WSH). В Windows XP по умолчанию установлена версия WSH 5.7, в то время как в более современных ОС — 5.8 и выше.

Основные отличия JScript 5.7 от 5.8:

  1. Строгость синтаксиса: Старый движок крайне чувствителен к специальным символам. Наличие лишней запятой в конце массива или объекта (trailing comma), символов перевода строки или неэкранированных кавычек приводит к фатальной ошибке выполнения скрипта.
  2. Отсутствие нативного объекта JSON: Объект JSON.parse() появился только в JScript 5.8 (который поставляется вместе с Internet Explorer 8). На Windows XP с установленным IE6 или IE7 этот объект просто отсутствует в системе.
  3. Механизм эмуляции: Даже если в системе установлена библиотека jscript.dll новой версии, MSScriptControl может по умолчанию использовать режим совместимости со старыми стандартами.

Проанализируем решение: чтобы этот код заработал на Windows XP, необходимо обновить Internet Explorer до 8-й версии. Это автоматически обновит системные библиотеки скриптового движка до версии 5.8, что сделает конструкцию new Function более стабильной.

Вопросы безопасности: «Дыра в системе»

Важно понимать, что использование eval() или new Function() для парсинга данных — это потенциальная угроза безопасности. Рассмотрим ситуацию, когда вместо ожидаемых данных JSON в программу попадает вредоносный код.

Если в переменной strJSON придет строка вида:


undefined && (function(){ 
    var fso = new ActiveXObject("Scripting.FileSystemObject"); 
    fso.DeleteFile("C:\\important_file.txt"); 
})()

Движок JScript выполнит этот код с правами пользователя, под которым запущена 1С. Поскольку 1С 7.7 часто запускается с правами администратора, это позволяет злоумышленнику выполнить любые действия в системе. Поэтому такой способ парсинга допустим только в доверенной среде, когда вы точно уверены в источнике данных.

Проблема извлечения данных в 1С 7.7

Даже если парсинг прошел успешно, разработчик сталкивается со спецификой платформы 7.7. При возврате объекта из JScript, 1С видит его как COMОбъект (тип IDispatch). В 1С 7.7 нельзя просто написать Ответ.Status, так как встроенный язык не умеет обращаться к свойствам таких объектов напрямую через точку.

Для решения этой проблемы разберем подход с использованием вспомогательных функций-«прослоек» внутри JScript:


// В скрипт добавляются методы доступа
function getProperty(obj, key) {
    return obj[key];
}

function getArrayItem(obj, index) {
    return obj[index];
}

function getArrayLength(obj) {
    return obj.length;
}

Теперь из 1С мы можем обращаться к данным так:

Статус = scriptCtrl.Run("getProperty", РезультатПарсинга, "Status");

Альтернатива 1: Использование объекта "htmlfile"

Существует более надежный способ, который позволяет задействовать современный парсер JSON.parse() даже там, где MSScriptControl ведет себя нестабильно. Для этого мы можем использовать COM-объект htmlfile.

Рассмотрим алгоритм действий:

  1. Создаем объект CreateObject("htmlfile").
  2. Записываем в него мета-тег эмуляции последней версии IE.
  3. Используем встроенное окно parentWindow для выполнения парсинга.

Этот метод считается более современным и безопасным, так как нативный JSON.parse() не исполняет произвольный код, а только разбирает структуру данных.

Альтернатива 2: Нативный парсер на языке 1С

Если зависимости от системных библиотек Windows неприемлемы (например, при работе в Linux через Wine или на сильно урезанных сборках ОС), стоит рассмотреть реализацию парсера на встроенном языке 1С 7.7.

Проанализируем простейший алгоритм разбора простого JSON:

Хотя такой парсер может занимать от 50 до нескольких сотен строк кода, он обеспечивает полную независимость от версии jscript.dll и гарантирует стабильную работу на любых версиях Windows, включая XP.

Подведем итог: для быстрого решения задачи на современных системах достаточно использовать MSScriptControl, но для обеспечения совместимости с Windows XP и повышения безопасности лучше использовать объект htmlfile или написать (найти готовый) парсер на чистом языке 1С 7.7.

← На главную