Рассмотрим презентуемую обработку: Тестирование выполнялось на платформе 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»
Обработку вы сможете адаптировать под любую конфигурацию.
Порядок работы с обработкой.
- Команда «Заполнить работы», заполняет линейный список
- Команда «Заполнить дерево иерархии», по данным верхней таблицы – формируется древовидная структура (ДеревоЗначений)
- Команда формирования структуры JSON (для отладки)
- Команда формирования 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;
КонецФункции