Имя: Пароль:
1C
1С v8
HTTP сервис и подключение к нему
0 SMakcik
 
30.05.16
15:45
Всем привет!

в конфигурации 1С я создал http сервис. Опубликовал его он видится все хорошо.

при обращении к нему авторизация проходит без проблем и в журнале регистрации это видно.

Ответ приходит пустой без каких либо ошибок.

Но в базе никаких действий не делается.

Подскажите где может крыться проблема?


Текст подключения:

Функция POSTЗапрос(ПараметрыЗапроса)
    
    
    Попытка
        //подключение к этому ПК
        Соединение = Новый HTTPСоединение("10.8.1.82", , "", "");
    Исключение
        Возврат "Ошибка при создании HTTP соединения.";
    КонецПопытки;
    
    HTTPЗапрос = Новый HTTPЗапрос("R/hs/Sales/Write");
    //HTTPЗапрос.Пара
    ПараметрЗапроса = "Date=20160530000000&TovarCod=ЦБ000045055&CharacteristicName=37&IDevision=001001001113&OrgINN=7704753941&SellingVid=ПродажаПростая&Count=1&Summa=1000&SummaWDisc=1000";
    HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрЗапроса, "windows-1251");
    
    Ответ = "";
    
    Попытка
        HTTPОтвет =     Соединение.Записать(HTTPЗапрос);//Соединение.Записать(HTTPЗапрос, Ответ);
        Ответ = HTTPОтвет.ПолучитьТелоКакСтроку();
    Исключение
        Возврат "Ошибка при соединении.";
    КонецПопытки;
    
    Возврат Ответ;
    
КонецФункции
1 Fragster
 
гуру
30.05.16
15:53
а на другой стороне что?
2 Fragster
 
гуру
30.05.16
15:53
Идут стрельбы. Дали автоматы, патроны, показали куда стрелять. Админ отстрелялся, подводят итоги. Мишень админа чистая. Командир: - ?. Админ, проверяя автомат: - С моей стороны пули вылетели. Проблемы у вас.
3 SMakcik
 
