Почему не работает ЧтениеJSON и как реализовать поддержку JSON в старых версиях 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Выясним причину: ограничения версии платформы

Первым делом разберем ситуацию, когда при попытке инициализировать объект кодом ЧтениеJSON = Новый ЧтениеJSON система выдает ошибку "Тип не определен". Это явный признак того, что используемая версия платформы просто «не знает» о существовании такого объекта. Рассмотрим хронологию появления этих инструментов:

Встроенные средства для работы с JSON (объекты ЧтениеJSON, ЗаписьJSON и функции глобального контекста ПрочитатьJSON(), ЗаписатьJSON()) были реализованы в версии 8.3.6.1977. Если ваша информационная база запущена на платформе ниже этой версии (например, 8.2 или ранние сборки 8.3), нативный механизм работать не будет.

Важно помнить, что даже если конфигурация работает в режиме совместимости с версией 8.2, но сама платформа обновлена до 8.3.6+, объект ЧтениеJSON может быть доступен, однако рекомендуется всегда проверять программно возможность создания объекта или версию платформы.

Решение 1: Использование штатных средств (для версий 8.3.6 и выше)

Если версия вашей платформы позволяет, всегда лучше использовать встроенный механизм, так как он реализован на уровне ядра платформы и работает значительно быстрее любых внешних обработок. Разберем по шагам стандартный алгоритм чтения данных:

Для начала нам необходимо инициализировать объект чтения и открыть файл или строку. Посмотрим на пример кода:


Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("C:\data\exchange.json");

// Чтение данных в структуру или массив 1С
Данные = ПрочитатьJSON(Чтение);

Чтение.Закрыть();

Проанализируем этот фрагмент. Функция ПрочитатьJSON автоматически преобразует объекты JSON в Структура или Соответствие, а списки — в Массив. Это значительно упрощает жизнь программисту, избавляя от ручного парсинга строк.

Решение 2: Использование внешних библиотек и модулей

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

Такие модули представляют собой набор функций, которые посимвольно перебирают строку JSON и интерпретируют её согласно правилам формата. Разберем типичный алгоритм работы с такой библиотекой:

  1. Скачиваем модуль или конфигурацию с примером (например, с репозиториев типа GitHub).
  2. Переносим код модуля в свою конфигурацию (в общий модуль или в модуль обработки).
  3. Вызываем функцию парсинга, передавая ей строку JSON.

Пример вызова функции из стороннего модуля может выглядеть так:


// Предположим, мы поместили код в общий модуль "РаботаСJSON"
ПутьКФайлу = "C:\temp\data.json";
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8);
СтрокаJSON = Текст.ПолучитьТекст();

// Вызов самописного парсера
Данные = РаботаСJSON.Парсить(СтрокаJSON);

Важный нюанс: при использовании сторонних модулей нужно быть очень внимательными к производительности. На файлах объемом более 5-10 Мб парсинг средствами встроенного языка 1С может занимать минуты, в то время как нативный ПрочитатьJSON справится за доли секунды.

Решение 3: Использование COM-объекта ScriptControl (Windows)

Для старых платформ (8.1, 8.2), работающих под управлением ОС Windows, существует элегантный способ — использование движка JavaScript через COM-соединение. Поскольку JSON является «родным» форматом для JavaScript, мы можем делегировать ему разбор строки. Рассмотрим этот метод подробнее:


КодJS = "function parseJSON(str) { return eval('(' + str + ')'); }";
ScriptControl = Новый COMОбъект("MSScriptControl.ScriptControl");
ScriptControl.Language = "JScript";
ScriptControl.AddCode(КодJS);

СтрокаJSON = "{""Имя"": ""Иван"", ""Возраст"": 30}";
ОбъектJS = ScriptControl.CodeObject.parseJSON(СтрокаJSON);

// Теперь мы можем обращаться к свойствам, но будьте осторожны с типами
Имя = ОбъектJS.Имя;

Проанализируем ситуацию: этот метод очень быстрый, но имеет существенные недостатки. Во-первых, MSScriptControl — это 32-битный компонент. Если ваш сервер 1С 64-битный, вызвать его напрямую в серверном коде не получится. Во-вторых, работа с полученным объектом требует осторожности при приведении типов к типам 1С.

Решение 4: Использование объекта HTMLFile (универсальный COM-метод)

Чтобы обойти ограничение разрядности ScriptControl, часто используют объект htmlfile. Рассмотрим, как это реализовать:


HTMLДокумент = Новый COMОбъект("htmlfile");
HTMLДокумент.write("<meta http-equiv='x-ua-compatible' content='IE=9'>");
JS = HTMLДокумент.parentWindow;

СтрокаJSON = "{""status"": ""ok"", ""count"": 10}";
Данные = JS.JSON.parse(СтрокаJSON);

// Получение значения
Результат = Данные.status;

Этот метод задействует возможности Internet Explorer, установленного в системе. Он более стабилен и позволяет использовать полноценный метод JSON.parse, который безопаснее, чем eval.

Сравнение методов и рекомендации

Мы проанализировали несколько способов решения задачи. Подведем итоги и выберем оптимальный путь:

При работе с любым из методов на старых платформах, обратите особое внимание на кодировку UTF-8. Старые объекты типа ТекстовыйДокумент могут некорректно считывать файлы без метки BOM (Byte Order Mark), что часто приводит к ошибкам при разборе JSON. Всегда явно указывайте КодировкаТекста.UTF8 при чтении файла перед парсингом.

Изучив эти варианты, мы можем сделать вывод: отсутствие объекта ЧтениеJSON — это не приговор для интеграции, а лишь повод выбрать наиболее подходящий инструмент под текущие технические условия вашей системы.

← На главную