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

У тебя отстутствует поле data при получении данных с сервера, видимо запрос обрабатывается но нет ничего нового и сервер возвращает пустой объект
Тебе просто вставить проверку на присутствие этого поля в структуре, или что там у тебя, ОбъектJSON
18 AnDoro
 
06.09.21
08:40
(17) Прикол в том, что объект присутствует в ответе, даже если новой информации нет он будет, но пустой.
19 Смотрящий
 
06.09.21
08:44
(18) Так нормально все. Отправляется запрос, сервер его обрабатывает и возвращает КодСостояния = 200 - корректно обработанный запрос
А вот что он в этом корректном запросе вернет - данные новые или "пустое" значение это уже как получиться
20 AnDoro
 
06.09.21
08:49
(19) Проблема в том, что, когда запускаю вручную все нормально, ошибок нет(даже если пусто). А в автомате ошибка независимо от того есть новая информация или нет, как будто в фоне он не может ответ принять нормально, хоть и код 200
21 acht
 
06.09.21
08:54
(20) > хоть и код 200
Содержимое ответа сервера в случае ошибки покажи.
22 AnDoro
 
06.09.21
08:55
(21)Отладчиком можно словить фоновое задание?
23 Ёпрст
 
06.09.21
09:01
(22) можно. Разрешаю
24 Смотрящий
 
06.09.21
09:02
(22)
Результат = HTTP.Получить(Запрос);
    
Если Результат.КодСостояния = 200 Тогда
    ОтветJSON = Результат.ПолучитьТелоКакСтроку();
    ....
Иначе
    ЗаписьЖурналаРегистрации(<Параметры>); // И смотри в ЖР что он там возвращает
КонецЕсли;
25 AnDoro
 
07.09.21
06:38
(24)Оказалось из фона он все таки дает код 500
26 acht
 
07.09.21
10:19
(25) А писал бы ты код правильно, с проверкой ошибок, как тебе в (1) говорили - не было бы приступов телепатии на 4 дня.
Ну, каждый кузнец своего этого.
27 Смотрящий
 
07.09.21
10:27
(25) Победил ?
28 AnDoro
 
07.09.21
10:34
(26) С кодом все в порядке, это все еще один код. Отличия только в запуске
29 Галахад
 
гуру
07.09.21
10:36
(28) Так себе код, если честно.
30 AnDoro
 
07.09.21
10:36
(27) Неа, появилось только больше вопросов. До этого грешил в сторону прав, а теперь вообще непонятно. вручную 200 и все выполняется, автоматом 500 и {"errors":[{"title":"Some error occurred when calling the api"}]}
31 acht
 
07.09.21
10:36
(28) А ну-ну. Ты бы этот 500 мгновеннно бы увидел прочитал ответ и понял бы в чем дело.
Ну, на форуме конечно посидеть не получилось бы.
32 acht
 
07.09.21
10:37
(30) Что поставщик сервиса говорит?
33 unbred
 
07.09.21
10:37
у тебя фоновое как минимум по этой строке вывалится
Сообщить(Результат.КодСостояния);
дальше не читал даже
34 Ёпрст
 
07.09.21
10:38
(33) не, нормально там с сообщить, это жуёт в фоновом.
35 unbred
 
07.09.21
10:39
(34) у нас видимо разные фоновые.
у меня не жуёт
36 unbred
 
07.09.21
10:40
всегда оборачиваю в #Если Клиент
37 AnDoro
 
07.09.21
10:40
(32) К поставщику вопросов нет, при ручном запуске все работает. Получается, что в фоновом запрос ломается
38 acht
 
07.09.21
10:41
(37) > К поставщику вопросов нет,
Что означает ошибка "Some error occurred when calling the api", елс у тебя нет вопросов к поставщику?
39 Ёпрст
 
07.09.21
10:42
(35)  не помню уже, посмотрю на досуге, может, тоже обёрнуто в директивы.
Но вроде, сообщить было фиолетово всегда.
40 acht
 
07.09.21
10:42
(35) >  видимо разные фоновые.
Да, твои неправильные
41 acht
 
07.09.21
10:43
(39) На 8.2 разваливалось. в 8.3 работает
42 AnDoro
 
07.09.21
10:44
(38)Эта ошибка возникает при неправильном запросе. Например нет обязательных параметров или дата не верная
43 Галахад
 
гуру
07.09.21
10:46
На сервере скорее всего неразрывный пробел надо убрать.
44 Kassern
 
07.09.21
10:47
(42) прологируй свое рег задание куда нить и сверь отправленные данные с твоим ручным запуском.
45 AnDoro
 
07.09.21
10:48
(44)Сейчас попробую
46 AnDoro
 
07.09.21
10:48
(43)Не совсем понял
47 Ёпрст
 
07.09.21
10:49
Токен то хотя бы верный указываешь ?
48 AnDoro
 
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 год ?

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