|
Получение остатков из соседней базы 1с 8.3 через Http сервис | ☑ | ||
---|---|---|---|---|
0
Bambr49
13.07.17
✎
14:32
|
Добрый день,стоит задача -подключится к базе 1 через созданный в ней http сервис,получить остатки и передать их в базу 2..
Сервис создал,опубликовал...а вот что дальше ?если кто делал подобное-приведите пример или ткните кудой рыть? |
|||
1
Wirtuozzz
13.07.17
✎
14:33
|
(0) сервис работает?
|
|||
2
Bambr49
13.07.17
✎
14:37
|
да,сервис работает..
|
|||
3
Bambr49
13.07.17
✎
14:37
|
где запрос писать на остатки?как его передать?
|
|||
4
Wirtuozzz
13.07.17
✎
14:38
|
(3) начни от сюда: Обращение к веб-сервису 1С
|
|||
5
Юрий Лазаренко
13.07.17
✎
14:38
|
(2) Ну пиши в модуле сервиса код, который выгребет из БД необходимые данные, превратит их в структурированную строку (JSON, например), и отдаст в базу-потребителя.
|
|||
6
Wirtuozzz
13.07.17
✎
14:40
|
(5) а я думал, остатки должен сервис вернуть.
|
|||
7
Юрий Лазаренко
13.07.17
✎
14:41
|
(6) Ну а как он их будет возвращать? Строкой.
|
|||
8
Wirtuozzz
13.07.17
✎
14:42
|
(7) как надо так и вернет, строкой можно GUID передать или другой идентификационный реквизит.
|
|||
9
Юрий Лазаренко
13.07.17
✎
14:43
|
(8) Все правильно, я так в (5) и написал.
|
|||
10
Wirtuozzz
13.07.17
✎
14:44
|
(9) Да-да, сори, я чет подзатупил.
|
|||
11
Bambr49
13.07.17
✎
14:53
|
(4) там идет обращение через браузер,а мне нужно из одной базы
обратится к сервису другой...приведите пример кода плз, |
|||
12
Bambr49
13.07.17
✎
14:55
|
(5) запрос на нужные остатки запросто,а вот как их предавать и обрабатывать-полный тупик
|
|||
13
Wirtuozzz
13.07.17
✎
14:55
|
||||
14
Wirtuozzz
13.07.17
✎
14:55
|
||||
15
Wirtuozzz
13.07.17
✎
14:56
|
||||
16
Юрий Лазаренко
13.07.17
✎
14:56
|
(11) Нет разницы, через браузер или из базы. В базе-потребителе надо делать http-запрос через объект HTTPСоединение.Получить()
|
|||
17
Юрий Лазаренко
13.07.17
✎
14:57
|
||||
18
Bambr49
13.07.17
✎
14:59
|
да..уж..(
|
|||
19
Юрий Лазаренко
13.07.17
✎
15:00
|
(18) Что не так-то?
|
|||
20
Bambr49
13.07.17
✎
15:02
|
да нет,все так...но конкретного примера кода именно с http сервисом так и не нашел..
|
|||
21
Юрий Лазаренко
13.07.17
✎
15:10
|
(20) "HTTPСоединение.Получить()", выполненное в одной базе - это и есть запрос к http-сервису в другой базе.
|
|||
22
Bambr49
13.07.17
✎
15:12
|
(21) спасибо,попытаюсь..надеюсь получится..реализован данный механизм уже на ком соединениии и прекрасно работает,но руководство сказало переделать на http
|
|||
23
mikeA
13.07.17
✎
15:29
|
(22) Правильно сказало.
Результат можно передавть через хранилище значения в XML. Так можно использовать таблицы значений и другие типы, которые в JSON не сериализуются плюс степень сжатия. |
|||
24
Юрий Лазаренко
13.07.17
✎
15:36
|
(23) А зачем хранилище значения в XML еще конвертить? Можно просто передать его как двоичные данные.
|
|||
25
Вафель
13.07.17
✎
15:38
|
зачем вообще хранилищами обмениваться?
|
|||
26
Юрий Лазаренко
13.07.17
✎
15:42
|
(25) +100500
|
|||
27
Bambr49
13.07.17
✎
15:45
|
(26) да,не стоит этого делать
|
|||
28
mikeA
13.07.17
✎
15:48
|
(24) (25)
У меня было много данных в ТЗ и встроенные в конфигурацию процедуры взаимодействия с HTTP сервисами, в том числе не 1С, в формате JSON. Видимо чтобы между сервисами 1С передавать ТЗ через JSON без конвертации в структуры. В JSON ТЗ только так получилось впихнуть. |
|||
29
Bambr49
13.07.17
✎
15:48
|
Функция ОсновнойGET(Запрос)
Ответ = Новый HTTPСервисОтвет(200); Ответ.УстановитьТелоИзСтроки(ВернутьОстатки()); Возврат Ответ; КонецФункции Функция ВернутьОстатки() Запрос = Новый Запрос; Запрос.Текст = " "; Выборка = Запрос.Выполнить().Выбрать(); ОтветМассив = Новый Массив; Пока Выборка.Следующий() Цикл ОтветМассив.Добавить(Новый Структура("tovar,ostatok",Выборка.Ссылка.Товар,""+Выборка.Ссылка.Остаток)); КонецЦикла; Ответ = Новый ЗаписьJSON; Ответ.УстановитьСтроку(); ЗаписатьJSON(Ответ,ОтветМассив); // сериализует ОтветМассив в формат JSON Возврат Ответ.Закрыть(); КонецФункции |
|||
30
Bambr49
13.07.17
✎
15:50
|
вот пытаюсь делать каки то наметки..как обработать в базе получателе как Ответ?
|
|||
31
mikeA
13.07.17
✎
15:53
|
(29) Вот именно.
Когда таких колонок over 9000 и структура в базе источнике и приёмнике одинаковая, ОтветМассив.Добавить(Новый Структура(" начинает, мягко говоря, надоедать. Хочется просто использовать Загрузить/Выгрузить. Ну и плюс сжатие как я говорил. |
|||
32
mikeA
13.07.17
✎
15:54
|
(31) Про
Выборка.Ссылка.Товар, Выборка.Ссылка.Остаток скромно умолчу)) |
|||
33
Bambr49
13.07.17
✎
15:57
|
(32) да фиг с ней Выборка.Ссылка.Товар,тыщу раз еще запрос перепишу..как в базе приемнике обработать получить и обработать Отввет?
|
|||
34
Bambr49
13.07.17
✎
15:57
|
(33) Ответ
|
|||
35
Юрий Лазаренко
13.07.17
✎
15:58
|
(33) HTTPСоединение.Получить() вернет тебе объект HTTPОтвет, а в его теле будет лежать твой JSON.
|
|||
36
Юрий Лазаренко
13.07.17
✎
15:59
|
HTTPОтвет.ПолучитьТелоКакСтроку()
|
|||
37
Bambr49
13.07.17
✎
16:04
|
HTTP соединение еще создать нужно?каков синтаксис? если не сложно подскажите..плз
|
|||
38
Юрий Лазаренко
13.07.17
✎
16:06
|
&НаКлиенте
Процедура ВыполнитьЗапрос(Команда) ВыполнитьHTTPЗапрос("http://example.com"); КонецПроцедуры &НаКлиенте Процедура ВыполнитьHTTPЗапрос(ПолныйАдресРесурса) СтруктураURI = СтруктураURI(ПолныйАдресРесурса); HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост, СтруктураURI.Порт); HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере); Попытка Результат = 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 Тогда Сообщить("Код статуса 302, Постоянное перенаправление."); АдресРесурса = Результат.Заголовки.Получить("Location"); Если АдресРесурса <> Неопределено Тогда Сообщить("Выполняю запрос по новому адресу " + АдресРесурса); ВыполнитьHTTPЗапрос(АдресРесурса); Иначе Сообщить("Сервер не сообщил адрес ресурса!"); КонецЕсли; КонецЕсли; КонецЕсли; // Статусы 1XX и 2XX считаем хорошими Если Результат.КодСостояния < 300 Тогда Сообщить("Скорее всего все хорошо"); Сообщить("Код статуса: " + Результат.КодСостояния); КонецЕсли; КонецПроцедуры &НаКлиенте Функция СтруктураURI(Знач СтрокаURI) Экспорт СтрокаURI = СокрЛП(СтрокаURI); // схема Схема = ""; Позиция = Найти(СтрокаURI, "://"); Если Позиция > 0 Тогда Схема = НРег(Лев(СтрокаURI, Позиция - 1)); СтрокаURI = Сред(СтрокаURI, Позиция + 3); КонецЕсли; // строка соединения и путь на сервере СтрокаСоединения = СтрокаURI; ПутьНаСервере = ""; Позиция = Найти(СтрокаСоединения, "/"); Если Позиция > 0 Тогда ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1); СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1); КонецЕсли; // информация пользователя и имя сервера СтрокаАвторизации = ""; ИмяСервера = СтрокаСоединения; Позиция = Найти(СтрокаСоединения, "@"); Если Позиция > 0 Тогда СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1); ИмяСервера = Сред(СтрокаСоединения, Позиция + 1); КонецЕсли; // логин и пароль Логин = СтрокаАвторизации; Пароль = ""; Позиция = Найти(СтрокаАвторизации, ":"); Если Позиция > 0 Тогда Логин = Лев(СтрокаАвторизации, Позиция - 1); Пароль = Сред(СтрокаАвторизации, Позиция + 1); КонецЕсли; // хост и порт Хост = ИмяСервера; Порт = ""; Позиция = Найти(ИмяСервера, ":"); Если Позиция > 0 Тогда Хост = Лев(ИмяСервера, Позиция - 1); Порт = Сред(ИмяСервера, Позиция + 1); КонецЕсли; Результат = Новый Структура; Результат.Вставить("Схема", Схема); Результат.Вставить("Логин", Логин); Результат.Вставить("Пароль", Пароль); Результат.Вставить("ИмяСервера", ИмяСервера); Результат.Вставить("Хост", Хост); Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено)); Результат.Вставить("ПутьНаСервере", ПутьНаСервере); Возврат Результат; КонецФункции |
|||
39
Bambr49
13.07.17
✎
16:11
|
(38) спасибо..кажись пошел процесс..
|
|||
40
Bambr49
13.07.17
✎
16:11
|
(36) точно..ничего сложного)
|
|||
41
Bambr49
13.07.17
✎
16:12
|
(40) ну когда разберешся))
|
|||
42
Bambr49
13.07.17
✎
16:12
|
спасибо всем)
|
|||
43
Юрий Лазаренко
13.07.17
✎
16:14
|
На здоровье )
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |