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


// ============================================================================
// БЛОК 1: ОСНОВНАЯ ВЫГРУЗКА ДАННЫХ
// ============================================================================

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

&НаСервере
Процедура ЗагрузитьНаСервере()
	ДанныеДляОтправки.Очистить();
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	пм_СоответствиеНоменклатуры.Номенклатура КАК Товар,
		|	пм_СоответствиеНоменклатуры.КодПеноплекс КАК КодПеноплекс, 
		|	пм_СоответствиеНоменклатуры.ЕдиницаИзмерения КАК ЕдиницаИзмерения
		|ПОМЕСТИТЬ СписокНоменклатуры
		|ИЗ
		|	РегистрСведений.пм_СоответствиеНоменклатуры КАК пм_СоответствиеНоменклатуры
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ВЫБОР
		|		КОГДА ТИПЗНАЧЕНИЯ(ВыручкаИСебестоимостьПродажОбороты.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
		|			ТОГДА ""prof""
		|		ИНАЧЕ ""retail""
		|	КОНЕЦ КАК КаналВыгрузки,
		|	ВыручкаИСебестоимостьПродажОбороты.Регистратор КАК Документ,
		|	ВыручкаИСебестоимостьПродажОбороты.Период КАК Дата,
		|	АналитикаПоПартнерам.Контрагент КАК Контрагент,
		|	""нет кода"" КАК КодCRM,
		|	"""" КАК Спецификация,
		|	АналитикаНоменклатуры.Номенклатура КАК Номенклатура,
		|	ЕСТЬNULL(СписокНоменклатуры.КодПеноплекс, ""НЕТ_КОДА"") КАК КодПеноплекс,
		|	ВыручкаИСебестоимостьПродажОбороты.КоличествоОборот КАК Объем,
		|	ЕСТЬNULL(СписокНоменклатуры.ЕдиницаИзмерения, ""piece"") КАК ЕдИзмерения,
		|	ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК Сумма
		|ИЗ
		|	РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, ) КАК ВыручкаИСебестоимостьПродажОбороты
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНоменклатуры КАК АналитикаНоменклатуры
		|		ПО ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры = АналитикаНоменклатуры.КлючАналитики
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаПоПартнерам
		|		ПО ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам = АналитикаПоПартнерам.КлючАналитики
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ СписокНоменклатуры КАК СписокНоменклатуры
		|		ПО (АналитикаНоменклатуры.Номенклатура = СписокНоменклатуры.Товар)
		|ГДЕ
		|	ВыручкаИСебестоимостьПродажОбороты.КоличествоОборот > 0
		|	И (ТИПЗНАЧЕНИЯ(ВыручкаИСебестоимостьПродажОбороты.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
		|			ИЛИ ТИПЗНАЧЕНИЯ(ВыручкаИСебестоимостьПродажОбороты.Регистратор) = ТИП(Документ.ОтчетОРозничныхПродажах))
		|
		|УПОРЯДОЧИТЬ ПО
		|	Дата";
		
	Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания);
	
	ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
	ДанныеДляОтправки.Загрузить(ТаблицаРезультат);
КонецПроцедуры


// ============================================================================
// БЛОК 2: УПРАВЛЕНИЕ РЕГИСТРОМ МЭППИНГА ТОВАРОВ
// ============================================================================

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

&НаСервере
Процедура ОбновитьНаСервере()
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	пм_СоответствиеНоменклатуры.Номенклатура КАК Номенклатура,
		|	пм_СоответствиеНоменклатуры.КодПеноплекс КАК КодПеноплекс, 
		|	пм_СоответствиеНоменклатуры.ЕдиницаИзмерения КАК ЕдиницаИзмерения
		|ИЗ
		|	РегистрСведений.пм_СоответствиеНоменклатуры КАК пм_СоответствиеНоменклатуры";
		
	ТаблицаСоответствия.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры

&НаКлиенте
Процедура Сохранить(Команда)
	СохранитьНаСервере();
	Сообщить("Мэппинг товаров успешно сохранен в базу!");
КонецПроцедуры

&НаСервере
Процедура СохранитьНаСервере()
	Набор = РегистрыСведений.пм_СоответствиеНоменклатуры.СоздатьНаборЗаписей();
	Набор.Загрузить(ТаблицаСоответствия.Выгрузить());
	Набор.Записать();
КонецПроцедуры


// ============================================================================
// БЛОК 3: ГЕНЕРАЦИЯ JSON
// ============================================================================

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

&НаСервере
Процедура СгенерироватьJSONНаСервере()
	МассивRetail = Новый Массив;
	МассивProf = Новый Массив;
	МассивMarketplace = Новый Массив;
	
	Для Каждого СтрокаТаблицы Из ДанныеДляОтправки Цикл
		ОбъектПродажи = Новый Структура;
		ОбъектПродажи.Вставить("id", Строка(СтрокаТаблицы.Документ.УникальныйИдентификатор()));
		ОбъектПродажи.Вставить("date", Формат(СтрокаТаблицы.Дата, "ДФ=dd.MM.yyyy"));
		ОбъектПродажи.Вставить("customerCrmCode", СтрокаТаблицы.КодCRM);
		ОбъектПродажи.Вставить("customerName", Строка(СтрокаТаблицы.Контрагент));
		
		// Обрати внимание: в JSON идет "goodsCode", а берем из 1С мы "КодПеноплекс"
		ОбъектПродажи.Вставить("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 = Запись.Закрыть();
КонецПроцедуры


// ============================================================================
// БЛОК 4: ОТПРАВКА НА СЕРВЕР (И ЛОГИРОВАНИЕ)
// ============================================================================

&НаКлиенте
Процедура Отправить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 = ТекущаяДата();
		НоваяЗапись.ТипДанных = "Полная выгрузка";
		НоваяЗапись.КодОтвета = КодСтатуса;
		
		Если КодСтатуса = 201 ИЛИ КодСтатуса = 200 Тогда
			НоваяЗапись.Статус = "Успешно";
			НоваяЗапись.ТекстОшибки = "Пакет данных успешно доставлен";
			ДатаПоследнегоОбмена = ТекущаяДата();
			Сообщить("УСПЕХ! Данные отправлены.");
		Иначе
			НоваяЗапись.Статус = "Ошибка сервера";
			НоваяЗапись.ТекстОшибки = Лев(ТелоОтвета, 150);
			Сообщить("Внимание! Сервер вернул ошибку. Проверьте вкладку Статус.");
		КонецЕсли;
		
	Исключение
		СтатусHTTP = "ОШИБКА СЕТИ";
		ОтветСервера = ОписаниеОшибки();
		
		НоваяЗапись = ЛогОбмена.Добавить();
		НоваяЗапись.Период1 = ТекущаяДата();
		НоваяЗапись.ТипДанных = "Полная выгрузка";
		НоваяЗапись.Статус = "Критическая ошибка";
		НоваяЗапись.ТекстОшибки = Лев(ОписаниеОшибки(), 150);
		
		Сообщить("Критическая ошибка сети! Проверьте вкладку Статус.");
	КонецПопытки;
КонецПроцедуры