JSON и 1С7.7

В этой статье я приведу примеры функций работы в 1С7.7 с JSON.

Функции были взяты с просторов сети и слегка доработаны (самую малость).

//****************************
//Процедура создает объект "MSScriptControl.ScriptControl" для разбора JSON
Процедура СоздатьСкриптJSON(Скрипт)
	
	Скрипт =  СоздатьОбъект("MSScriptControl.ScriptControl");
	Скрипт.Language="jscript";
	КодСкрипта = "              
	|                    
	| function parseJSON(strJSON) {
	|  var tmpFunc = (new Function('return('+strJSON+');'))();
	|  return(tmpFunc);
	| }
	|
	| // Получить элемент массива
	| function aGet(Array, index) {
	|  return(Array[index]);
	| }
	|
	| // Получить ключ пары по индексу
	| function oKey(Obj, index) {
	|  var size = 0, key;
	|  for (key in Obj) {
	|   if (size == index) break;
	|   if (Obj.hasOwnProperty(key)) size++;
	|  }
	|  return(key);
	| }
	|
	| // Получить значение пары по ключу
	| function oValueByKey(Obj, key) {
	|  return(Obj[key]);
	| }
	|
	| //Получить количество пар в объекте
	| Object.size = function(obj) {
	|  var size = 0, key;
	|  for (key in obj) {
	|   if (obj.hasOwnProperty(key)) size++;
	|  }
	|  return(size);
	| }
	|
	| //Получить размер объекта (количество пар в нём)
	| function oSize(Obj) {
	|  return(Object.size(Obj));
	| }
	|
	| // Получить тип объекта (number, string, object, array)
	| function eType(Element) {
	|  if (Element instanceof Array) {
	|    return(""array"");
	|  } else if (Object.prototype.toString.call(Element) === '[object Array]') {
	|    return(""array"");
	|  } else {
	|   return(typeof(Element));
	|  }
	| }
	|";
	Скрипт.AddCode(КодСкрипта);
	
КонецПроцедуры

