Функции преобразования ЗаписьJSON
Теги: 1С,Сериализация JSON,JSON,Функции преобразования

Функция преобразования, используемая при сериализации данных в JSON, вызывается для всех свойств, тип которых не поддерживает преобразование в формат JSON на прямую. В "функции преобразования" разработчик напрямую может проанализировать переданный объект и вернуть платформе значение которое может быть сериализовано в JSON (строка, число, дата, коллекции значений ..) либо отказаться от записи значения. Привожу пример с Объектом встроенного языка - ДанныеАдреса (подобие фикс структуры, создается на основе структуры с определенными ключами).

# Код реализации

```1c
&НаСервере
Процедура ВыполнитьЗаписьДанныхНаСервере()

	ПутьНаСервере1  = "C:\Users\SystemX\Desktop\TestJSON_1.json";
	ПутьНаСервере2  = "C:\Users\SystemX\Desktop\TestJSON_2.json";

	МассивДанных = Новый Массив;

	ЗаполнитьМассивДанными(МассивДанных);

	СтруктураЗаписываемогоФайла = Новый Структура("Info");

	СтруктураЗаписываемогоФайла.Info = МассивДанных;

	// 1. Новый способ (преимущественно для простых типов, быстрой генерации JSON строки);
	//Попытка
	//	ЗначениеJSON = ЗаписатьЗначениеJSON(СтруктураЗаписываемогоФайла);
	//Исключение
	//КонецПопытки;

	// 2. Старый способ;
	ЗаписьJSON = Новый ЗаписьJSON();

	ЗаписьJSON.ОткрытьФайл(ПутьНаСервере1, "UTF-8",, Новый ПараметрыЗаписиJSON(, " "));

	НастройкиСериализации = Новый НастройкиСериализацииJSON();
	НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
	НастройкиСериализации.СериализовыватьМассивыКакОбъекты 	= Ложь;
	НастройкиСериализации.ФорматСериализацииДаты 			= ФорматДатыJSON.ISO;

	Попытка
		ЗаписатьJSON(ЗаписьJSON, СтруктураЗаписываемогоФайла, НастройкиСериализации, "ФункцияПреобразованияНеСериализуемыхТипов", ЭтотОбъект);
	Исключение
	КонецПопытки;

	ЗаписьJSON.Закрыть();

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

&НаСервере
Процедура ЗаполнитьМассивДанными(МассивДанных)

	Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 20
	                      |	Контрагенты.Наименование 			КАК Наименование,
	                      |	Контрагенты.НаименованиеПолное 		КАК НаименованиеПолное,
	                      |	Контрагенты.ИНН 					КАК ИНН,
	                      |	Контрагенты.КПП 					КАК КПП,
	                      |	Контрагенты.ЮрФизЛицо 				КАК ЮрФизЛицо
	                      |ИЗ
	                      |	Справочник.Контрагенты 				КАК Контрагенты		");

	Выборка = Запрос.Выполнить().Выбрать();

	Счетчик = 1;
	Пока Выборка.Следующий() 	Цикл

		СтруктураКонтрагент = Новый Структура("Наименование, НаименованиеПолное, ИНН, КПП, ЮрФизЛицо");

		ЗаполнитьЗначенияСвойств(СтруктураКонтрагент, Выборка);

		Если Выборка.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
			СтруктураКонтрагент.ЮрФизЛицо = "Физическое лицо";
		ИначеЕсли Выборка.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
			СтруктураКонтрагент.ЮрФизЛицо = "Юридическое лицо";
		Иначе
			СтруктураКонтрагент.ЮрФизЛицо = "Индивидуальный предприниматель";
		КонецЕсли;

		СтруктураКонтрагент.Вставить("ТекущаяДата", ЗаписатьДатуJSON(ТекущаяДата(), ФорматДатыJSON.ISO, ВариантЗаписиДатыJSON.УниверсальнаяДата));

		ДопИнформация = Новый ДанныеАдреса(
										  Новый Структура
										  (
										  "Страна, Город, Дом, Индекс",
								          "Страна - " + Счетчик,
										  "Город  - " + Счетчик,
										  "Дом    - " + Счетчик,
										  "Индекс - " + Счетчик
										  )
										  );

		СтруктураКонтрагент.Вставить("ДанныеАдреса", ДопИнформация);

		МассивДанных.Добавить(СтруктураКонтрагент);

		Счетчик = Счетчик + 1;

	КонецЦикла;

КонецПроцедуры // ЗаполнитьМассивДанными()

&НаСервере
Функция ФункцияПреобразованияНеСериализуемыхТипов(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт

	// Вызывается для тех типов, которые платформа не может автоматические преобразовать в JSON;
	Если Свойство = "ДанныеАдреса" Тогда
		Возврат Строка(Значение.Страна + "; " + Значение.Город + "; " + Значение.Индекс);
	КонецЕсли;

КонецФункции // ФункцияПреобразованиеСложныхТипов()

&НаКлиенте
Процедура ВыполнитьЗаписьДанных(Команда)
	ВыполнитьЗаписьДанныхНаСервере();
КонецПроцедуры
```