Имя: Пароль:
1C
1C 7.7
v7: Вопросе по работе с Web ДТО 10
0 brenli
 
06.12.19
09:18
Всем добра.
Курю вопросы связанные с отправкой запросов на Web.
1) Как лучше отправлять запросы - синхронно или асинхронно?
2) Подскажите как получать ответы сервера в формате json? Нужно после запроса POST делать запрос GET ? Далее send() и через какое свойство или метод посмотреть результат?  
Метод XMLHttpRequest.responseText - возвращает HTML код, а мне нужно статусы и
возвращаемые ошибки если они есть.
-->В случае успешного добавления задания в очередь сервер вернет статус 201 (Created).

-->Также могут вернуться следующие ошибки:

-->400 (Bad Request) - ошибка формата запроса (обязательные поля не найдены, больше одной фискальной операции в задании, не удалось разобрать json)
-->409 (Conflict) - задание с таким uuid уже есть в БД
Как получить эти коды без html?
3) Для чего нужен uid при отправке запросов?
1 Garykom
 
гуру
06.12.19
09:23
(0) Мануал прочитай уже https://integration.atol.ru/api/#web-server
2 Garykom
 
гуру
06.12.19
09:25
И погугли
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
3 Garykom
 
гуру
06.12.19
09:26
Ну и мелочи для JSON

//======================================================================
Процедура ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, ТипДанных)
    ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));    
    НомерЗначения = 0;
    
    Пока ТекстJSON <> "" Цикл
        ПервыйСимвол = Лев(ТекстJSON, 1);
        Если ПервыйСимвол = "{" Тогда
            Значение = СоздатьОбъект("СписокЗначений");
            ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
            Если ТипДанных = "Структура" Тогда
                Результат.Установить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
                НомерЗначения = НомерЗначения + 1;
            ИначеЕсли ТипДанных = "Массив" Тогда
                Результат.ДобавитьЗначение(Значение);
            КонецЕсли;
        ИначеЕсли ПервыйСимвол = "[" Тогда
            Значение = СоздатьОбъект("СписокЗначений");
            ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
            
            Если ТипДанных = "Структура" Тогда
                Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
                НомерЗначения = НомерЗначения + 1;
            Иначе
                Результат.Добавить(Значение);
            КонецЕсли;
        ИначеЕсли (ПервыйСимвол = "}") И (ТипДанных = "Структура") Тогда
            ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            Если Лев(ТекстJSON, 1) = "," Тогда
                ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            КонецЕсли;
            
            Возврат;
        ИначеЕсли (ПервыйСимвол = "]") И (ТипДанных = "Массив") Тогда
            ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            Если Лев(ТекстJSON, 1) = "," Тогда
                ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            КонецЕсли;
            
            Возврат;
        Иначе
            Если ТипДанных = "Структура" Тогда
                
                Поз = Найти(ТекстJSON, ":");
                Если Поз = 0 Тогда
                    Прервать;
                КонецЕсли;
                
                ИмяЗначения = СокрЛП(Лев(ТекстJSON, Поз-1));
                
                ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз+1));
                
                Если Лев(ТекстJSON, 1) = "{" Тогда
                    Значение = СоздатьОбъект("СписокЗначений");
                    ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
                ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
                    Значение = СоздатьОбъект("СписокЗначений");
                    ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
                Иначе
                    Поз = 0;
                    Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
                        Символ = Сред(ТекстJSON, Сч, 1);
                        Если (Символ = ",") ИЛИ (Символ = "]") ИЛИ (Символ = "}") Тогда
                            Поз = Сч;
                            Прервать;
                        КонецЕсли;
                    КонецЦикла;
                    
                    Если Поз = 0 Тогда
                        Значение = ТекстJSON;
                        ТекстJSON = "";
                    Иначе
                        Значение = Лев(ТекстJSON, Поз-1);
                        ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
                    КонецЕсли;
                    
                    Значение = СокрЛП(Значение);
                КонецЕсли;
                
                Результат.Установить(ИмяЗначения, Значение);
            ИначеЕсли ТипДанных = "Массив" Тогда
                Поз = 0;
                Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
                    Символ = Сред(ТекстJSON, Сч, 1);
                    Если (Символ = ",") ИЛИ (Символ = "]") ИЛИ (Символ = "}") Тогда
                        Поз = Сч;
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
                
                Если Поз = 0 Тогда
                    Значение = ТекстJSON;
                    ТекстJSON = "";
                Иначе
                    Значение = Лев(ТекстJSON, Поз-1);
                    ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
                КонецЕсли;
                
                Значение = СокрЛП(Значение);
                
                Результат.Добавить(Значение);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

//======================================================================
Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON)
    Результат = СоздатьОбъект("СписокЗначений");
    
    ТекстJSON = СтрЗаменить(ТекстJSON, "\""", """");
    ТекстJSON = СтрЗаменить(ТекстJSON, """", "");    
    Если Лев(ТекстJSON, 1) = "{" Тогда
        ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, "Структура");
    ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
        МассивДанных = СоздатьОбъект("СписокЗначений");
        ЗаполнитьДанныеИзОтветаJSON(МассивДанных, ТекстJSON, "Массив");
        
        Результат.Вставить("Значение", МассивДанных);
    КонецЕсли;
        
    Возврат Результат;
КонецФункции
4 brenli
 
06.12.19
09:29
(2) Я использую XMLHTTP это имеет значение?
5 Garykom
 
гуру
06.12.19
09:30
(4) Он более глючный, его плюс только что XML умеет, но сервер же JSON хочет поэтому используй лучше WinHttp.WinHttpRequest
6 Garykom
 
гуру
06.12.19
09:33
3) чтобы узнать статус выполнения задания зная uuid, поэтому и нужны уникальные они для заданий
7 Garykom
 
гуру
06.12.19
09:35
8 brenli
 
06.12.19
09:35
Garykom Спасибо
9 brenli
 
06.12.19
14:05
Сейчас пытаюсь выполнить задание открытие - закрытие кассовой смены
возвращается код - 201 (успех), но ФР не печатает.
Кто сталкивался с такой проблемой?
Вчера все работало. Я полагаю что сервер принимает запрос , но запрос невыполняется.
Как это отследить?
10 Garykom
 
гуру
06.12.19
14:47
(9) Запрос статус задания по uuid тому же сделай
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший