Загрузка данных
&НаКлиенте
Процедура Загрузить(Команда)
Если Период.ДатаНачала = '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);
Сообщить("Критическая ошибка сети! Проверьте вкладку Статус.");
КонецПопытки;
КонецПроцедуры