Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
26 фев 2026, 21:21

пакетная выгрузка

Автор sali, 10 дек 2025, 10:27

0 Пользователей и 1 гость просматривают эту тему.

antoneus

Считать при заполнении этой структуры_auth. Есть же в ней массив товаров? Когда в нем количество = 100 - отправляем (отправку выносим в отдельную процедуру), массив очищаем, идем дальше. Не забываем после основного цикла отправить то, что в массиве осталось (т.е. надобавлялось в последнем проходе и количество у массива оказалось < 100).

sali

antoneus, то бишь
мы получаем все данные, пишем условие что если количество строк в массиве товары = 100, значит вставляем структуру и отправляем в процедуру , запоминаем количество отправленных потом их прибавлять, когда первые 100 отправились, возвращаемся и удаляем из массива 100 строк? или вы имели ввиду чтобы поставить некое ограничение , когда выгружаются данные и заполняются в структуру - достигли 100, всё, место закончилось, надо выгрузить и по новой
 что именно вы имели ввиду?


Максим75

sali, как то так


ДжисонОстатки = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(,Символы.Таб);//для красоты результирующего текста увеличиваем "лесенку"
ДжисонОстатки.ПроверятьСтруктуру = ложь;//чтобы быстрее писалось, то можно не проверять при записи правильность структуры
ДжисонОстатки.УстановитьСтроку(ПараметрыЗаписиJSON);

СтруктураОбщая = Новый Соответствие;

ВыборкаТовары = ВыборкаМагазины.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
КолвоТоваров = 0;

Попытка
//ssl = Новый ЗащищенноеСоединениеOpenSSL(
//Новый СертификатКлиентаWindows(),
//Новый СертификатыУдостоверяющихЦентровWindows());

Соединение =  Новый HTTPСоединение(АдресАВМ,443,ТокенАВМ,,,5, Новый ЗащищенноеСоединениеOpenSSL);
Исключение
//Сообщить(ОписаниеОшибки());
КонецПопытки;
        ПартияТоваров_в_Пакете = 1;
НомерПакета = 1;
Пока ВыборкаТовары.Следующий() цикл
СамТовар = ВыборкаТовары.номенклатура;
КолвоТоваров = КолвоТоваров + 1;

//Джисон = Новый ЗаписьJSON;
//ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(,Символы.Таб);//для красоты результирующего текста увеличиваем "лесенку"
//Джисон.ПроверятьСтруктуру = ложь;//чтобы быстрее писалось, то можно не проверять при записи правильность структуры
//Джисон.УстановитьСтроку(ПараметрыЗаписиJSON);
//
//СтруктураНоменклатуры = Новый Структура;
//СтруктураНоменклатуры.Вставить("group_id_client",?(ВыборкаТовары.Номенклатура=ГруппаТовары,0,ТолькоЧислаВСтрокеД(ВыборкаТовары.Номенклатура.Родитель.код)));
//
//Заголовки = Новый Соответствие();
//Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");
//

//
//Запрос = Новый HTTPЗапрос("/v2/partner/products/"+СокрЛП(ВыборкаТовары.Номенклатура.Код), Заголовки);
//
//ЗаписатьJSON(Джисон,СтруктураНоменклатуры);
//СтрокаДжисон = Джисон.Закрыть();
////иначе
//// ЗаписатьJSON(Джисон,СтруктураНоменклатуры);
//// СтрокаДжисон = Джисон.Закрыть();
////КонецЕсли;
//
//Запрос.УстановитьТелоИзСтроки(СтрокаДжисон, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
//
//HTTPОтвет = Соединение.Записать(Запрос);
//
//ОтветСтрока = HTTPОтвет.ПолучитьТелоКакСтроку();
//Если HTTPОтвет.КодСостояния=200 тогда
// // СтрТовара.Выгружен = Истина;
//иначе
// Сообщить("Изменить товар с кодом "+СокрЛП(ВыборкаТовары.Номенклатура.Код)+"  не получилось");
//КонецЕсли;
////Сообщить("Товар  "+СамТовар);

// Если номМагазин > 2 тогда прервать; конецЕсли;
//СамМагазин = ВыборкаМагазины.Магазин;
СамОстаток = ВыборкаТовары.КонОстаток;
СамаЦена = ВыборкаТовары.Цена;
//ГУИДМагазина = СамМагазин.УникальныйИдентификатор();


СтруктураОстатков = Новый Структура;
СтруктураОстатков.Вставить("branch_id",Строка(ГУИДМагазина));
СтруктураОстатков.Вставить("art_id",СокрЛП(СамТовар.Код));
СтруктураОстатков.Вставить("price",СамаЦена);
СтруктураОстатков.Вставить("in_stock",True);

СтруктураОбщая.Вставить(Строка(ГУИДМагазина)+"."+СокрЛП(СамТовар.Код),СтруктураОстатков);


