Выгрузка данных из дерева значений 1С в формат JSON иерархический список (Сериализация ДереваЗначений в JSON)



Тема: Иерархические списки при обмене данными.
В интернете не удалось найти подобного решения.
Обнаружена реализация только обратной операции JSON в дерево значений 1С или рассматриваются линейные списки (таблицы).

Рассмотрим презентуемую обработку: Тестирование выполнялось на платформе 1С:Предприятие 8.3.12.1790

1) Заполняет ДеревоЗначений, иерархию работ

{
"project": "Нарва",
"data": [
{
"type": "section",
"meta": {
"name": "Организация и содержание строительной площадки",
"xml_id": "9bb86f0d-e9a9-11e9-80ef-005056a42dd9",
"code": "B",
"lvl": 1
},
"children": [
{
"type": "section",
"meta": {
"name": "Общие условия, не зависящие от продолжительности работ: прокладка и подключение временных коммуникаций; прокладка временных дорог; устройство бытового",
"xml_id": "a965c933-e9a9-11e9-80ef-005056a42dd9",
"code": "B10",
"lvl": 2
},
"children": [
{
"type": "section",
"meta": {
"name": "Устройство забора",
"xml_id": "bcd8e68b-e9a9-11e9-80ef-005056a42dd9",
"code": "B1010",
"lvl": 3
},
"children": [
{
"type": "element",
"meta": {
"xml_id": "df8507ba-e03a-11e9-80ee-005056a42dd9",
"name": "Временное ограждение стройплощадки из металлического оцинкованного профнастила, тип 3БН",
"parent": "bcd8e68b-e9a9-11e9-80ef-005056a42dd9",
"code": "B10101001000",
"count": 243.45,
"um": "п.м",
"contracted": 776640.19,
"contracted_vat": 916965.88
}
},
{
"type": "element",
"meta": {
"xml_id": "df8507bb-e03a-11e9-80ee-005056a42dd9",
"name": "Металлические ворота выезда (шириной 6,0 м)",
"parent": "bcd8e68b-e9a9-11e9-80ef-005056a42dd9",
"code": "B10101001100",
"count": 1,
"um": "шт.",
"contracted": 46756.8,
"contracted_vat": 55173.02
}
},
{
"type": "element",
"meta": {
"xml_id": "df8507bc-e03a-11e9-80ee-005056a42dd9",
"name": "Калитка",
"parent": "bcd8e68b-e9a9-11e9-80ef-005056a42dd9",
"code": "B10101001150",
"count": 1,
"um": "шт.",
"contracted": 8096.9,
"contracted_vat": 9554.34
}
},
{
"type": "element",
"meta": {
"xml_id": "df8507bd-e03a-11e9-80ee-005056a42dd9",
"name": "Демонтаж и вывоз",
"parent": "bcd8e68b-e9a9-11e9-80ef-005056a42dd9",
"code": "B10101001200",
"count": 1,
}
}
]
}
]
}
]
}

2) Преобразует ДеревоЗначений 1С в Дерево JSON

3) Отправляет Дерево JSON методом «HTTP Запроса», тип команды «POST»

Обработку вы сможете адаптировать под любую конфигурацию.

Порядок работы с обработкой.

  1. Команда «Заполнить работы», заполняет линейный список
  2. Команда «Заполнить дерево иерархии», по данным верхней таблицы – формируется древовидная структура (ДеревоЗначений)
  3. Команда формирования структуры JSON (для отладки)
  4. Команда формирования JSON и отправки POST HTTP запроса

Основное требование:

В верхней таблице имеется колонка «Иерархия работ сметы»

Это иерархический справочник. Иерархия элементов.

Приведу листинг алгоритма сериализации ДеревоЗначений -> ДеревоJSON

//
Функция СоздатьЗаписиСмета(ВыводитьСообщения = Ложь) Экспорт

ДеревоJSON = ПолучитьДеревоJSON(ДеревоРаботИерархия);

// Сформировать строку JSON
ТелоЗапроса = "";

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Unix, "    ")); // инициализация записи

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

ДополнительныеПараметрыСериализации = Новый Структура;

ЗаписатьJSON(Запись, ДеревоJSON, НастройкиСериализации, "СериализацияВJSON", ЭтотОбъект, ДополнительныеПараметрыСериализации);

ТелоЗапроса = Запись.Закрыть();

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

Функция ПолучитьДеревоJSON(ДеревоЗначенийСКД)

СтруктураJSON = Новый Структура();

ОбходДереваСКД(СтруктураJSON, ДеревоЗначенийСКД);

Возврат СтруктураJSON;

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

Процедура ОбходДереваСКД(СтруктураJSON, ДеревоЗначенийСКД)

ИмяСвойстваМассиваСтрокиСтруктураJSON = ОпределитьСвойствоМассив(СтруктураJSON);

Для Каждого СтрокаДеревоЗначенийСКД Из ДеревоЗначенийСКД.Строки Цикл

Если ИмяСвойстваМассиваСтрокиСтруктураJSON = "ROOT" Тогда // Инициализация дерева JSON
СтруктураJSONНоваяСтрока = ВставитьЭлементСтруктурыJSON(СтруктураJSON, СтрокаДеревоЗначенийСКД);
Иначе
СтруктураJSONНоваяСтрока = ВставитьЭлементСтруктурыJSON(СтруктураJSON[ИмяСвойстваМассиваСтрокиСтруктураJSON], СтрокаДеревоЗначенийСКД);
КонецЕсли;

Если СтрокаДеревоЗначенийСКД.Строки.Количество()>0 Тогда
ОбходДереваСКД(СтруктураJSONНоваяСтрока, СтрокаДеревоЗначенийСКД);
КонецЕсли;

КонецЦикла;


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

Функция ВставитьЭлементСтруктурыJSON(МассивСтрокаСтруктураJSON, СтрокаДеревоЗначенийСКД)

СтруктураJSON  = Новый Структура;
МассивСтруктуры = Новый Массив;

Если НЕ ЗначениеЗаполнено(СтрокаДеревоЗначенийСКД.Работа) Тогда // Это "Проект"

СтруктураJSON.Вставить("project",       Строка(СтрокаДеревоЗначенийСКД.Проект));
СтруктураJSON.Вставить("dev_object_name",     Строка(ОбъектСтроительства));
СтруктураJSON.Вставить("owner",       Строка(Организация));
СтруктураJSON.Вставить("general_contractor",    Строка(Контрагент));
СтруктураJSON.Вставить("general_contractor_contract",  Строка(ДоговорКонтрагента));
СтруктураJSON.Вставить("сurrency",       Строка(ДоговорКонтрагента.ВалютаВзаиморасчетов));
СтруктураJSON.Вставить("data",        МассивСтруктуры);

МассивСтрокаСтруктураJSON = СтруктураJSON; // Инициализация структуры JSON

ИначеЕсли ЗначениеЗаполнено(СтрокаДеревоЗначенийСКД.Работа) // Это элемент иерархии
И ТипЗнч(СтрокаДеревоЗначенийСКД.Работа) = Тип("СправочникСсылка.смр_ИерархияРаботСметы") Тогда

СтруктураJSON.Вставить("type", "section");
СтруктураJSON.Вставить("meta", ЗаписьЭлементИерархии(СтрокаДеревоЗначенийСКД));
СтруктураJSON.Вставить("children", МассивСтруктуры);

// Это Массив для дочерних элементов
МассивСтрокаСтруктураJSON.Добавить(СтруктураJSON);

ИначеЕсли ЗначениеЗаполнено(СтрокаДеревоЗначенийСКД.Работа) // Это элемент "Работа"
И ТипЗнч(СтрокаДеревоЗначенийСКД.Работа) = Тип("СправочникСсылка.снх_РаботыСУП") Тогда

СтруктураJSON.Вставить("type", "element");
СтруктураJSON.Вставить("meta", ЗаписьРаботы(СтрокаДеревоЗначенийСКД));

// Это Массив для дочерних элементов
МассивСтрокаСтруктураJSON.Добавить(СтруктураJSON);

КонецЕсли;

Возврат СтруктураJSON;

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

Функция ОпределитьСвойствоМассив(СтрокаСтруктураJSON)

Если СтрокаСтруктураJSON.Свойство("data") Тогда // Это "Проект"
СвойствоМассив = "data";

ИначеЕсли СтрокаСтруктураJSON.Свойство("children") Тогда
СвойствоМассив = "children";

Иначе
СвойствоМассив = "ROOT";
КонецЕсли;

Возврат СвойствоМассив;

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

///////// Элементы Дерева JSON

Функция ЗаписьРаботы(СтрокаДеревоЗначенийСКД)
Перем СтруктураJSON;

СтруктураJSON = Новый Структура();

СтруктураJSON.Вставить("xml_id",   XMLСтрока(СтрокаДеревоЗначенийСКД.Работа.Ссылка));
СтруктураJSON.Вставить("name",    СтрокаДеревоЗначенийСКД.Работа.Наименование);
СтруктураJSON.Вставить("parent",   XMLСтрока(СтрокаДеревоЗначенийСКД.ИерархияРаботСметы.Ссылка));
СтруктураJSON.Вставить("code",    СтрокаДеревоЗначенийСКД.Работа.Шифр);
СтруктураJSON.Вставить("count",   СтрокаДеревоЗначенийСКД.ОбъемРаботы);
СтруктураJSON.Вставить("um",    СтрокаДеревоЗначенийСКД.Работа.ЕдиницаИзмерения.Наименование);
СтруктураJSON.Вставить("contracted",  СтрокаДеревоЗначенийСКД.СуммаБезНДС);
СтруктураJSON.Вставить("contracted_vat",СтрокаДеревоЗначенийСКД.Сумма);

Возврат СтруктураJSON;

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

Функция ЗаписьЭлементИерархии(СтрокаДеревоЗначенийСКД)
Перем СтруктураJSON;

СтруктураJSON = Новый Структура();

СтруктураJSON.Вставить("name",    СтрокаДеревоЗначенийСКД.Работа.Наименование);
СтруктураJSON.Вставить("xml_id",   XMLСтрока(СтрокаДеревоЗначенийСКД.Работа.Ссылка));
СтруктураJSON.Вставить("code",    СтрокаДеревоЗначенийСКД.Работа.Шифр);
СтруктураJSON.Вставить("lvl",    СтрокаДеревоЗначенийСКД.Работа.Уровень);

Возврат СтруктураJSON;

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

 

6 Comments

  1. XSlava

    Скажите пожалуйста, а какие задачи вы решаете данным преобразованием? Сделали преобразование, а дальше?

    Reply
  2. magvay_k

    Может использовать «СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ДеревоЗначений)»

    Reply
  3. XSlava

    (2)Можно на руках ходить, но многие люди ходят на ногах.

    Reply
  4. mwoleg

    (1) Цель — передать иерархический массив данных в стороннюю информационную систему (например web-сайт/портал)

    Reply
  5. mwoleg
    Reply
  6. serg-lom89

    могли бы к этому приложить конфигурацию хотя бы небольшую что бы был пример ?

    Reply

Leave a Comment

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