Имя: Пароль:
1C
1С v8
Получение остатков из соседней базы 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
На здоровье )