Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
16 Ноя 2018, 08:35
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Постраничная отправка номенклатуры из 1с в инет-магазин  (Прочитано 200 раз)

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

Оффлайн kadomsky

  • *
  • Сообщений: 2
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2018-09-18
  • Сайт: 
  • Профессия: Программист 8.1
Написал процедурку с парой функций по отправке всей номенклатуры чохом на сервер для дальнейшей там обработке.
Все работает. Сначала вся номенклатура сбрасывается в файл 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();
Возврат "";
КонецФункции

Последний раз редактировалось: MuI_I_Ika; 18 Сен 2018, 12:22


Оффлайн wise

  • *****
  • Сообщений: 709
  • РЕПУТАЦИЯ: 97
  • КПД: 14%
  • Кто сгорел, того не подожжешь
  • Регистрация: 2013-03-21
  • Сайт: 
  • Профессия: Ученик 1С
(0) количество элементов номенклатуры:
{
ВЫБРАТЬ
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.Ссылка) КАК КолВоЭлементов
ИЗ
   Справочник.Номенклатура КАК Номенклатура
}
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

Оффлайн kadomsky

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

Оффлайн wise

  • *****
  • Сообщений: 709
  • РЕПУТАЦИЯ: 97
  • КПД: 14%
  • Кто сгорел, того не подожжешь
  • Регистрация: 2013-03-21
  • Сайт: 
  • Профессия: Ученик 1С
(2) выгрузите НЕСКОЛЬКО файлов...
пусть функция СохранитьНаменклатуру возвращает Массив (Ваших постраничных) файлов...
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

Оффлайн AIFrame

  • *****
  • Сообщений: 1193
  • РЕПУТАЦИЯ: 153
  • КПД: 13%
  • Регистрация: 2015-07-22
  • Сайт: 
Не проще XML серверу скормить?


 


* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

oleg-x
63 Сообщений
AIFrame AIFrame
58 Сообщений
wise wise
55 Сообщений
alexandr_ll
46 Сообщений
Геннадий ОбьГЭС Геннадий ОбьГЭС
46 Сообщений
alex0402
44 Сообщений
BuhRust
30 Сообщений
LexaK
26 Сообщений
andron81_81
24 Сообщений
byte777
21 Сообщений

* Кто онлайн

  • Точка Гостей: 404
  • Точка Скрытых: 0
  • Точка Пользователей: 17
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal