В современной разработке на платформе 1С:Предприятие обмен данными через формат JSON стал стандартом де-факто. Однако многие разработчики, сталкиваясь с поддержкой старых баз или интеграцией систем с разными версиями платформы, обнаруживают, что привычный объект ЧтениеJSON внезапно оказывается недоступен. Проанализируем, почему это происходит, начиная с какой версии функционал стал штатным, и какими способами можно заменить этот механизм, если обновление платформы невозможно.
Первым делом разберем ситуацию, когда при попытке инициализировать объект кодом ЧтениеJSON = Новый ЧтениеJSON система выдает ошибку "Тип не определен". Это явный признак того, что используемая версия платформы просто «не знает» о существовании такого объекта. Рассмотрим хронологию появления этих инструментов:
Встроенные средства для работы с JSON (объекты ЧтениеJSON, ЗаписьJSON и функции глобального контекста ПрочитатьJSON(), ЗаписатьJSON()) были реализованы в версии 8.3.6.1977. Если ваша информационная база запущена на платформе ниже этой версии (например, 8.2 или ранние сборки 8.3), нативный механизм работать не будет.
Важно помнить, что даже если конфигурация работает в режиме совместимости с версией 8.2, но сама платформа обновлена до 8.3.6+, объект ЧтениеJSON может быть доступен, однако рекомендуется всегда проверять программно возможность создания объекта или версию платформы.
Если версия вашей платформы позволяет, всегда лучше использовать встроенный механизм, так как он реализован на уровне ядра платформы и работает значительно быстрее любых внешних обработок. Разберем по шагам стандартный алгоритм чтения данных:
Для начала нам необходимо инициализировать объект чтения и открыть файл или строку. Посмотрим на пример кода:
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("C:\data\exchange.json");
// Чтение данных в структуру или массив 1С
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Проанализируем этот фрагмент. Функция ПрочитатьJSON автоматически преобразует объекты JSON в Структура или Соответствие, а списки — в Массив. Это значительно упрощает жизнь программисту, избавляя от ручного парсинга строк.
Если мы столкнулись с ситуацией, когда поднять версию платформы невозможно (например, из-за жестких требований заказчика или ограничений инфраструктуры), нам на помощь приходят сторонние разработки. Рассмотрим подробнее вариант с использованием модулей на встроенном языке 1С, таких как проект 1C-JSON.
Такие модули представляют собой набор функций, которые посимвольно перебирают строку JSON и интерпретируют её согласно правилам формата. Разберем типичный алгоритм работы с такой библиотекой:
Пример вызова функции из стороннего модуля может выглядеть так:
// Предположим, мы поместили код в общий модуль "РаботаСJSON"
ПутьКФайлу = "C:\temp\data.json";
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8);
СтрокаJSON = Текст.ПолучитьТекст();
// Вызов самописного парсера
Данные = РаботаСJSON.Парсить(СтрокаJSON);
Важный нюанс: при использовании сторонних модулей нужно быть очень внимательными к производительности. На файлах объемом более 5-10 Мб парсинг средствами встроенного языка 1С может занимать минуты, в то время как нативный ПрочитатьJSON справится за доли секунды.
Для старых платформ (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С.
Чтобы обойти ограничение разрядности 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 — это не приговор для интеграции, а лишь повод выбрать наиболее подходящий инструмент под текущие технические условия вашей системы.