//Сообщить(" "+"Магазин  "+СамМагазин+"  остаток  "+СамОстаток+"  цена реализации  "+СамаЦена);
// номМагазин = номМагазин + 1;
Если ПартияТоваров_в_Пакете=21 тогда
ЗаписатьJSON(ДжисонОстатки,СтруктураОбщая);
СтрокаДжисонОстатки = ДжисонОстатки.Закрыть(); 

ЗаголовкиОстатки = Новый Соответствие();
//ЗаголовкиОстатки.Вставить("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
//ЗаголовкиОстатки.Вставить("Content-Type", "application/json; charset=UTF-8");
ЗаголовкиОстатки.Вставить("Content-Type", "application/json");

//возврат;

ЗапросОстатки = Новый HTTPЗапрос("/v2/partner/products/warehouse", ЗаголовкиОстатки);
ЗапросОстатки.УстановитьТелоИзСтроки(СтрокаДжисонОстатки, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

HTTPОтветОстатки = Соединение.ОтправитьДляОбработки(ЗапросОстатки);

ОтветСтрокаОстатки = HTTPОтветОстатки.ПолучитьТелоКакСтроку();
Если HTTPОтветОстатки.КодСостояния=201 тогда
// СтрТовара.Выгружен = Истина;
// Сообщить("Выгрузили остатки по магазину "+СокрЛП(СамМагазин)+" в пакете "+НомерПакета+"  кол-во товаров  "+КолвоТоваров);
иначе
Сообщить("Не получилось выгрузить остатки по магазину "+СокрЛП(СамМагазин));
КонецЕсли;
ПартияТоваров_в_Пакете = 1;
КолвоТоваров = 0;
НомерПакета = НомерПакета + 1;

ДжисонОстатки = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(,Символы.Таб);//для красоты результирующего текста увеличиваем "лесенку"
ДжисонОстатки.ПроверятьСтруктуру = ложь;//чтобы быстрее писалось, то можно не проверять при записи правильность структуры
ДжисонОстатки.УстановитьСтроку(ПараметрыЗаписиJSON);

СтруктураОбщая = Новый Соответствие;
Иначе
ПартияТоваров_в_Пакете = ПартияТоваров_в_Пакете+1;
КолвоТоваров = КолвоТоваров + 1;
КонецЕсли;

КонецЦикла;
//остаток не попавших в ПартияТоваров_в_Пакете
Если ПартияТоваров_в_Пакете>1 тогда
ЗаписатьJSON(ДжисонОстатки,СтруктураОбщая);
СтрокаДжисонОстатки = ДжисонОстатки.Закрыть(); 

ЗаголовкиОстатки = Новый Соответствие();
//ЗаголовкиОстатки.Вставить("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
//ЗаголовкиОстатки.Вставить("Content-Type", "application/json; charset=UTF-8");
ЗаголовкиОстатки.Вставить("Content-Type", "application/json");

//возврат;

ЗапросОстатки = Новый HTTPЗапрос("/v2/partner/products/warehouse", ЗаголовкиОстатки);
ЗапросОстатки.УстановитьТелоИзСтроки(СтрокаДжисонОстатки, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

HTTPОтветОстатки = Соединение.ОтправитьДляОбработки(ЗапросОстатки);

ОтветСтрокаОстатки = HTTPОтветОстатки.ПолучитьТелоКакСтроку();
Если HTTPОтветОстатки.КодСостояния=201 тогда
// СтрТовара.Выгружен = Истина;
// Сообщить("Выгрузили остатки по магазину "+СокрЛП(СамМагазин)+" в пакете "+НомерПакета+"  кол-во товаров  "+КолвоТоваров);
иначе
Сообщить("Не получилось выгрузить остатки по магазину "+СокрЛП(СамМагазин));
КонецЕсли;
КонецЕсли;

остатки в какой-то очередной срм выгружаю, именно пакетами, по 21 товару в пакете, иначе сам срм не принимает.

посмотрите, под себя исправьте.

sali

Максим75, окей. спасибо

sali

у меня получилось вывести так, но есть нюанс с меньшим количеством , чем 100. то есть, у нас 783 записи, выгружаем по 100 , последние 83 записи не выгрузятся. как их отработать?
НомерПозиции = 0;
КолвоТоваров = 100;         
Пакет = 1;
ПартияТоваров_в_Пакете = новый массив;
Для каждого строка из Данные_goods Цикл   
ПартияТоваров_в_Пакете.Добавить(строка);
Если НомерПозиции = КолвоТоваров Тогда 
Данные_general = Новый Структура;
Данные_general.Вставить("method", "goods");
Данные_general.Вставить("deviceID", deviceID);
Данные_general.Вставить("goods", ПартияТоваров_в_Пакете);
Данные_general.Вставить("goodsGroups", Данные_goodsGroups);   

Структура_auth.Вставить("general", Данные_general);

ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина); 
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, Структура_auth);
СтрокаJS = ЗаписьJSON.Закрыть(); // Данные Номенклатура
Сообщить("Выгрузка " + Пакет + " пакета Номенклатуры");   
ОтправитьВЭДО(СтрокаJS);
Сообщить("Выгрузка " + Пакет + " пакета Номенклатуры Завершена"); 

НомерПозиции = НомерПозиции + 1;
КолвоТоваров = КолвоТоваров + 100;
Пакет = Пакет + 1;
ПартияТоваров_в_Пакете.Очистить();
иначе
НомерПозиции = НомерПозиции + 1;
КонецЕсли; 
КонецЕсли;
КонецЦикла;                                                                                   


или просто вставить условие и всю логику еще раз? и будет тогда
НомерПозиции = 0;
КолвоТоваров = 100;         
Пакет = 1;
ПартияТоваров_в_Пакете = новый массив;
Для каждого строка из Данные_goods Цикл   
ПартияТоваров_в_Пакете.Добавить(строка);
Если НомерПозиции = КолвоТоваров Тогда 
Данные_general = Новый Структура;
Данные_general.Вставить("method", "goods");
Данные_general.Вставить("deviceID", deviceID);
Данные_general.Вставить("goods", ПартияТоваров_в_Пакете);
Данные_general.Вставить("goodsGroups", Данные_goodsGroups);   

Структура_auth.Вставить("general", Данные_general);

ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина); 
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, Структура_auth);
СтрокаJS = ЗаписьJSON.Закрыть(); // Данные Номенклатура
Сообщить("Выгрузка " + Пакет + " пакета Номенклатуры");   
ОтправитьВЭДО(СтрокаJS);
Сообщить("Выгрузка " + Пакет + " пакета Номенклатуры Завершена"); 

НомерПозиции = НомерПозиции + 1;
КолвоТоваров = КолвоТоваров + 100;
Пакет = Пакет + 1;
ПартияТоваров_в_Пакете.Очистить();
ИначеЕсли (Данные_goods.Количество() - КолвоТоваров) < 100 Тогда
ПартияТоваров_в_Пакете.Добавить(строка);
Если НомерПозиции = (Данные_goods.Количество() - КолвоТоваров) Тогда 
Данные_general = Новый Структура;
Данные_general.Вставить("method", "goods");
Данные_general.Вставить("deviceID", deviceID);
Данные_general.Вставить("goods", ПартияТоваров_в_Пакете);
Данные_general.Вставить("goodsGroups", Данные_goodsGroups);   

Структура_auth.Вставить("general", Данные_general);

ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина); 
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, Структура_auth);
СтрокаJS = ЗаписьJSON.Закрыть(); // Данные Номенклатура
Сообщить("Выгрузка " + Пакет + " пакета Номенклатуры");   
ОтправитьВЭДО(СтрокаJS);
Сообщить("Выгрузка " + Пакет + " пакета Номенклатуры Завершена"); 

НомерПозиции = НомерПозиции + 1;
КолвоТоваров = КолвоТоваров + 100;
Пакет = Пакет + 1;
ПартияТоваров_в_Пакете.Очистить(); 
иначе
НомерПозиции = НомерПозиции + 1;
КонецЕсли; 
КонецЕсли;
КонецЦикла;                         

antoneus

Ну буквально же об этом написал. Да, поэтому весь код формирования структуры-записи-отправки выносим в отдельную процедуру, чтобы, если изменится логика, править ее в одном месте, а не в двух. А в цикле просто добавляем товары в массив и смотрим сколько в массиве элементов.

Для каждого строка из Данные_goods Цикл   
    ПартияТоваров_в_Пакете.Добавить(строка);
    Если ПартияТоваров_в_Пакете.Количество() = КолвоТоваров Тогда
        ФормируемИОтправляем(ПартияТоваров_в_Пакете);
        ПартияТоваров_в_Пакете.Очистить()
    КонецЕсли;
КонецЦикла;
Если ПартияТоваров_в_Пакете.Количество() <> 0 Тогда
    ФормируемИОтправляем(ПартияТоваров_в_Пакете)
КонецЕсли;

sali

Цитата: antoneus от 11 дек 2025, 13:00Если ПартияТоваров_в_Пакете.Количество() <> 0 Тогда     ФормируемИОтправляем(ПартияТоваров_в_Пакете) КонецЕсли;
а для чего эта проверка ? ПартияТоваров_в_пакете  это ведь новый пустой массив

antoneus

Это новый пустой массив, если ПартияТоваров_в_Пакете.Количество() = КолвоТоваров. А если ПартияТоваров_в_Пакете.Количество() < КолвоТоваров, то это старый непустой массив.

sali

antoneus,аааа все понял , это как раз на случай если данных меньше 100..круто , спасибо за помощь :zebzdr:  :ooifh:

sali

странно получается, всего позиций - 676 , а выгрузилось 534...

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск