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