30.05.16
16:03
корневой URL: Sales
Шаблон: RegTransaction
/{Date}/{TovarCod}/{CharacteristicName}/{IDevision}/{OrgINN}/{SellingVid}/{Count}/{Summa}/{SummaWDisc}/*
Метод: Write


Функция RegTransactionWrite(Запрос)
    
    Ответ = Новый HTTPСервисОтвет(200);
    
    СтруктураПараметров = ЗаполнитьСтруктуруПоДаннымЗапроса(Запрос);
    
    Если НЕ ЗарегистироватьТранзакцию(СтруктураПараметров) Тогда
        
        Ответ = Новый HTTPСервисОтвет(400);
        
    КонецЕсли;    
    
    Возврат Ответ;
    
КонецФункции
4 SMakcik
 
30.05.16
16:04
Что тут еще может быть. Такое ощущение что он не может метод найти или параметры указываются не верно
5 SMakcik
 
30.05.16
16:16
Либо просто скажите как указывать основные параметры?
Как должна выглядеть строка соединения?
6 Fragster
 
гуру
30.05.16
16:46
Сообщить(HTTPОтвет.КодСостояния)
7 SMakcik
 
31.05.16
13:09
КодСостояния = 404
8 Fragster
 
гуру
31.05.16
14:02
потому что /Sales/Write не подходит под шаблон /{Date}/{TovarCod}/{CharacteristicName}/{IDevision}/{OrgINN}/{SellingVid}/{Count}/{Summa}/{SummaWDisc}/*
9 Fragster
 
гуру
31.05.16
14:03
надо делать
/Sales/Write/20160530000000/ЦБ000045055/....
10 4St
 
31.05.16
14:27
(3) Под такие задачи больше подходят POST-запросы, но никак не GET.
11 SMakcik
 
31.05.16
14:51
(9) но так я и пишу. С этим немного разобрался. Лишние /* были в конце шаблон.

Теперь возвращает 405 ошибку
12 SMakcik
 
31.05.16
14:53
а что значит GET и POST?
У меня стоит HTTP-метод любой
13 SMakcik
 
31.05.16
14:55
Я так понимаю что нужно версию определить HTTP 1.1
14 Fragster
 
гуру
31.05.16
14:59
(11) используй HTTPСоединение.ВызватьHTTPМетод
15 Fragster
 
гуру
31.05.16
14:59
("GET",
16 SMakcik
 
31.05.16
15:08
т.е. вот так:

Соединение.ВызватьHTTPМетод("POST", HTTPЗапрос) возвращает 405
или
Соединение.ВызватьHTTPМетод("GET", HTTPЗапрос) возвращает 404

Я правильно понимаю?
17 Fragster
 
гуру
31.05.16
15:10
(16) новую версию кода напиши
18 ДенисЧ
 
31.05.16
15:11
(16) 404 - страница не найдена, 405 - "Как челобитную царю подаёшь, смерд??"
19 SMakcik
 
31.05.16
15:15
Попытка
        Соединение = Новый HTTPСоединение("10.8.1.82", , "", "");
    Исключение
        Возврат "Ошибка при создании HTTP соединения.";
    КонецПопытки;
    
    HTTPЗапрос = Новый HTTPЗапрос(" testcopyrozntest/hs/Sales");
    ПараметрЗапроса = "20160530000000/ЦБ000045055/37/001001001113/1111111111/ПродажаПростая/1/1000/1000?IK=9997900000197";
    HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрЗапроса, "windows-1251");
    
    Ответ = "";
    
    Попытка
        HTTPОтвет =     Соединение.ВызватьHTTPМетод("GET", HTTPЗапрос);
        Ответ = HTTPОтвет.ПолучитьТелоКакСтроку();
    Исключение
        Возврат "Ошибка при соединении.";
    КонецПопытки;
20 SMakcik
 
31.05.16
15:16
(18) так это то и понятно. По сути сейчас все правильно, но...
21 SMakcik
 
31.05.16
15:28
"Имя сервиса"/"имя публикуемой базы"/hs/"корневой URL"/параметры

Строка соединения такая? я правильно понимаю

Просто еще не вижу как конечный запрос выглядет. Может слэш где-то пропустил
22 Fragster
 
гуру
31.05.16
16:21
HTTPЗапрос = Новый HTTPЗапрос(" testcopyrozntest/hs/Sales/"+ПараметрЗапроса);
установить тело из строки - в топку
23 Fragster
 
гуру
31.05.16
16:22
или даже /Sales/Write/ + ПараметрЗапроса
24 SMakcik
 
31.05.16
16:48
Не фига все также 404 ошибка.
Но вот что странно:
HTTPОтвет =     Соединение.ВызватьHTTPМетод("GET", HTTPЗапрос); дает 404 ошибку

а

HTTPОтвет =     Соединение.Записать(HTTPЗапрос);
зависает напрочь
25 SMakcik
 
31.05.16
16:57
Просто даже если выполнить в браузере то тоже ошибка. Укажу наверно явно метод GET в опреации
26 SMakcik
 
31.05.16
17:00
хотя по логике в ВызватьМетод мы явно и даем понять что используй GET
27 SMakcik
 
31.05.16
17:05
Вот так интересно. когда создается запрос, то при получении Тела оно равно Неопределено
28 Fragster
 
гуру
31.05.16
18:14
404 значит, что вызываемый адрес не найден, т.е. нет сервиса, у которого шаблон соответствует запросу
29 SMakcik
 
01.06.16
11:14
Ну как нет. Все перепроверил. Шаблон подкорректировал
30 SMakcik
 
01.06.16
11:27
Скачал Fiddler попробую попарсить
31 Diversus
 
01.06.16
11:33
Вопрос.
А можно ли при работе через HTTP-сервис избавиться от авторизации?
Грубо говоря, есть ссылка, которую хочется открывать из письма и при открытии этой ссылки из письма менять данные в базе 1С. Авторизация не нужна так как будут передаваться какие нибудь GUID-ы, которые не подобрать, да и пользователю это не нужно особо.
Кто нибудь решал подобную задачу?
32 Fragster
 
гуру
01.06.16
11:34
(31) в vrd файле поправить строку подключения, указав в ней логин и пароль
33 Diversus
 
01.06.16
11:35
(32) А без правки vrd?
34 Diversus
 
01.06.16
11:36
Хотелось бы проще как-то. И кстати интересно чего галочку не добавили в платформу. Ведь такие задачи сплошь и рядом.
35 Fragster
 
гуру
01.06.16
11:36
(33) написать проксирующий сервис
36 SMakcik
 
01.06.16
16:18
Вопрос закрыт.

Поменял названия на русские внутри самого сервиса
RegTransaction = ЗарегистрироватьПродажу
   Write       = Записать

И все.
Не знаю может какой-то глюк, может резервные слова какие-то или еще что.

Но вышел на это через создание второго тестового сервиса как обрисовано в инете. Сначала с двумя параметрами, потом с четырмя. потом девять поставил. Все работало

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

Потом тело процедуры обработки поменял. Все работало.