Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Регламентное задание автоматически срабатывает с ошибками, а вручную без

Регламентное задание автоматически срабатывает с ошибками, а вручную без
Я
   AnDoro
 
03.09.21 - 13:36
Процедура по получению инфы с сайты по средствам html запроса. Работает, находится в общем модуле(Конфа для цен и учета остатков, поэтому разлочена и не обновляется (УТ для Казахстана(Тот же самый УТ))). Если регламентное задание, запустить вручную, все работает заказы создаются, но автоматом кидает ошибку:
Object field not found (data)
{ОбщийМодуль.KaspiAPIЗапуск.Модуль(48)}:    Для Каждого Значение Из ОбъектJSON.data Цикл

Хотя этот объект, при отладке имеется, в случае, когда информации (новых заказов) нет, объект есть, но пустой.

&НаСервере
Процедура Запуск() Экспорт

    
    ТекДата = ТекущаяДата();
    
    ИсхДата = Дата(1970, 1, 1);
    
    ДатаВМил = (ТекДата - ИсхДата) * 1000;
    
    ДатаВМилСтрока = СтрЗаменить(Строка(ДатаВМил), " ", "");
    
    ДатаВмилНачало = ДатаВМил - 600 * 1000 * 100;
    
    ДатаВМилНачалоСтрока = СтрЗаменить(Строка(ДатаВмилНачало), " ", "");
    
    
    
    
    ЗаголовокЗапроса = Новый Соответствие();
    ЗаголовокЗапроса.Вставить("Content-Type", "application/vnd.api+json");
    //ЗаголовокЗапроса.Вставить("Accept", "application/json");
    ЗаголовокЗапроса.Вставить("X-Auth-Token", "Не покажу)");
    HTTP = Новый HTTPСоединение("kaspi.kz",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
    Запрос = Новый HTTPЗапрос("/shop/api/v2/orders?page[number]=0&page[size]=20&filter[orders][state]=NEW&filter[orders][creationDate][$ge]=" + ДатаВМилНачалоСтрока + "&filter[orders][creationDate][$le]=" + ДатаВМилСтрока + "&filter[orders][status]=APPROVED_BY_BANK&include[orders]=user", ЗаголовокЗапроса);
    
                                                                                                                                                                                                                                                                  
    
    Результат = HTTP.Получить(Запрос);
    
    Сообщить(Результат.КодСостояния);
    
    
    ОтветJSON = Результат.ПолучитьТелоКакСтроку();
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ОтветJSON);
    ОбъектJSON = ПрочитатьJSON(ЧтениеJSON);
                                  
    ЧтениеJSON.Закрыть();
    
    Для Каждого Значение Из ОбъектJSON.data Цикл
        
            
        ЗапросСост = Новый HTTPЗапрос("/shop/api/v2/orders/"+ Значение.id +"/entries", ЗаголовокЗапроса);
        РезСост = HTTP.Получить(ЗапросСост);
        ОтветСост = РезСост.ПолучитьТелоКакСтроку();
        
        
        
        ЧтениеJSONСост = Новый ЧтениеJSON;
        ЧтениеJSONСост.УстановитьСтроку(ОтветСост);
            ОбъектСост = ПрочитатьJSON(ЧтениеJSONСост);
            
        ЧтениеJSONСост.Закрыть();

        
        ЗапросСклад = Новый HTTPЗапрос("/shop/api/v2/orderentries/"+ ОбъектСост.data[0].id +"/deliveryPointOfService", ЗаголовокЗапроса);
        РезСклад = HTTP.Получить(ЗапросСклад);
        ОтветСклад = РезСклад.ПолучитьТелоКакСтроку();
        

        ЧтениеJSONСклад = Новый ЧтениеJSON;
        ЧтениеJSONСклад.УстановитьСтроку(ОтветСклад);
            ОбъектСклад = ПрочитатьJSON(ЧтениеJSONСклад);
            
        ЧтениеJSONСклад.Закрыть();

        Склад = ОбъектСклад.data.attributes.displayName;
        
        
        ЗапросТовар = Новый HTTPЗапрос("/shop/api/v2/orderentries/"+ ОбъектСост.data[0].id +"/product", ЗаголовокЗапроса);
        РезТовар = HTTP.Получить(ЗапросТовар);
        ОтветТовар = РезТовар.ПолучитьТелоКакСтроку();
        
        //Сообщить(ОтветТовар);

        ЧтениеJSONТовар = Новый ЧтениеJSON;
        ЧтениеJSONТовар.УстановитьСтроку(ОтветТовар);
            ОбъектТовар = ПрочитатьJSON(ЧтениеJSONТовар);
            
        ЧтениеJSONТовар.Закрыть();
            
        
        /////////////////////////
        ЗапросАртикул = Новый HTTPЗапрос("/shop/api/v2/masterproducts/"+ ОбъектТовар.data.id +"/merchantProduct", ЗаголовокЗапроса);
        РезАртикул = HTTP.Получить(ЗапросАртикул);
        ОтветАртикул = РезАртикул.ПолучитьТелоКакСтроку();
        
        //Сообщить(ОтветАртикул);

        ЧтениеJSONАртикул = Новый ЧтениеJSON;
        ЧтениеJSONАртикул.УстановитьСтроку(ОтветАртикул);
            ОбъектАртикул = ПрочитатьJSON(ЧтениеJSONАртикул);
            
        ЧтениеJSONАртикул.Закрыть();
        
        //Значение.attributes.customer.lastName
        
        Наименование = Значение.attributes.customer.firstName + " " + Значение.attributes.customer.lastName;
        
        
        Количество = ОбъектСост.data[0].attributes.quantity;
        Итого  = ОбъектСост.data[0].attributes.totalPrice;
        Цена = ОбъектСост.data[0].attributes.basePrice;
        Наим = ОбъектАртикул.data.attributes.name;
        Попытка
        Адрес = Значение.attributes.deliveryAddress.formattedAddress;
        Исключение
        Адрес = "";
        КонецПопытки;

        Номер = Значение.attributes.customer.cellPhone;
        Ид = Значение.attributes.code;
        
        СозданныеЗаказы  = СоздатьЗаказы(Наименование, Номер, Адрес, Наим, Цена, Итого, Количество, Склад, Ид);
        
        
        КонецЦикла;
    
    КонецПроцедуры
   acht
 
