Импорт из JSON в 1С

JSON (JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми.

Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается языконезависимым и может использоваться практически с любым языком программирования.

JSON-текст представляет собой (в закодированном виде) одну из двух структур:

  • Набор пар ключ: значение (заключается в фигурные скобки { }). В 1C это реализовано как структура. Ключом может быть только строка, значением — любая форма.
  • Упорядоченный набор значений (заключается в квадратные скобки [ ]). В 1C это может быть реализовано как массив.

{
"firstName": "Иван",
"lastName": "Иванов",
"address": {
"streetAddress": "Московское ш., 101, кв.101","city": "Ленинград","postalCode": 101101
},
"phoneNumbers": [
"812 123-1234",
"916 123-4567"
]
}

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

Итак, нам понадобятся следующие функции и процедуры:

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

Функция ОбработкаJSON (ТекстJSON)

Результат = Новый Структура;
ТекстJSON = СтрЗаменить(ТекстJSON, """", """"); // заменим последовательность " на "
ТекстJSON = СтрЗаменить(ТекстJSON, """", ""); // а теперь удалим все кавычки

Если Лев(ТекстJSON, 1) = "{" Тогда  // начало структуры

ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, "Структура");

ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда //начало массива

МассивДанных = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON(МассивДанных, ТекстJSON, "Массив");
Результат.Вставить("Значение", МассивДанных);

КонецЕсли;

Возврат Результат;

КонецФункции

Вторая процедура выполняет обработку данных и записывает их в массив или структуру. При этом возможна ситуация, когда структура данных в формате JSON сложная и при обработке мы получим структуру, значениями которой будут массивы, которые будут состоять из структур и т.д.

Процедура ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, ТипДанных)

ТекстJSON = СокрЛП(Сред(ТекстJSON, 2)); // удалим открывающий символ структуры(массива)
НомерЗначения = 0;

Пока ТекстJSON <> "" Цикл

ПервыйСимвол = Лев(ТекстJSON, 1);

Если ПервыйСимвол = "{" Тогда //вложенная структура

Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");

Если ТипДанных = "Структура" Тогда

Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
НомерЗначения = НомерЗначения + 1;

ИначеЕсли ТипДанных = "Массив" Тогда

Результат.Добавить(Значение);

КонецЕсли;

ИначеЕсли ПервыйСимвол = "[" Тогда //вложенный массив

Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");

Если ТипДанных = "Структура" Тогда

Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
НомерЗначения = НомерЗначения + 1;

Иначе

Результат.Добавить(Значение);

КонецЕсли;

ИначеЕсли ПервыйСимвол = "}" И ТипДанных = "Структура" Тогда //структура закончилась

ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));

Если Лев(ТекстJSON, 1) = "," Тогда

ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));

КонецЕсли;

Возврат;

ИначеЕсли ПервыйСимвол = "]" И ТипДанных = "Массив" Тогда //массив закончился

ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));

Если Лев(ТекстJSON, 1) = "," Тогда

ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));

КонецЕсли;

Возврат;

Иначе

Если ТипДанных = "Структура" Тогда

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

Если Поз = 0 Тогда

Прервать;

КонецЕсли;

ИмяЗначения = СокрЛП(Лев(ТекстJSON, Поз - 1));
ИмяЗначения = СтрЗаменить(ИмяЗначения, """", "");

ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз+1));

Если Лев(ТекстJSON, 1) = "{" Тогда //значение является структурой

Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");

ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда //значение является массивом

Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");

Иначе // обычное значение

ПервыйКавычка = Ложь;
ПредпоследнийКавычка = Ложь;
Поз = 0;
Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
Символ = Сред(ТекстJSON, Сч, 1);

Если Символ = """" Тогда

Если ПервыйКавычка Тогда

ПредпоследнийКавычка = Истина;

Иначе
ПервыйКавычка = Истина;

КонецЕсли;

КонецЕсли;

Если (Символ = "," И ((ПервыйКавычка И ПредпоследнийКавычка) Или (Не ПервыйКавычка И Не ПредпоследнийКавычка))) ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда

Поз = Сч;

Прервать;

КонецЕсли;

КонецЦикла;

Если Поз = 0 Тогда

Значение = ТекстJSON;
ТекстJSON = "";

Иначе

Значение = Лев(ТекстJSON, Поз - 1);
Значение = СтрЗаменить(Значение, """", "");
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));

КонецЕсли;

Значение = СокрЛП(Значение);

КонецЕсли;

Результат.Вставить(ИмяЗначения, Значение);

ИначеЕсли ТипДанных = "Массив" Тогда //обычное значение

Поз = 0;

Для Сч = 1 По СтрДлина(ТекстJSON) Цикл

Символ = Сред(ТекстJSON, Сч, 1);

Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда

Поз = Сч;
Прервать;

КонецЕсли;

КонецЦикла;

Если Поз = 0 Тогда

Значение = ТекстJSON;
ТекстJSON = "";

Иначе

Значение = Лев(ТекстJSON, Поз - 1);
Значение = СтрЗаменить(Значение, """", "");
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));

КонецЕсли;

Значение = СокрЛП(Значение);

Результат.Добавить(Значение);

КонецЕсли;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Таким образом мы импортировали данные из JSON в стандартные объекты платформы 1С:Предприятие, с которыми уже можно работать.

Импорт из JSON в 1С: 7 комментариев

  1. Роман

    Автор, спасибо! Единственное «но» — падает, если в полученном тексте есть запятые.

  2. Роман

    Как решение, можно в первую процедура вставить такой кусочек:
    ЗапятыеСПереводомСтроки = «,»+Символы.ПС;
    ТекстJSON = СтрЗаменить(ТекстJSON, ЗапятыеСПереводомСтроки, «%%%%»);
    ТекстJSON = СтрЗаменить(ТекстJSON, «,», » «);
    ТекстJSON = СтрЗаменить(ТекстJSON, «%%%%», ЗапятыеСПереводомСтроки);

  3. Евгений

    ИмяИсходящегоФайла = ПолучитьИмяВременногоФайла(«.txt»);
    Соединение = Новый HttpСоединение(Сервер);
    Соединение.Получить(Параметры,ИмяИсходящегоФайла);
    ФайлОтвета = Новый ЧтениеJSON;
    ФайлОтвета.ОткрытьФайл(ИмяИсходящегоФайла);

    мДанные = ПрочитатьJSON(ФайлОтвета);

  4. Александр Цыбизов

    >>Результат.Вставить(«Значение» + ?(НомерЗначения = 0, «», НомерЗначения), Значение);

    В эту строку внесите корректировку формата. Если НомерЗначения превышает 1000, начинается форматирование номера с группировкой. Т.е. на выходе получится, например, «Значение1 000», а не «Значение1000».

    А так огромаднейшее СПАСИБО!!!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *