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

Постраничная отправка номенклатуры из 1с в инет-магазин

Автор kadomsky, 18 сен 2018, 12:21

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

kadomsky

Написал процедурку с парой функций по отправке всей номенклатуры чохом на сервер для дальнейшей там обработке.
Все работает. Сначала вся номенклатура сбрасывается в файл json, потом отправляется.
Проблема в том что товаров слишком много и сервер, на котором стоит интернет магазин выдает 500-ю ошибку.
Настройки php и htaccess уде на пределе который ограничен провайдером и тут резервов нет.
Остается отправлять все 15000 наименований постранично. Но у используемой функции не нашел возможность указать LIMIT XX, XX
а выгребать для каждой странички из 200 товаров все 15 тысяч и считывать очередные 200 как то неправильно по моему.
Подскажите, как сделать мою выборку постраничной и как предварительно узнать общее число товарных позиций что б рассчитать страницы?
&НаКлиенте

Процедура Итог(Команда)
//Каталог = КаталогВременныхФайлов();
Каталог = "D:\temp\";
ФайлНаменклатуры = Каталог + "Номенклатура.json";
ИмяФайлаРезультата = Каталог + "Post.txt";
Сообщить("Записываем в файл наменклатуру");
Наменклатура = Сохранитьнаменклатуру(ФайлНаменклатуры);
Сообщить("Отправляем наменклатуру на сервер... ДОЛГО Ждите..");
ВыполнитьHTTPЗапрос("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", ФайлНаменклатуры, ИмяФайлаРезультата);

КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьHTTPЗапрос(ПолныйАдресРесурса, ФайлНаменклатуры, ИмяФайлаРезультата)
СтруктураURI = СтруктураURI(ПолныйАдресРесурса);
ssl1 = Новый ЗащищенноеСоединениеOpenSSL(
    Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Авто),
    Новый СертификатыУдостоверяющихЦентровWindows());
HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост,СтруктураURI.Порт,,,,,ssl1);

HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере);
// ЗаголовокHTTP = ФормируемЗаголовокPOSTзапроса(ФайлНаменклатуры);

HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");
    HTTPЗапрос.Заголовки.Вставить("x-authorization", "xxxxxxxxxxxxxxxxxxxxxxxxx");
Файл = Новый ЧтениеТекста(ФайлНаменклатуры, КодировкаТекста.UTF8);
СтрокаJSON = Файл.Прочитать();
Файл.Закрыть();

HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Попытка
// Результат =  HTTPСоединение.Получить(HTTPЗапрос);
Результат = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Исключение
// исключение здесь говорит о том, что запрос не дошел до HTTP-Сервера
Сообщить("Произошла сетевая ошибка!");
ВызватьИсключение;
    КонецПопытки;

// Анализируем фатальные ошибки
// В большинстве случаев нужно остановить работу и показать пользователю сообщение об ошибке,
// включив в него HTTP-статус

// Ошибки 4XX говорят о неправильном запросе - в широком смысле
// Может быть неправильный адрес, ошибка аутентификации, плохой формат запроса
// Подробнее смотри http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4
Если Результат.КодСостояния >= 400 и Результат.КодСостояния < 500  Тогда
    Сообщить("Код статуса больше 4XX, ошибка запроса.  Код статуса: " + Результат.КодСостояния);
КонецЕсли;

// Ошибки 5XX говорят о проблемах на сервере (возможно, прокси-сервер)
// Это может быть программная ошибка, нехватка памяти, ошибка конфигурации и т.д.
// Подробнее смотри http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5
Если Результат.КодСостояния >= 500 и Результат.КодСостояния < 600  Тогда
    Сообщить("Код статуса больше 5XX, ошибка сервера. Код статуса: " + Результат.КодСостояния);
КонецЕсли;

// Обрабатываем перенаправление
Если Результат.КодСостояния >= 300 и Результат.КодСостояния < 400  Тогда
    Сообщить("Код статуса больше 3XX, Перенаправление. Код статуса: " + Результат.КодСостояния);
// Если Результат.КодСостояния = 302 Тогда
  Сообщить("Код статуса "+Результат.КодСостояния+", Постоянное перенаправление.");
  АдресРесурса = Результат.Заголовки.Получить("Location");
  Если АдресРесурса <> Неопределено Тогда
  Сообщить("Выполняю запрос по новому адресу " + АдресРесурса);
  //  ВыполнитьHTTPЗапрос(АдресРесурса, ФайлНаменклатуры, ИмяФайлаРезультата);
  Иначе
  Сообщить("Сервер не сообщил адрес ресурса!");
  КонецЕсли;
// КонецЕсли;
КонецЕсли;
// Статусы 1XX и 2XX считаем хорошими
Если Результат.КодСостояния < 300 Тогда
       Сообщить("Соединение протестировано. Скорее всего все хорошо");
   Сообщить("Код статуса: " + Результат.КодСостояния);
   Сообщить("Результат: " + Результат.ПолучитьТелоКакСтроку("UTF-8"));
   
   Текст = Новый ЗаписьТекста;
   Текст.Открыть(ИмяФайлаРезультата, КодировкаТекста.UTF8);
   Текст.Записать(Результат.ПолучитьТелоКакСтроку("UTF-8"));
   Текст.Закрыть();

     КонецЕсли;
Попытка
//    УдалитьФайлы(ФайлНаменклатуры);
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;
Попытка
//   УдалитьФайлы(ИмяФайлаРезультата);
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;   
КонецПроцедуры

  &НаКлиенте
Функция СтруктураURI(Знач СтрокаURI) Экспорт

СтрокаURI = СокрЛП(СтрокаURI); // то же что и trim php

// схема
Схема = "";
Позиция = Найти(СтрокаURI, "://");
Если Позиция > 0 Тогда
Схема = НРег(Лев(СтрокаURI, Позиция - 1));
СтрокаURI = Сред(СтрокаURI, Позиция + 3);
КонецЕсли;

// строка соединения и путь на сервере
СтрокаСоединения = СтрокаURI;
ПутьНаСервере = "";
Позиция = Найти(СтрокаСоединения, "/");
Если Позиция > 0 Тогда
ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
КонецЕсли;

// информация пользователя и имя сервера
СтрокаАвторизации = "";
ИмяСервера = СтрокаСоединения;
Позиция = Найти(СтрокаСоединения, "@");
Если Позиция > 0 Тогда
СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
КонецЕсли;

// логин и пароль
Логин = СтрокаАвторизации;
Пароль = "";
Позиция = Найти(СтрокаАвторизации, ":");
Если Позиция > 0 Тогда
Логин = Лев(СтрокаАвторизации, Позиция - 1);
Пароль = Сред(СтрокаАвторизации, Позиция + 1);
КонецЕсли;

// хост и порт
Хост = ИмяСервера;
Порт = "";
Позиция = Найти(ИмяСервера, ":");
Если Позиция > 0 Тогда
Хост = Лев(ИмяСервера, Позиция - 1);
Порт = Сред(ИмяСервера, Позиция + 1);
КонецЕсли;

Результат = Новый Структура;
Результат.Вставить("Схема", Схема);
Результат.Вставить("Логин", Логин);
Результат.Вставить("Пароль", Пароль);
Результат.Вставить("ИмяСервера", ИмяСервера);
Результат.Вставить("Хост", Хост);
Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
Результат.Вставить("ПутьНаСервере", ПутьНаСервере);

Возврат Результат;

КонецФункции

Функция СохранитьНаменклатуру(ФайлНаменклатуры)
NewXDTOSerializer  = XDTOSerializer;
NewJSONWriter = New JSONWriter();
NewJSONWriter.OpenFile(ФайлНаменклатуры, "UTF-8");

NewJSONWriter.WriteStartObject();
NewJSONWriter.WritePropertyName("СправочникНоменклатура");
NewJSONWriter.WriteStartArray();

Selection = Catalogs.Номенклатура.Select();

While Selection.Next() Do
NomenclatureObject = Selection.GetObject();

NewJSONWriter.WriteStartObject();

NewJSONWriter.WritePropertyName("Номенклатура");
NewXDTOSerializer.WriteJSON(NewJSONWriter, NomenclatureObject, XMLTypeAssignment.Implicit);

NewJSONWriter.WriteEndObject();
EndDo;

NewJSONWriter.WriteEndArray();
NewJSONWriter.WriteEndObject();
NewJSONWriter.Close();
Возврат "";
КонецФункции


wise

(0) количество элементов номенклатуры:
{
ВЫБРАТЬ
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.Ссылка) КАК КолВоЭлементов
ИЗ
   Справочник.Номенклатура КАК Номенклатура
}
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

kadomsky

Цитата: wise от 18 сен 2018, 14:01
(0) количество элементов номенклатуры:
{
ВЫБРАТЬ
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.Ссылка) КАК КолВоЭлементов
ИЗ
   Справочник.Номенклатура КАК Номенклатура
}
Сохранил, спасибо.
Теперь число страниц смогу расчитать.
Как бы теперь селект делать от номера x (по порядку в выборке) - следующие y позиций?

wise

(2) выгрузите НЕСКОЛЬКО файлов...
пусть функция СохранитьНаменклатуру возвращает Массив (Ваших постраничных) файлов...
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

AIFrame


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

Рейтинг@Mail.ru

Поиск