Skip to content

Instantly share code, notes, and snippets.

@PlugFox
Last active March 19, 2024 09:22
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PlugFox/aac4d207e795655c007b963ec04e99a7 to your computer and use it in GitHub Desktop.
Save PlugFox/aac4d207e795655c007b963ec04e99a7 to your computer and use it in GitHub Desktop.
JSON сериализация
#Область JSON
Функция СериализоватьJSON(Данные, ФункцияПреобразования = "ФункцияПреобразованияJSON") Экспорт
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
НастройкиСериализации = Новый НастройкиСериализацииJSON();
НастройкиСериализации.СериализовыватьМассивыКакОбъекты = Ложь;
НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением;
ЗаписатьJSON(ЗаписьJSON, Данные, НастройкиСериализации, ФункцияПреобразования, веб_сериализация);
Возврат ЗаписьJSON.Закрыть();
КонецФункции // СериализоватьJSON()
//************************************************************
Функция ДесериализоватьJSON(СтрокаJSON) Экспорт
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Возврат ПрочитатьJSON(ЧтениеJSON);
КонецФункции // ДесериализоватьJSON()
//************************************************************
Функция СериализоватьОбъектJSON(Данные) Экспорт
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Данные);
Возврат ЗаписьJSON.Закрыть();
КонецФункции // СериализоватьОбъектJSON()
//************************************************************
Функция ДесериализоватьОбъектJSON(СтрокаJSON) Экспорт
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Возврат СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);
КонецФункции // ДесериализоватьОбъектJSON()
//************************************************************
// Данная функция вызывается для всех свойств, тип которых не поддерживает преобразование в формат JSON напрямую.
// Она должна преобразовать Значение в значение допустимого для записи в JSON типа.
// Функция должна предваряться директивой &НаСервере или &НаКлиенте.
// Использование функции вне контекста формы или модуля, или команды не допускается.
//
// Параметры:
// Свойство - в параметр передается имя свойства, если выполняется запись структуры или соответствия,
// Значение - в параметр передается исходное значение,
// ДополнительныеПараметры - дополнительные параметры, которые указаны в вызове метода ЗаписатьJSON,
// Отказ - отказ от записи свойства.
//
// Возвращаемое значение:
// + Неопределено,
// + Булево,
// + Число,
// + Строка,
// + Дата (будет преобразована в строку),
// + Структура,
// + ФиксированнаяСтруктура,
// + Массив,
// + ФиксированныйМассив,
// + Соответствие,
// + ФиксированноеСоответствие.
//
// Если функция возвращает объект, который не поддерживает преобразование в JSON, то будет вызвано исключение.
// Если данный параметр задан и не задан параметр <МодульФункцииПреобразования>, и наоборот, будет вызвано исключение.
Функция ФункцияПреобразованияJSON(Знач Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
// Таблица значений
Если ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда
/// TODO: преобразовывать ссылки из таблицы значений одним запросом, чтоб снизить количество обращений к базе данных.
/// ...
// Переведем названия колонок на латиницу
Для Каждого Колонка Из Значение.Колонки Цикл
matchingFieldNames = веб_заявки_повт.matchingFieldNames(, Истина);
ИмяЛат = matchingFieldNames[НРег(Колонка.Имя)];
Колонка.Имя = ?(ИмяЛат=Неопределено, Колонка.Имя, ИмяЛат);
КонецЦикла;
// Преобразуем в массив структур
Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(Значение);
КонецЕсли;
// Более сложные типы
мета = Метаданные.НайтиПоТипу(ТипЗнч(Значение));
value = ?(Значение.Пустая(), Неопределено, XMLСтрока(Значение));
type = мета.ПолноеИмя();
baseType = Лев(type, СтрНайти(type, ".")-1);
Данные = Новый Структура("value,type,baseType,presentation"
, value, type, baseType, мета.Представление());
Если НРег(baseType) = "справочник" Тогда
Данные.Вставить("code", ?(value=Неопределено, Неопределено, Значение.Код));
Данные.Вставить("description", ?(value=Неопределено, Неопределено, Значение.Наименование));
ИначеЕсли НРег(baseType) = "документ" Тогда
Данные.Вставить("number", ?(value=Неопределено, Неопределено, Значение.Номер));
Данные.Вставить("date", ?(value=Неопределено, Неопределено, Значение.Дата));
ИначеЕсли НРег(baseType) = "перечисление" Тогда
Данные.Вставить("description", ?(value=Неопределено, Неопределено, Строка(Значение)));
ИначеЕсли НРег(baseType) = "планвидовхарактеристик" Тогда
Данные.Вставить("description", ?(value=Неопределено, Неопределено, Строка(Значение)));
ИначеЕсли НРег(baseType) = "плансчетов" Тогда
Данные.Вставить("description", ?(value=Неопределено, Неопределено, Строка(Значение)));
Иначе
Данные.Вставить("description", ?(value=Неопределено, Неопределено, Строка(Значение)));
КонецЕсли;
Возврат Данные;
КонецФункции // ФункцияПреобразованияJSON()
//************************************************************
Функция БыстроJSON(Знач Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
// Таблица значений
Если ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда
/// TODO: преобразовывать ссылки из таблицы значений одним запросом, чтоб снизить количество обращений к базе данных.
/// ...
// Переведем названия колонок на латиницу
Для Каждого Колонка Из Значение.Колонки Цикл
matchingFieldNames = веб_заявки_повт.matchingFieldNames(, Истина);
ИмяЛат = matchingFieldNames[НРег(Колонка.Имя)];
Колонка.Имя = ?(ИмяЛат=Неопределено, Колонка.Имя, ИмяЛат);
КонецЦикла;
// Преобразуем в массив структур
Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(Значение);
КонецЕсли;
Возврат XMLСтрока(Значение);
КонецФункции // БыстроJSON()
#КонецОбласти
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment