Имя: Пароль:
1C
1С v8
HTTP сервис - код на стороне сайта
0 OnePrg
 
24.09.20
10:42
Дайте пожалуйста примеры использования HTTP сервисов на стороне сайта.

Например, есть кнопка, по которой вызывается HTTP сервис (GET запрос), а ниже результат из 1С (POST запрос).
1 Юрий Лазаренко
 
24.09.20
10:47
(0) Тебе нужен пример кода 1С, или кода сайта?
2 AlexTim03
 
24.09.20
10:47
НЕ в качестве рекламы, но вот неплохая статья про все это:
http://курсы-по-1с.рф/articles/2017-09-07-exchange-with-internet-services/
3 OnePrg
 
24.09.20
10:48
(1) сайта
4 Юрий Лазаренко
 
24.09.20
10:51
(3) Какой сценарий действий на сайте? Это может быть тупо <form>, которая передает в 1С значения своих полей в виде параметров, при нажатии на submit вся страница перезагружается и ее новый текст должен быть сформирован 1Ской. Или это может быть просто http-запрос в 1С, которая возвращает результат в виде строки или JSON, и потом javascript должен что-то сделать с этим результатом. В зависимости от сценария алгоритмы могут очень сильно различаться.
5 MyNick
 
24.09.20
10:56
(3) Я использую axios - компонент для js, который умеет работать с сервисами. Оч. простая штука
https://ru.vuejs.org/v2/cookbook/using-axios-to-consume-apis.html
6 OnePrg
 
24.09.20
10:56
(4) <form>, которая передает в 1С значения своих полей в виде параметров, 1С возвращает результат в виде строки или JSON, и потом javascript должен что-то сделать с этим результатом.
7 MyNick
 
24.09.20
11:00
(6) На кнопку на сайте вешаешь OnClick, которая вызывает что-то подобное к твоей 1С, возвращающей джейсон
axios
  .get('https://api.coindesk.com/v1/bpi/currentprice.json')
  .then(response => (this.info = response.data.bpi));

В response получаешь ответ от 1С и "что-то делаешь с этим результатом"
8 Юрий Лазаренко
 
24.09.20
11:13
(6) Вот так попробуй:

<form id="formElem">
  <input type="text" name="name" value="John">
  <input type="text" name="surname" value="Smith">
  <input type="submit">
</form>

<script>
  formElem.onsubmit = async (e) => {
    e.preventDefault();

    let response = await fetch('/article/formdata/post/user', {
      method: 'POST',
      body: new FormData(formElem)
    });

    let result = await response.json();

    alert(result.message);
  };
</script>
9 Kesim
 
24.09.20
11:54
(0) постман не предлагать?
10 OnePrg
 
25.09.20
10:09
Всем спасибо. Пошёл изучать.
11 polosov
 
25.09.20
10:10
(0) Совсем недавно вышла книга https://online.1c.ru/books/book/29582119/
Бегом покупать.
12 Юрий Лазаренко
 
25.09.20
10:22
(11) Не подойдет книга, ТСу необходимо помочь собрать код, который будет выполняться на сайте, а не в 1С.
13 OnePrg
 
25.09.20
15:37
(8) код в модуль вставил, input'ы и кнопка появились

прописал URL вызова HS

