Как в 1С программно преобразовать JSON-строку и извлечь нужное значение?

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

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

Способ 1: Использование встроенных функций ПрочитатьJSON и ЧтениеJSON

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

Для корректного чтения данных нам необходимо выполнить следующую последовательность действий:

  1. Создать объект ЧтениеJSON.
  2. Инициализировать его нашей строкой.
  3. Вызвать функцию ПрочитатьJSON, передав в нее подготовленный объект.

Важный нюанс: Если в JSON-структуре встречаются ключи, которые начинаются с цифр (например, идентификаторы номенклатуры "15546315"), 1С не сможет поместить их в Структуру, так как имена свойств структуры должны соответствовать правилам именования переменных. В этом случае вторым параметром функции ПрочитатьJSON нужно передать Истина, чтобы данные были прочитаны в объект Соответствие.

Проанализируем программный код решения:


// Предположим, что СтрокаНиже содержит наш JSON
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаНиже);

// Истина во втором параметре преобразует объекты JSON в Соответствия
Данные = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();

// Теперь мы можем обратиться к данным. 
// Помните: в Соответствии доступ к элементам идет через метод Получить()
Номенклатуры = Данные.Получить("nomenclatures");
ДанныеТовара = Номенклатуры.Получить("15546315");
КоличествоЗаказов = ДанныеТовара.Получить("ordersCount");

Сообщить("Количество заказов: " + КоличествоЗаказов);

Очистка данных перед парсингом

Иногда внешние системы возвращают строку, которая не является «чистым» JSON. Например, в начале строки может стоять префикс data: или другие служебные символы. Посмотрим на ситуацию: если передать такую строку в ЧтениеJSON без обработки, возникнет ошибка парсинга.

Выясним причину: парсер ожидает, что строка начнется с фигурной { или квадратной [ скобки. Если ваша строка начинается с data: { ... }, необходимо предварительно обрезать лишнее. Рассмотрим, как это сделать:


ПозНачала = Найти(ИсходнаяСтрока, "{");
Если ПозНачала > 0 Тогда
    ЧистаяСтрока = Сред(ИсходнаяСтрока, ПозНачала);
Иначе
    // Обработка ошибки: это не JSON
КонецЕсли;

Способ 2: Ручной разбор строки (строковые функции)

Если задача стоит максимально просто — получить всего одно числовое значение из огромного текста, а полноценный разбор всей структуры не требуется, можно воспользоваться строковыми функциями Найти, Сред и Лев. Этот способ работает быстрее на очень больших объемах данных, так как не десериализует весь объект в память.

Разберем пример реализации быстрого поиска поля ordersCount:


ПоискТега = "ordersCount"":";
Поз = Найти(СтрокаJSON, ПоискТега);

Если Поз > 0 Тогда
    // Обрезаем строку, начиная сразу после тега
    ВременнаяСтрока = Сред(СтрокаJSON, Поз + СтрДлина(ПоискТега));
    
    // Ищем запятую, которая закрывает значение поля
    ПозЗапятой = Найти(ВременнаяСтрока, ",");
    
    Если ПозЗапятой > 0 Тогда
        РезультатСтрокой = СокрЛП(Лев(ВременнаяСтрока, ПозЗапятой - 1));
        // Преобразуем в число, удаляя лишние пробелы или кавычки
        ЗначениеOrdersCount = Число(РезультатСтрокой);
    КонецЕсли;
КонецЕсли;

Внимание: Этот метод менее надежен. Если формат JSON изменится (например, добавятся пробелы вокруг двоеточия или поле переместится внутрь другого объекта с таким же именем), код может сработать некорректно. Используйте его только в исключительных случаях.

Способ 3: Регулярные выражения (RegExp)

Более гибким вариантом «быстрого» поиска является использование регулярных выражений. Это позволяет извлечь данные, даже если формат пробелов или кавычек немного варьируется. В среде Windows мы можем использовать объект VBScript.RegExp.

Проанализируем этот подход:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Ложь;
RegExp.Pattern = """ordersCount"":\s*(\d+)";

Matches = RegExp.Execute(СтрокаJSON);
Если Matches.Count > 0 Тогда
    Результат = Matches.Item(0).SubMatches.Item(0);
    Сообщить("Найдено значение: " + Результат);
КонецЕсли;

Рекомендации по работе с большими объемами данных

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

  1. Работа с файлами: Если JSON-строка весит несколько десятков мегабайт, метод УстановитьСтроку() может привести к чрезмерному потреблению оперативной памяти. В таких случаях лучше сохранить текст во временный файл и использовать ЧтениеJSON.ОткрытьФайл(). Платформа будет читать данные порционно.
  2. Типизация: Помните, что ПрочитатьJSON автоматически конвертирует типы. Значение null превратится в Неопределено, а true/false в Булево. Это значительно упрощает последующую логику в коде 1С по сравнению с ручным разбором текста.
  3. Использование Соответствий: Как мы выяснили выше, при наличии ключей-чисел всегда используйте Соответствие. Помните, что обращение к ним через точку (Данные.Ключ) невозможно — только через метод Получить("Ключ").

Подводя итог, можно сказать, что для большинства задач оптимальным является Способ 1 с использованием ЧтениеJSON и Соответствия. Это гарантирует корректную обработку всех типов данных и защищает от ошибок формата JSON.

← На главную