1 - 03.09.21 - 13:44
Во-первых, надо перед тем, как бросаться разбирать JSON таки проверить код возврата и убедится, что тот сервер не валяется с ошибкой 500 или не пытается показать тебе 404.
А во-вторых, регламентное выполняется на сервере под пользователем ОС кластера и назначенным пользователем 1С, а ручной запуск скорей всего - у тебя локально и под тобой.
   AnDoro
 
2 - 03.09.21 - 13:47
(1) Json Возвращает 200, тут все ок. А вот с сервером хороший довод, а как с этим бороться?
   acht
 
3 - 03.09.21 - 13:57
(2) > как с этим бороться?
Ээээ, яростно?
   AnDoro
 
4 - 03.09.21 - 14:00
(3)То, что яростно то понятно ;) Имею ввиду, как заставить регламентное выполнятся автоматом на сервере?
   acht
 
5 - 03.09.21 - 14:07
(4) УТ для Казахстана, оно ж УФ...
А как ты вручную запускаешь?
   AnDoro
 
6 - 03.09.21 - 14:11
(5) Через Админ. -> Обслуживание -> Регл. и фон. задания
   sTOd
 
7 - 03.09.21 - 14:14
(6) А в ручную запускаешь под тем же пользователем что и в регламентном задании указан?
   AnDoro
 
8 - 03.09.21 - 14:16
(7) Даже и нее знал, что там можно пользователя указать
   sTOd
 
9 - 03.09.21 - 14:16
И про пользователя ОС тебе правильно сказали. Ты явно с полными правами запускаешь, а вот в фоне права могут быть ограничены.
   Кир Пластелинин
 
10 - 03.09.21 - 14:41
(9) фоновые задание без пользователя запускаются под defuser`ом, которому назначается роль/роли из свойства самой конфы "Основные роли". в типовых там указаны зачастую роли с полными правами
   AnDoro
 
11 - 03.09.21 - 16:26
(10) В итоге как мне присвоить права defuser'у или изменить пользователя?
   Кир Пластелинин
 
12 - 03.09.21 - 16:59
(11) для начала надо либо отсечь, либо подтвердить ошибку по 1с-ным правам. проверить настройку журнала регистрации, что бы он регистрировал до уровня "информация" емнп. Если этот уровень не регистрировался, то потребуется автоматический запуск задания для фиксации события. после этого смотрим в ЖР события "Доступ" -> "Отказ в доступе".
   AnDoro
 
13 - 06.09.21 - 06:41
(12)Пользователь "Неопределен", а про уровень "информация" емнп не совсем понял
   sTOd
 
14 - 06.09.21 - 06:50
(8) Ну вы тут все крутые, так что пойду я своими делами заниматься. Нафиг эту благотворительность! Сами разберётесь.
   AnDoro
 
15 - 06.09.21 - 08:00
(9)Так как расширить эти права?
   AnDoro
 
16 - 06.09.21 - 08:18
Поменял пользователя на себя, осталось все по прежнему
   Смотрящий
 
17 - 06.09.21 - 08:21
Object field not found (data)
{ОбщийМодуль.KaspiAPIЗапуск.Модуль(48)}:    Для Каждого Значение Из ОбъектJSON.data Цикл

У тебя отстутствует поле data при получении данных с сервера, видимо запрос обрабатывается но нет ничего нового и сервер возвращает пустой объект
Тебе просто вставить проверку на присутствие этого поля в структуре, или что там у тебя, ОбъектJSON
   AnDoro
 
18 - 06.09.21 - 08:40
(17) Прикол в том, что объект присутствует в ответе, даже если новой информации нет он будет, но пустой.
   Смотрящий
 
19 - 06.09.21 - 08:44
(18) Так нормально все. Отправляется запрос, сервер его обрабатывает и возвращает КодСостояния = 200 - корректно обработанный запрос
А вот что он в этом корректном запросе вернет - данные новые или "пустое" значение это уже как получиться
   AnDoro
 
20 - 06.09.21 - 08:49
(19) Проблема в том, что, когда запускаю вручную все нормально, ошибок нет(даже если пусто). А в автомате ошибка независимо от того есть новая информация или нет, как будто в фоне он не может ответ принять нормально, хоть и код 200
   acht
 
21 - 06.09.21 - 08:54
(20) > хоть и код 200
Содержимое ответа сервера в случае ошибки покажи.
   AnDoro
 
22 - 06.09.21 - 08:55
(21)Отладчиком можно словить фоновое задание?
   Ёпрст
 
23 - 06.09.21 - 09:01
(22) можно. Разрешаю
   Смотрящий
 
24 - 06.09.21 - 09:02
(22)
Результат = HTTP.Получить(Запрос);
    
Если Результат.КодСостояния = 200 Тогда
    ОтветJSON = Результат.ПолучитьТелоКакСтроку();
    ....
Иначе
    ЗаписьЖурналаРегистрации(<Параметры>);// И смотри в ЖР что он там возвращает

КонецЕсли;
   AnDoro
 
25 - 07.09.21 - 06:38
(24)Оказалось из фона он все таки дает код 500
   acht
 
26 - 07.09.21 - 10:19
(25) А писал бы ты код правильно, с проверкой ошибок, как тебе в (1) говорили - не было бы приступов телепатии на 4 дня.
Ну, каждый кузнец своего этого.
   Смотрящий
 
27 - 07.09.21 - 10:27
(25) Победил ?
   AnDoro
 
28 - 07.09.21 - 10:34
(26) С кодом все в порядке, это все еще один код. Отличия только в запуске
   Галахад
 
29 - 07.09.21 - 10:36
(28) Так себе код, если честно.
   AnDoro
 
30 - 07.09.21 - 10:36
(27) Неа, появилось только больше вопросов. До этого грешил в сторону прав, а теперь вообще непонятно. вручную 200 и все выполняется, автоматом 500 и {"errors":[{"title":"Some error occurred when calling the api"}]}
 
 
   acht
 
31 - 07.09.21 - 10:36
(28) А ну-ну. Ты бы этот 500 мгновеннно бы увидел прочитал ответ и понял бы в чем дело.
Ну, на форуме конечно посидеть не получилось бы.
   acht
 
32 - 07.09.21 - 10:37
(30) Что поставщик сервиса говорит?
   unbred
 
33 - 07.09.21 - 10:37
у тебя фоновое как минимум по этой строке вывалится 
Сообщить(Результат.КодСостояния);
дальше не читал даже
   Ёпрст
 
34 - 07.09.21 - 10:38
(33) не, нормально там с сообщить, это жуёт в фоновом.
   unbred
 
35 - 07.09.21 - 10:39
(34) у нас видимо разные фоновые.
у меня не жуёт
   unbred
 
36 - 07.09.21 - 10:40
всегда оборачиваю в #Если Клиент
   AnDoro
 
37 - 07.09.21 - 10:40
(32) К поставщику вопросов нет, при ручном запуске все работает. Получается, что в фоновом запрос ломается
   acht
 
38 - 07.09.21 - 10:41
(37) > К поставщику вопросов нет,
Что означает ошибка "Some error occurred when calling the api", елс у тебя нет вопросов к поставщику?
   Ёпрст
 
39 - 07.09.21 - 10:42
(35)  не помню уже, посмотрю на досуге, может, тоже обёрнуто в директивы.
Но вроде, сообщить было фиолетово всегда.
   acht
 
40 - 07.09.21 - 10:42
(35) >  видимо разные фоновые.
Да, твои неправильные
   acht
 
41 - 07.09.21 - 10:43
(39) На 8.2 разваливалось. в 8.3 работает
   AnDoro
 
42 - 07.09.21 - 10:44
(38)Эта ошибка возникает при неправильном запросе. Например нет обязательных параметров или дата не верная
   Галахад
 
43 - 07.09.21 - 10:46
На сервере скорее всего неразрывный пробел надо убрать.
   Kassern
 
44 - 07.09.21 - 10:47
(42) прологируй свое рег задание куда нить и сверь отправленные данные с твоим ручным запуском.
   AnDoro
 
45 - 07.09.21 - 10:48
(44)Сейчас попробую
   AnDoro
 
46 - 07.09.21 - 10:48
(43)Не совсем понял
   Ёпрст
 
47 - 07.09.21 - 10:49
Токен то хотя бы верный указываешь ?
   AnDoro
 
48 - 07.09.21 - 10:49
(47)Да
   Ёпрст
 
49 - 07.09.21 - 10:50
Вот это Г
 ДатаВМилНачалоСтрока = СтрЗаменить(Строка(ДатаВмилНачало), " ", "");

замени на формат(хрень, "ЧГ=")
   Галахад
 
50 - 07.09.21 - 10:52
   Ёпрст
 
51 - 07.09.21 - 10:53
и Дату в миллисекунды..нахрена 1970 год ?

Есть НачалоДня функция, если что.
   AnDoro
 
52 - 07.09.21 - 10:55
(51) Unix Timestamp
   Kassern
 
53 - 07.09.21 - 10:57
(50) ну или просто СтрЗаменить(СтрокаСНеразрывнымПробелом,Символы.НПП,"");
   Галахад
 
54 - 07.09.21 - 10:58
(53) Больше интересно почему на клиенте работало.
   acht
 
55 - 07.09.21 - 11:01
(53) XMLСтрока
   Kassern
 
56 - 07.09.21 - 11:03
(54) чудес не бывает. Если текст запроса будет совпадать полностью, а ответ сервера нет, то тогда проблема скорее всего в правах. Какая кстати версия платформы?
   Kassern
 
57 - 07.09.21 - 11:04
(55) тоже как вариант
   AnDoro
 
58 - 07.09.21 - 11:04
(56)8.3.17.1549
   AnDoro
 
59 - 07.09.21 - 11:34
(49) Cудя по всему помогло
   Ёпрст
 
60 - 07.09.21 - 11:35
 
 
   AnDoro
 
61 - 07.09.21 - 11:39
(60)Неплохой вариант
   AnDoro
 
62 - 07.09.21 - 11:41
Теперь вопрос офтопик. Из инфы из этого запроса создаются заказы, но с ними что-то не так 1Ска не хочет закрывать эти заказы, якобы ожидается оплата
   Kassern
 
63 - 07.09.21 - 11:53
(62) наверное не из инфы запроса, а все таки из ответа сервера? А то что 1ска не хочет их закрывать, значит не все условия закрытия выполнены. Создай отдельную ветку.
   Ненавижу 1С
 
64 - 07.09.21 - 11:55
(62) Как запрограммировали - так и работает. Смотрите порядок расчетов и график оплаты.
   AnDoro
 
65 - 07.09.21 - 11:55
(63)Да, из ответа сервера
   Смотрящий
 
66 - 07.09.21 - 12:19
(62) А ы поступленпии денег стоит заказ ?
   AnDoro
 
67 - 07.09.21 - 13:09
(66)Да
   AnDoro
 
68 - 08.09.21 - 09:00
Всем участвовавшим огромное спасибо!)


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.