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


&НаКлиенте
Процедура Загрузить(Команда)
	Если Период.ДатаНачала = '00010101' ИЛИ Период.ДатаОкончания = '00010101' Тогда
		Сообщить("Пожалуйста, выберите период перед загрузкой!");
		Возврат;
	КонецЕсли;
	
	ЗагрузитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьНаСервере()
	ДанныеДляОтправки.Очистить();
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	""retail"" КАК КаналВыгрузки,
		|	РеализацияТовары.Ссылка КАК Документ,
		|	РеализацияТовары.Ссылка.Дата КАК Дата,
		|	РеализацияТовары.Ссылка.Партнер КАК Контрагент,
		|	""нет кода"" КАК КодCRM,
		|	"""" КАК Спецификация,
		|	РеализацияТовары.Номенклатура КАК Номенклатура,
		|	""TU0-0000000"" КАК КодГотоплекс,
		|	РеализацияТовары.Количество КАК Объем,
		|	""piece"" КАК ЕдИзмерения,
		|	РеализацияТовары.Сумма КАК Сумма
		|ИЗ
		|	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
		|ГДЕ
		|	РеализацияТовары.Ссылка.Проведен = ИСТИНА
		|	И (РеализацияТовары.Номенклатура.Наименование ПОДОБНО &ИмяРус
		|	ИЛИ РеализацияТовары.Номенклатура.Наименование ПОДОБНО &ИмяАнгл)
		|	И РеализацияТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
		
	Запрос.УстановитьПараметр("ИмяРус", "%БИНАТОН%");
	Запрос.УстановитьПараметр("ИмяАнгл", "%BINATONE%");
	Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания);
	
	ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
	ДанныеДляОтправки.Загрузить(ТаблицаРезультат);
КонецПроцедуры

&НаКлиенте
Процедура СгенерироватьJSON(Команда)
	СгенерироватьJSONНаСервере();
КонецПроцедуры

&НаСервере
Процедура СгенерироватьJSONНаСервере()
	МассивRetail = Новый Массив;
	МассивProf = Новый Массив;
	МассивMarketplace = Новый Массив;
	
	Для Каждого СтрокаТаблицы Из ДанныеДляОтправки Цикл
		ОбъектПродажи = Новый Структура;
		
		ОбъектПродажи.Вставить("id", Строка(СтрокаТаблицы.Документ.УникальныйИдентификатор()));
		ОбъектПродажи.Вставить("date", Формат(СтрокаТаблицы.Дата, "ДФ=dd.MM.yyyy"));
		ОбъектПродажи.Вставить("customerCrmCode", СтрокаТаблицы.КодCRM);
		ОбъектПродажи.Вставить("customerName", Строка(СтрокаТаблицы.Контрагент));
		ОбъектПродажи.Вставить("goodsCode", СтрокаТаблицы.КодГотоплекс);
		ОбъектПродажи.Вставить("volume", СтрокаТаблицы.Объем);
		ОбъектПродажи.Вставить("unit", СтрокаТаблицы.ЕдИзмерения);
		ОбъектПродажи.Вставить("amount", СтрокаТаблицы.Сумма);
		
		Если СтрокаТаблицы.КаналВыгрузки = "prof" Тогда
			ОбъектПродажи.Вставить("specificationId", СтрокаТаблицы.Спецификация);
		КонецЕсли;
		
		Если СтрокаТаблицы.КаналВыгрузки = "retail" Тогда
			МассивRetail.Добавить(ОбъектПродажи);
		ИначеЕсли СтрокаТаблицы.КаналВыгрузки = "prof" Тогда
			МассивProf.Добавить(ОбъектПродажи);
		ИначеЕсли СтрокаТаблицы.КаналВыгрузки = "marketplace" Тогда
			МассивMarketplace.Добавить(ОбъектПродажи);
		КонецЕсли;
	КонецЦикла;
	
	ПакетДанных = Новый Структура;
	ПакетДанных.Вставить("retail", МассивRetail);
	ПакетДанных.Вставить("prof", МассивProf);
	ПакетДанных.Вставить("marketplace", МассивMarketplace);
	ПакетДанных.Вставить("retailStocks", Новый Массив);
	ПакетДанных.Вставить("profStocks", Новый Массив);
	
	ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб); 
	Запись = Новый ЗаписьJSON;
	Запись.УстановитьСтроку(ПараметрыJSON);
	
	ЗаписатьJSON(Запись, ПакетДанных);
	ТекстJSON = Запись.Закрыть();
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьНаСервер(Команда)
	Если ПустаяСтрока(ТекстJSON) Тогда
		Сообщить("Сначала сгенерируйте JSON!");
		Возврат;
	КонецЕсли;
	
	ОтправитьНаСерверНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОтправитьНаСерверНаСервере()
	АдресСервера = ?(ИспользоватьТестовыйСервер, API_ADDRESS_TEST, API_ADDRESS);
	
	Если ПустаяСтрока(АдресСервера) Тогда
		Сообщить("Ошибка: Не заполнен адрес сервера в настройках!");
		Возврат;
	КонецЕсли;
	
	АдресБезHTTPS = СтрЗаменить(АдресСервера, "https://", "");
	АдресБезHTTPS = СтрЗаменить(АдресБезHTTPS, "http://", "");
	
	ПозицияСлеша = СтрНайти(АдресБезHTTPS, "/");
	Если ПозицияСлеша > 0 Тогда
		Домен = Лев(АдресБезHTTPS, ПозицияСлеша - 1);
		Путь = Сред(АдресБезHTTPS, ПозицияСлеша);
	Иначе
		Домен = АдресБезHTTPS;
		Путь = "/";
	КонецЕсли;
	
	ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows, Новый СертификатыУдостоверяющихЦентровWindows);
	HTTP = Новый HTTPСоединение(Домен, 443, , , , 10, ssl);
	
	ЗапросAPI = Новый HTTPЗапрос(Путь);
	ЗапросAPI.Заголовки.Вставить("Content-Type", "application/json");
	
	Если Не ПустаяСтрока(API_KEY) Тогда
		ЗапросAPI.Заголовки.Вставить("Authorization", "Bearer " + API_KEY);
	КонецЕсли;
	
	ЗапросAPI.УстановитьТелоИзСтроки(ТекстJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	
	Попытка
		Ответ = HTTP.ОтправитьДляОбработки(ЗапросAPI);
		
		КодСтатуса = Ответ.КодСостояния;
		ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
		
		СтатусHTTP = Строка(КодСтатуса); 
		ОтветСервера = ТелоОтвета;
		
		НоваяЗапись = ЛогОбмена1.Вставить(0);
		НоваяЗапись.Период = ТекущаяДата();
		НоваяЗапись.ТипДанных = "Полная выгрузка";
		НоваяЗапись.КодОтвета = КодСтатуса;
		
		Если КодСтатуса = 201 ИЛИ КодСтатуса = 200 Тогда
			НоваяЗапись.Статус = "Успешно";
			НоваяЗапись.ТекстОшибки = "Пакет данных успешно доставлен";
			
			ДатаПоследнегоОбмена = ТекущаяДата();
			Сообщить("УСПЕХ! Данные отправлены.");
		Иначе
			НоваяЗапись.Статус = "Ошибка сервера";
			НоваяЗапись.ТекстОшибки = Лев(ТелоОтвета, 150);
			Сообщить("Внимание! Сервер вернул ошибку. Проверьте вкладку Статус.");
		КонецЕсли;
		
	Исключение
		СтатусHTTP = "ОШИБКА СЕТИ";
		ОтветСервера = ОписаниеОшибки();
		
		НоваяЗапись = ЛогОбмена1.Вставить(0);
		НоваяЗапись.Период = ТекущаяДата();
		НоваяЗапись.ТипДанных = "Полная выгрузка";
		НоваяЗапись.Статус = "Критическая ошибка";
		НоваяЗапись.ТекстОшибки = Лев(ОписаниеОшибки(), 150);
		
		Сообщить("Критическая ошибка сети! Проверьте вкладку Статус.");
	КонецПопытки;
КонецПроцедуры