let response = await fetch('http://localhost/BAS/hs/My/Test', {
            method: 'POST',
            body: new FormData(formElem)

но при нажатии на кнопку точка останова не срабатывает, а когда в браузере напрямую вызываю http://localhost/BAS/hs/My/Test - срабатывает
14 OnePrg
 
25.09.20
15:56
Если без параметров, то точка останова срабатывает

let response = await fetch('http://localhost/BAS/hs/My/Test');
15 OnePrg
 
25.09.20
17:53
Решил вот так

let formData = new FormData(formElem);
let response = await fetch('http://localhost/BAS/hs/My/Test?name='+formData.get('name')+'&surname='+formData.get('surname'));
16 Юрий Лазаренко
 
25.09.20
20:04
(14) Где точка останова срабатывает? В браузере или в 1С? В (13) у тебя был POST запрос, а в браузере напрямую и в (15) GET. Может в этом дело?
17 Юрий Лазаренко
 
25.09.20
20:06
В (15) FormData лишняя, если ты потом GET-запрос собираешь из formData.get('name') и formData.get('surname'), можно было данные взять непосредственно из элементов формы. Хотя в принципе и так норм.
18 OnePrg
 
29.09.20
20:53
<form id="formElem">
    <input type="text" name="pers_acc" >
    <input type="submit">
</form>

<script>
    formElem.onsubmit = async (e) => {
        e.preventDefault();
        
        let formData = new FormData(formElem);
        let response = await fetch('http://localhost/BAS/hs/My/Test?name='+formData.get('pers_acc'));

        let result = await response.json();

        alert(result.tel);
    };
</script>


Функция TestGET(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    Запись.ЗаписатьКонецОбъекта();
    Запись.ЗаписатьИмяСвойства("tel");
    Запись.ЗаписатьЗначение("050555555");
    Запись.ЗаписатьКонецОбъекта();
    Результат = Запись.Закрыть();
    Ответ.УстановитьТелоИзСтроки(Результат);
    Ответ.Заголовки("Content-type","application/json");

    Возврат Ответ;
КонецФункции



alert(result.tel) не срабатывает. Что не так?
19 Юрий Лазаренко
 
29.09.20
20:55
(18) 1. Точка останова в 1С срабатывает?
2. В консоли браузера какие-то сообщения есть? Предположу, что там будет что-то с отвалом http-запроса из-за CORS.
20 OnePrg
 
29.09.20
21:09
21 OnePrg
 
29.09.20
21:16
22 Василий Алибабаевич
 
29.09.20
21:19
(18)
"
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
Запись.ЗаписатьКонецОбъекта();
"

А не пробовали начинать запись объекта инструкцией ЗаписатьНачалоОбъекта()?
23 Василий Алибабаевич
 
29.09.20
21:22
+ (22) Да и ошибка в 106 строке (метод SUBMIT) говорит, что серверная часть несколько впадает в ступор от того что от нее хотят.
24 OnePrg
 
29.09.20
21:24
(22) да, уже заметил, изменил, но результат тот же

Функция TestGET(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    Запись.ЗаписатьНачалоОбъекта();
    Запись.ЗаписатьИмяСвойства("tel");
    Запись.ЗаписатьЗначение("050555555");
    Запись.ЗаписатьКонецОбъекта();
    Результат = Запись.Закрыть();
    Ответ.УстановитьТелоИзСтроки(Результат);
    Ответ.Заголовки("Content-type","application/json");

    Возврат Ответ;
КонецФункции
25 OnePrg
 
29.09.20
21:25
(23) 106 это GET - с ним тоже нужно разобраться но потом, сейчас меня устраивает, что сайт передаёт данные 1С, сейчас не могу передать данные из 1С на сайт
26 Юрий Лазаренко
 
29.09.20
21:28
(21) Ошибка 500 говорит о том, что на сервере произошло что-то непредвиденное. У тебя происходит исключение в 1С.
заменить строку
let result = await response.json();
на
let result = await response;

а строку
alert(result.tel);
на
alert(result);

Есть вероятность, что там будет текст ошибки 1С.

А тк понятно, почему до alert не доходит - код останавливается на строке
let result = await response.json();
так как response не является валидным json-ом.
27 Юрий Лазаренко
 
29.09.20
21:28
+(26) * "заменить строку" читать как "Попробуй заменить строку"
28 OnePrg
 
29.09.20
21:29
29 Юрий Лазаренко
 
29.09.20
21:31
(28) Что-то в каких-то непонятных местах ошибки показывает. Обнови кэш браузера (один раз надо обновить страницу кнопками Ctrl+F5, желательно делать так каждый раз при изменении JS и CSS). И покажи еще, пишет ли что-то красным цветом на закладке console.
30 OnePrg
 
29.09.20
21:36
31 Юрий Лазаренко
 
29.09.20
21:39
(3) А если в браузере набрать http://localhost/BAS/hs/My/Test?name=123? Что пишет?
32 Василий Алибабаевич
 
29.09.20
21:39
(30) Все та же ошибка 500. Отлаживать код на стороне 1С.
33 OnePrg
 
29.09.20
21:39
34 Юрий Лазаренко
 
29.09.20
21:40
+(31) Что-то же он возвращает, не зря пишет, что там Unexpected token H
35 OnePrg
 
29.09.20
21:40
(31) {HTTPСервис.My.Модуль(13)}: Метод объекта не обнаружен (Заголовки)
36 Юрий Лазаренко
 
29.09.20
21:41
(35) Ну вот тебе и место ошибки, и описание. Как только это устранишь, все заработает.
37 OnePrg
 
29.09.20
21:43
Всем спасибо. Заработало.

<form id="formElem">
    <input type="text" name="pers_acc" >
    <input type="submit">
</form>

<script>
    formElem.onsubmit = async (e) => {
        e.preventDefault();
        
        let formData = new FormData(formElem);
        let response = await fetch('http://localhost/BAS/hs/My/Test?name='+formData.get('pers_acc'));

        let result = await response.json();

        alert(result.tel);
    };
</script>


Функция TestGET(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    Запись.ЗаписатьНачалоОбъекта();
    Запись.ЗаписатьИмяСвойства("tel");
    Запись.ЗаписатьЗначение("050555555");
    Запись.ЗаписатьКонецОбъекта();
    Результат = Запись.Закрыть();
    Ответ.УстановитьТелоИзСтроки(Результат);
    Ответ.Заголовки.Вставить("Content-type","application/json");

    Возврат Ответ;
КонецФункции
38 Юрий Лазаренко
 
29.09.20
21:44
+(36) Ответ.Заголовки.Встпавить(), а не Ответ.Заголовки()
39 Юрий Лазаренко
 
29.09.20
21:44
А, уже. Ну лан )