Загрузка данных


Функция Расш1_AddNewIncidentPost(Запрос)
	
	Ответ = Новый HTTPСервисОтвет(200);
	
	ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку();
	Чтение = Новый ЧтениеJSON;
	Чтение.УстановитьСтроку(ТелоЗапроса);
	
	НовыйДокумент = Документы.Инцидент.СоздатьДокумент();
	
	Массив = РазобратьJSON(ТелоЗапроса);
	
	Если Массив.Количество() Тогда
		
		ТекСоот = Массив[0];
		// {+} ЦФ Амбарцумов 12.10.2026
		Если НЕ ТекСоот.Получить("ExternalId") = Неопределено Тогда
        	НайденноеОбращение = Документы.Инцидент.НайтиПоРеквизиту("ВнешнийID", ТекСоот.Получить("ExternalId"));
			Если НайденноеОбращение <> Документы.Инцидент.ПустаяСсылка() Тогда
				Ответ.УстановитьТелоИзСтроки(ЗаписатьВJSONДокументИнцидентДетально(НайденноеОбращение).Закрыть());
				Возврат Ответ;
			Иначе
				НовыйДокумент.ВнешнийID = ТекСоот.Получить("ExternalId");
			КонецЕсли;
		КонецЕсли;
		
		Если НЕ ТекСоот.Получить("TypeOfAppel") = Неопределено Тогда
			ТипОбращения = ТекСоот.Получить("TypeOfAppel");
			Если ТипОбращения = "Incident" Тогда
				НовыйДокумент.Тип = Справочники.ИТ_ТипыИнцидентов.НайтиПоНаименованию("Инцидент", Истина);
			ИначеЕсли ТипОбращения = "ChangeRequest" Тогда
				НовыйДокумент.Тип = Справочники.ИТ_ТипыИнцидентов.НайтиПоНаименованию("Запрос на изменение", Истина);
			КонецЕсли;
		КонецЕсли;
		// {-} ЦФ Амбарцумов 12.10.2026
		Если НЕ ТекСоот.Получить("Topic") = Неопределено Тогда
			НовыйДокумент.ТемаОбращения = ТекСоот.Получить("Topic");
		КонецЕсли;
		
		Если НЕ ТекСоот.Получить("Data") = Неопределено Тогда
			НовыйДокумент.Дата = Дата(ТекСоот.Получить("Data"));
		КонецЕсли;
		
		Если НЕ ТекСоот.Получить("Description") = Неопределено Тогда
			НовыйДокумент.Описание = ТекСоот.Получить("Description");
		КонецЕсли;
		
		
		Если ТипЗнч(ТекСоот.Получить("MembershipServices")) = Тип("Соответствие")  И 
			ТекСоот.Получить("MembershipServices").Получить("UID") <> Неопределено  И  
			Не ПустаяСтрока(Строка(ТекСоот.Получить("MembershipServices").Получить("UID")) ) Тогда
			
			НовыйДокумент.КомпонентаУслуги = Справочники.СоставУслуг.ПолучитьСсылку(
				Новый УникальныйИдентификатор(ТекСоот.Получить("MembershipServices").Получить("UID")));
			НовыйДокумент.Услуга = НовыйДокумент.КомпонентаУслуги.Владелец;
		КонецЕсли;
		
		Если ТипЗнч(ТекСоот.Получить("Category")) = Тип("Соответствие")  И  
			ТекСоот.Получить("Category").Получить("UID")  <> Неопределено   И  
			Не ПустаяСтрока(Строка(ТекСоот.Получить("Category").Получить("UID")  )) Тогда
			
			НовыйДокумент.Категория = Справочники.ИТ_Категории.ПолучитьСсылку(
		    	Новый УникальныйИдентификатор(ТекСоот.Получить("Category").Получить("UID")));
			
		КонецЕсли;
		
		Если ТипЗнч(ТекСоот.Получить("ConfigurationItems")) = Тип("Массив") Тогда
			
			Для каждого Соот Из ТекСоот.Получить("ConfigurationItems") Цикл
				
				НовыйДокумент.КонфигурационныеЕдиницы.Добавить().КЕ = 
				Справочники.ОбъектыОбслуживания.ПолучитьСсылку(Новый УникальныйИдентификатор(
					Соот.Получить("UID")
				));
				
			КонецЦикла;
			
		КонецЕсли;
		// {+} ЦФ Амбарцумов 12.10.2026 
		
		// {+} ЦФ Амбарцумов 26.10.2026
		Если ТекСоот.Получить("IsMassIncident") <> Неопределено Тогда
			НовыйДокумент.ЦФ_ПодозрениеНаМассовуюПроблему = ТекСоот.Получить("IsMassIncident");
		КонецЕсли;
		// {-} ЦФ Амбарцумов 26.10.2026

		Если НЕ ТекСоот.Получить("Initiator") = Неопределено Тогда
			НовыйДокумент.КонтактноеЛицо = Справочники.ИТ_КонтактныеЛица.НайтиПоКоду(ТекСоот.Получить("Initiator"));
		Иначе
			НовыйДокумент.КонтактноеЛицо =  ИТ_ГлобальныйМодульСервер.Ит_глЗначениеПеременной("глТекущееКонтактноеЛицо");
		КонецЕсли;
		// {-} ЦФ Амбарцумов 12.10.2026
		НовыйДокумент.Клиент = НовыйДокумент.КонтактноеЛицо.Владелец;
		НовыйДокумент.ЧасовойПоясДокумента = ПолучениеЗначенийСервер.ПолучитьПараметр("ИТ_ЧасовойПояс", ИТ_ГлобальныйМодульСервер.Ит_глЗначениеПеременной("глТекущееКонтактноеЛицо"));
		
		НовыйДокумент.ДатаНачалаРегистрации= НовыйДокумент.Дата;
		
		НовыйДокумент.КаналСвязи           = Справочники.ИТ_КаналыСвязи.WebИнтерфейс;
		//НовыйДокумент.Тип                  = Константы.ИТ_ТипИнцидента.Получить();
		
		
		Если ЗначениеЗаполнено(НовыйДокумент.КомпонентаУслуги) И ЗначениеЗаполнено(НовыйДокумент.Услуга) Тогда
			Попытка
				КураторПоСЛА = ПолучитьКуратораУслуги(НовыйДокумент.Дата, НовыйДокумент.Клиент, НовыйДокумент.КомпонентаУслуги);
				СтруктураОтветственного = ПолучитьСтруктуруОтветственного(НовыйДокумент.Дата, НовыйДокумент.Клиент, НовыйДокумент.КомпонентаУслуги, КураторПоСЛА);
				
				НовыйДокумент.Ответственный = СтруктураОтветственного.Ответственный;
				НовыйДокумент.ОргПодразделение = СтруктураОтветственного.ОргПодразделение;
			Исключение
				ЗаписьЖурналаРегистрации("Ошибка автоэскалации портала", 
				УровеньЖурналаРегистрации.Ошибка, , ,
				ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
				
			КонецПопытки
		КонецЕсли;
		
		
		Если Не ЗначениеЗаполнено(НовыйДокумент.Приоритет) Тогда
			НовыйДокумент.Приоритет        = Константы.ИТ_ПриоритетИнцидента.Получить();
		КонецЕсли;	
		
		НовыйДокумент.РабочееМесто                      = ИТ_ГлобальныйМодульСервер.Ит_глЗначениеПеременной("глТекущееКонтактноеЛицо").РабМесто;
		СценарийОбработки = "";
		ИТ_ПравилаПереходаСервер.ПолучитьИзменениеСценарийИУстановитьСценарийВПараметр( НовыйДокумент.КомпонентаУслуги,НовыйДокумент.Клиент,
		НовыйДокумент.Дата,СценарийОбработки,Ложь);
		
		Если СценарийОбработки = "" Тогда
			
			СценарийОбработки = Константы.ИТ_СценарийПоУмолчанию.Получить();
			
		КонецЕсли;																					
		
		СтруктураСостояний = ИТ_ПравилаПереходаСервер.ПолучитьСтруктуруСостояний(НовыйДокумент.Тип,СценарийОбработки,"Обращение",
		НовыйДокумент.Состояние);																			
		
		НовыйДокумент.СценарийОбработки = СценарийОбработки;																											
		
		Если СтруктураСостояний.МассивСостоянийПоУмолчанию.Количество() > 0 Тогда
			
			НовоеСостояние                              = СтруктураСостояний.МассивСостоянийПоУмолчанию[0];
			
			НовыйДокумент.Состояние                     = НовоеСостояние;
			
			СписокПравилДляОбработкиПриЗаписиПоСценарию = Новый СписокЗначений;
			СписокПравилДляОбработкиПриЗаписиПоСценарию.ЗагрузитьЗначения(СтруктураСостояний.СоответствиеНачальныхСостояний[НовоеСостояние].Неинтерактивное);
			
			Отказ = Ложь;
			
			ИТ_ПравилаОбработкиСервер.ОбработатьПравило(ПредопределенноеЗначение("Перечисление.ИТ_ВидыОбъектов.Обращение"),
			ПредопределенноеЗначение("Перечисление.ИТ_СобытияПравил.СценарийОбработки"),
			НовыйДокумент,
			Отказ ,
			,
			,
			,
			СписокПравилДляОбработкиПриЗаписиПоСценарию.ВыгрузитьЗначения() ,
			Ложь);
			
		КонецЕсли;
		
		Попытка
			
			ИТ_ОбщийЗакрытый.оз_НастройкаФорм("");
			
			НовыйДокумент.Записать();
			
			//<Форвард Кириченко добавлено 28/04/2023>    
			фд_ДоработкиСервер.ДобавитьСвязанныеНарядыДляОбращения(НовыйДокумент);			
			
		Исключение
			
			Ошибка = ОписаниеОшибки();
			МассивСообщений = ПолучитьСообщенияПользователю();
			Для Каждого Сообщение Из МассивСообщений Цикл
				Ошибка = Ошибка + " " + Сообщение.Текст;
			КонецЦикла;
			
			Ответ = Новый HTTPСервисОтвет(200);
			Ответ.УстановитьТелоИзСтроки(ПолучитьJSONОшибка("Не удалось записать создаваемый документ"));
			Возврат Ответ;
			 
		КонецПопытки;
		
		
		Ответ.УстановитьТелоИзСтроки(ЗаписатьВJSONДокументИнцидентДетально(НовыйДокумент.Ссылка).Закрыть());
		
	Иначе
		
		Ответ = Новый HTTPСервисОтвет(200);
		Ответ.УстановитьТелоИзСтроки(ПолучитьJSONОшибка("Не удалось получить детальные данные документа для его регистрации"));
		Возврат Ответ;
		
	КонецЕсли;
	
	Возврат Ответ;
КонецФункции

Функция ПолучитьКуратораУслуги (ТекДата, Клиент, СоставУслуги)
	
	ПараметрыУслуги = ПолучениеЗначенийСервер.ПолучитьПараметрыУслуги(ТекДата, Клиент, СоставУслуги);
	
	Если ПараметрыУслуги.Свойство("Куратор") Тогда
		Возврат	ПараметрыУслуги.Куратор;
	Иначе
		Возврат Неопределено;
	КонецЕсли;

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

Функция ПолучитьСтруктуруОтветственного(ТекДата, Клиент, СоставУслуги, КураторПоСЛА)
	ОтветственныйПоSLA = ПолучитьРГПоSLA(ТекДата, Клиент, СоставУслуги);
	
			Если ЗначениеЗаполнено(ОтветственныйПоSLA) Тогда
				Ответственный 	= ОтветственныйПоSLA;
				ОргПодразделение = ОтветственныйПоSLA;
			ИначеЕсли Константы.ИспользоватьКуратора.Получить() И Не ЗначениеЗаполнено(ОргПодразделение) Тогда
				Ответственный = КураторПоСЛА;
				Подразделения = ПолучениеЗначенийСервер.пзПолучитьСписокПодразделений(Ответственный);
				Если Подразделения.Найти(Ответственный) <> Неопределено Тогда
					Подразделения.Удалить(Подразделения.Найти(Ответственный));
				КонецЕсли;					
				
				Если Подразделения.Количество() = 1 Тогда
					ОргПодразделение = Подразделения[0];
				Иначе
					ОргПодразделение = Справочники.ОрганизационныеПодразделения.ПустаяСсылка();
				КонецЕсли;
			КонецЕсли;


	Возврат Новый Структура("Ответственный, ОргПодразделение", Ответственный, ОргПодразделение);
КонецФункции

Функция ПолучитьРГПоSLA(ТекДата, Клиент, СоставУслуги)