//****************************
// Функция преобразует строку JSON в список значений
// Параметры:
//		Нет
// Возвращаемое значение:
//		Список значений или 0
Функция ДанныеJSONВСписок(ДанныеJSON, Скрипт)
	Перем Ключ, Значение;
	Перем Счетчик;
	
	РезультатРазбора = СоздатьОбъект("СписокЗначений");            
	ТипОбъекта = Скрипт.run("eType", ДанныеJSON);
	Если ТипОбъекта = "object" Тогда
		Для Счетчик = 0 По Скрипт.run("oSize", ДанныеJSON)-1 Цикл                        
			Ключ = Скрипт.run("oKey", ДанныеJSON, Счетчик);            
			Значение = Скрипт.run("oValueByKey", ДанныеJSON, Ключ);
			ТипЗнач = Скрипт.run("eType", Значение);
			Если Найти("number, string", ТипЗнач) > 0 Тогда
				Значение=СтрЗаменить(Значение,"\""","""");// убираем экранирование, сделанное с помощью \
				Значение=СтрЗаменить(Значение,"\\","\");
				Значение=СтрЗаменить(Значение,"\/","/");
				РезультатРазбора.ДобавитьЗначение(Значение, Ключ);
			ИначеЕсли Найти("object, array", ТипЗнач) > 0 Тогда
				РезультатРазбора.ДобавитьЗначение(ДанныеJSONВСписок(Значение, Скрипт), Ключ);
			КонецЕсли;
		КонецЦикла;                                  
	ИначеЕсли ТипОбъекта = "array" Тогда
		Для Счетчик = 0 По ДанныеJSON.length-1 Цикл
			Значение = Скрипт.run("aGet", ДанныеJSON, Счетчик);  
			ТипЗнач = Скрипт.run("eType", Значение);
			Если Найти("number, string", ТипЗнач) > 0 Тогда
				Значение=СтрЗаменить(Значение,"\""","""");// убираем экранирование, сделанное с помощью \
				Значение=СтрЗаменить(Значение,"\\","\");
				Значение=СтрЗаменить(Значение,"\/","/");
				РезультатРазбора.ДобавитьЗначение(Значение, СокрЛП(Строка(Счетчик)));
			ИначеЕсли Найти("object, array", ТипЗнач) > 0 Тогда
				РезультатРазбора.ДобавитьЗначение(ДанныеJSONВСписок(Значение, Скрипт), СокрЛП(Строка(Счетчик)));
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;    
	
	Возврат РезультатРазбора;
	
КонецФункции

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

//****************************
// Функция формирует строку JSON
// Параметры: 
//  Объект
// Возвращаемое значение:
//  Строка json
Функция ЗначениеВJSON(Объект, ДобавлятьРазделительСтрок = 0) 
	Перем Разделитель;
	
	Разделитель = "";
	Если ДобавлятьРазделительСтрок = 1 Тогда
		Разделитель = РазделительСтрок;
	КонецЕсли;
	
	Тип = ТипЗначенияСтр(Объект);
	Если Тип = "СписокЗначений" Тогда
		//то определим с ключами или без
		Если Объект.РазмерСписка() = 0 Тогда
			Тип = "СписокЗначенийбезКлючей";
		Иначе
			Ключ = "";
			Значение = Объект.ПолучитьЗначение(1,Ключ);
			Если ПустоеЗначение(Ключ) = 1 Тогда
				Тип = "СписокЗначенийбезКлючей";
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если Тип = "ТаблицаЗначений" Тогда
		сзКолонки = СоздатьОбъект("СписокЗначений");
		Для СчЦ = 1 По Объект.КоличествоКолонок() Цикл
			ИмяКолонки = Объект.ПолучитьПараметрыКолонки(СчЦ);
			сзКолонки.ДобавитьЗначение(ИмяКолонки);
		КонецЦикла;
		КоличКолонок = сзКолонки.РазмерСписка();
		Результат = "["+Разделитель;
		КоличСтрок = Объект.КоличествоСтрок();
		Для СчСтрок = 1 По КоличСтрок Цикл
			Результат = Результат + "{";
			Для СчК = 1 По сзКолонки.РазмерСписка() Цикл
				Ключ = сзКолонки.ПолучитьЗначение(СчК);
				Значение = Объект.ПолучитьЗначение(СчСтрок,Ключ);
				Результат = Результат + "" + ЗначениеВJSON(Ключ) + ":" + ЗначениеВJSON(Значение) + ?(СчК < КоличКолонок, "," + Разделитель, "");
			КонецЦикла;
			Результат = Результат + Разделитель + "}";
			Если СчСтрок < КоличСтрок Тогда
				Результат = Результат + ","+Разделитель;
			КонецЕсли;
			Состояние("Обработка таблицы значений "+Окр(СчСтрок/КоличСтрок*100,2)+"%");
		КонецЦикла;
		Результат = Результат + Разделитель + "]";
		Возврат Результат;
	ИначеЕсли Тип = "СписокЗначенийбезКлючей" Тогда //без ключей
		
		Количество = Объект.РазмерСписка();
		Результат = "[";
		
		Для н = 1 ПО Количество Цикл
			Результат = Результат + ЗначениеВJSON(Объект.ПолучитьЗначение(н)) + ?(н < Количество, ",", "");
		КонецЦикла;
		
		Результат = Результат + "]";
		Возврат Результат;
		
	ИначеЕсли Тип = "СписокЗначений" Тогда //с ключами
		н = 0;
		Количество = Объект.РазмерСписка();
		Результат = "{";
		
		Для СчЦ = 1 По Количество Цикл
			Ключ = "";
			Значение = Объект.ПолучитьЗначение(СчЦ,Ключ);
			Результат = Результат + ЗначениеВJSON(Ключ) + ":" + ЗначениеВJSON(Значение) + ?(СчЦ < Количество, ",", "");
		КонецЦикла;
		Результат = Результат + "}";
		Возврат Результат;
	ИначеЕсли Тип = "Строка" Тогда
		Результат = СокрЛП(Объект);
		Результат = СтрЗаменить(Результат, "\",            "\\");
		Результат = СтрЗаменить(Результат, "/",            "\/");
		Результат = СтрЗаменить(Результат, """",           "\""");
		Результат = СтрЗаменить(Результат, "'",            "\'");
		Результат = СтрЗаменить(Результат, Симв(13),       "\r");
		Результат = СтрЗаменить(Результат, СимволТабуляции,"\t");
		Результат = СтрЗаменить(Результат, Симв(10),       "\n");
		Возврат """" + Результат + """";
	ИначеЕсли Тип = "Число" Тогда
		Возврат Формат(Объект, "Ч");
	ИначеЕсли Тип = "Дата" Тогда
		Возврат ЗначениеВJSON("" + ДатаГод(Объект) + "-" + Прав("00" + ДатаМесяц(Объект), 2) + "-" + Прав("00" + ДатаЧисло(Объект), 2));
	ИначеЕсли Тип = "НеизвестныйОбъект" Тогда 
			Возврат "null";
	Иначе
		Возврат ЗначениеВJSON(Строка(Объект));
	КонецЕсли;	
	
КонецФункции // ЗначениеВJSON()

Author: admin

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