При интеграции 1С с внешними системами (например, маркетплейсами вроде Wildberries или сервисами доставки) разработчики часто сталкиваются с необходимостью обработки данных в формате JSON. Одной из типичных задач является извлечение конкретного значения, такого как ordersCount, из сложной текстовой строки. В этой статье мы подробно разберем, как правильно парсить такие данные, избегая распространенных ошибок, связанных с типами данных и ограничениями платформы 1С.
Наиболее правильным и надежным методом работы с JSON в 1С является использование специализированных объектов платформы. Рассмотрим типовую ошибку начинающих разработчиков: попытку передать текстовую строку напрямую в функцию ПрочитатьJSON. Это приводит к ошибке «Несоответствие типов», так как функция ожидает объект-посредник.
Для корректного чтения данных нам необходимо выполнить следующую последовательность действий:
ЧтениеJSON.ПрочитатьJSON, передав в нее подготовленный объект.Важный нюанс: Если в JSON-структуре встречаются ключи, которые начинаются с цифр (например, идентификаторы номенклатуры "15546315"), 1С не сможет поместить их в Структуру, так как имена свойств структуры должны соответствовать правилам именования переменных. В этом случае вторым параметром функции ПрочитатьJSON нужно передать Истина, чтобы данные были прочитаны в объект Соответствие.
Проанализируем программный код решения:
// Предположим, что СтрокаНиже содержит наш JSON
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаНиже);
// Истина во втором параметре преобразует объекты JSON в Соответствия
Данные = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();
// Теперь мы можем обратиться к данным.
// Помните: в Соответствии доступ к элементам идет через метод Получить()
Номенклатуры = Данные.Получить("nomenclatures");
ДанныеТовара = Номенклатуры.Получить("15546315");
КоличествоЗаказов = ДанныеТовара.Получить("ordersCount");
Сообщить("Количество заказов: " + КоличествоЗаказов);
Иногда внешние системы возвращают строку, которая не является «чистым» JSON. Например, в начале строки может стоять префикс data: или другие служебные символы. Посмотрим на ситуацию: если передать такую строку в ЧтениеJSON без обработки, возникнет ошибка парсинга.
Выясним причину: парсер ожидает, что строка начнется с фигурной { или квадратной [ скобки. Если ваша строка начинается с data: { ... }, необходимо предварительно обрезать лишнее. Рассмотрим, как это сделать:
ПозНачала = Найти(ИсходнаяСтрока, "{");
Если ПозНачала > 0 Тогда
ЧистаяСтрока = Сред(ИсходнаяСтрока, ПозНачала);
Иначе
// Обработка ошибки: это не JSON
КонецЕсли;
Если задача стоит максимально просто — получить всего одно числовое значение из огромного текста, а полноценный разбор всей структуры не требуется, можно воспользоваться строковыми функциями Найти, Сред и Лев. Этот способ работает быстрее на очень больших объемах данных, так как не десериализует весь объект в память.
Разберем пример реализации быстрого поиска поля ordersCount:
ПоискТега = "ordersCount"":";
Поз = Найти(СтрокаJSON, ПоискТега);
Если Поз > 0 Тогда
// Обрезаем строку, начиная сразу после тега
ВременнаяСтрока = Сред(СтрокаJSON, Поз + СтрДлина(ПоискТега));
// Ищем запятую, которая закрывает значение поля
ПозЗапятой = Найти(ВременнаяСтрока, ",");
Если ПозЗапятой > 0 Тогда
РезультатСтрокой = СокрЛП(Лев(ВременнаяСтрока, ПозЗапятой - 1));
// Преобразуем в число, удаляя лишние пробелы или кавычки
ЗначениеOrdersCount = Число(РезультатСтрокой);
КонецЕсли;
КонецЕсли;
Внимание: Этот метод менее надежен. Если формат JSON изменится (например, добавятся пробелы вокруг двоеточия или поле переместится внутрь другого объекта с таким же именем), код может сработать некорректно. Используйте его только в исключительных случаях.
Более гибким вариантом «быстрого» поиска является использование регулярных выражений. Это позволяет извлечь данные, даже если формат пробелов или кавычек немного варьируется. В среде 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С важно учитывать производительность и потребление памяти:
УстановитьСтроку() может привести к чрезмерному потреблению оперативной памяти. В таких случаях лучше сохранить текст во временный файл и использовать ЧтениеJSON.ОткрытьФайл(). Платформа будет читать данные порционно.ПрочитатьJSON автоматически конвертирует типы. Значение null превратится в Неопределено, а true/false в Булево. Это значительно упрощает последующую логику в коде 1С по сравнению с ручным разбором текста.Соответствие. Помните, что обращение к ним через точку (Данные.Ключ) невозможно — только через метод Получить("Ключ").Подводя итог, можно сказать, что для большинства задач оптимальным является Способ 1 с использованием ЧтениеJSON и Соответствия. Это гарантирует корректную обработку всех типов данных и защищает от ошибок формата JSON.