Имя: Пароль:
1C
1С v8
1c 8 организация api
0 Gera1t
 
11.12.23
09:06
Здравствуйте!
Помогите пожалуйста советом.
Задача такая:
Есть 1с УНФ.
Есть самописная программа с web интерфейсом, не знаю на каком языке написанная.
В самописной программе создают заказы, потом обрабатывают их там же, в процессе обработки изменяется состояние заказа.
Нужно из самописной программы выгружать данные в 1С.
Изначально реализовали это через файлы, самописная программы выгружает файлы в формате json при создании заказа, 1С мониторит каталог и раз в минуту загружает заказы из файлов.

Сейчас требуется отказаться от обмена через файл и перейти на обмен через api.

Самым логичным было бы что бы на стороне самописной программы подняли api и 1С так же по расписанию забирала от туда данные.
НО в самописной программе не хотят писать api и предлагают такой вариант:
api будет в 1С.
когда заказ создан, программа стучиться через http и передает параметры как в http сервисе и заказ создается.
Подскажите пожалуйста реально ли такое реализовать? Сколько параметров можно передавать через запрос на http сервис?
Или если этот вариант бред сумашедшего подскажите как лучше реализовать эту задачу?
1 Табуретко
 
11.12.23
09:09
(0) по com не предлагать?
2 Волшебник
 
11.12.23
09:12
да, реально.
Любой объём данных
3 Gera1t
 
11.12.23
09:12
(1) я думал com устаревшее решение и сейчас не используется
4 Gera1t
 
11.12.23
09:13
(2) спасибо!
5 Кир Пластелинин
 
11.12.23
09:13
(0) а что собственно смущает?
6 Fedor-1971
 
11.12.23
09:16
(5) Как я понимаю, смущают вопросы авторизации на стороне 1С
7 Fedor-1971
 
11.12.23
09:18
6+ решения различные, как через токен так и через передачу данных авторизации в параметрах HTTP запроса
8 Кир Пластелинин
 
11.12.23
09:20
(6) хм. мб не проснулся еще, но ни слова не увидел про авторизацию в стартовом сообщений
9 Gera1t
 
11.12.23
09:20
я думаю сделать это через http-сервис.
Создать отдельного пользователя для этой цели.
В http запрос передаются параметры с методом, например create  , документ создается и записывается в реестр созданных.
10 Gera1t
 
11.12.23
09:22
параметров должно быть всего 4 или 5.
Главный вопрос был в том, что нужно через http запрос передавать несколько параметров.
Делал всегда только с 1 параметром и думал, что больше 1 передать нельзя
11 Fedor-1971
 
11.12.23
09:24
(10) в теле запроса отправь JSON = файловому
на стороне 1С обработай и тебе без гемора и сможешь легко переключаться в вариантах файл/HTTP-сервис
12 Кир Пластелинин
 
11.12.23
09:26
(9) да совсем не обязательно передавать параметры с методом. вот прям в лоб http-сервис на стороне 1с с постовым методом и именем, например, orders. в теле передавать в json или массив заказов, или данные конкретного заказа. более интересным будет вопрос - если на стороне 1с заказ не будет создан, то каким образом обрабатывать данную ситуацию? можно возвращать после загрузки в ответе http-код ошибки, можно возвращать guid`ы загруженных заказов (или незагруженных). тут многое зависит от возможностей отправляющей стороны. и вариантов можно целую кучку накидать
13 Gera1t
 
11.12.23
09:27
(11) т.е. просто в запросе например: Create?json=jsonfile
где jsonfile это запрос?
14 Fedor-1971
 
11.12.23
09:34
(8) Это один из первых вопросов при работе внешних систем с 1С
1. Разработка и реализация протокола обмена (типа у ТС уже есть, осталось его пропихнуть через API)
2. Наступаем на грабли авторизации - принимаем решение как построим, через временный токен (например, на сеанс и передачей его в параметр HTTP сервиса, по факту адрес обработчика будет разный для каждого сеанса), либо передаём шифрованную base64 пару Пользователь Пароль в autorisation (тут лучше пошарить по инету как корректно пройти авторизацию БД 1С)
15 Fedor-1971
 
11.12.23
09:35
(13) Ща, найду пример
16 Кир Пластелинин
 
11.12.23
09:37
(14) ну а на сколько в данном случае эта внешняя система является "внешней"? если она живет в том же контуре, то к чему эти усложнения на данном этапе?
17 Fedor-1971
 
11.12.23
09:43
Вот, примерно так:
{
"ТипИнформации":"ОтправкаПлатПорученийБух1С8", //что делаем
"УНП_Организация_ДО":"Значение", //это проверка, что тебе прислали заявки для твоей конторы
"Документы":
[
{
  "УИД_Заявка_ДО":"Значение",  //тут тебе передадут ИД заявки для поиска в 1С, т.е. если облажались и переотправят ты тупо найдёшь существующую заявки и поправишь оную
  "ДатаПлатежа": Значение,
  "НомерЗаявки": Значение,
   // остальные параметры для создания заявки
},
  ..... //следующая заявка
]
}

Результат загрузки в бухгалтерию:
{
"ТипИнформации":"ЗагруженыПлатПорученияБух1С8",
"Документы":
[
{"УИД_Заявка_ДО":"Значение",
  "Статус":"Значение", // например Создан, Обновлен, Отклонен
  "Информация":"Значение" // тут прочая информация о загрузке
},
  .....
]
}
18 Fedor-1971
 
11.12.23
09:52
Отправка из 1С выглядит так:
инфОписание = новый ЗаписьJSON;
инфОписание.УстановитьСтроку();
            инфОписание.ЗаписатьНачалоОбъекта();
                инфОписание.ЗаписатьИмяСвойства("ТипИнформации");
инфОписание.ЗаписатьЗначение("ОтправкаПлатПорученийБух1С8");
                инфОписание.ЗаписатьИмяСвойства("УНП_Организация");
инфОписание.ЗаписатьЗначение(СокрЛП(параметрыСоединения.ИНН));
                
//тут просто формируем JSON по протоколу обмена                ЗаполнитьДокументыДляЗапроса(инфОписание, парПроверка);

инфОписание.ЗаписатьКонецОбъекта();

стрJSON = инфОписание.Закрыть(); // готова информация
            
HTTPСоединение = Новый HTTPСоединение(параметрыСоединения.ПутьБД, , параметрыСоединения.Логин, параметрыСоединения.Пароль, , , , );
ЗапросHTTP = Новый HTTPЗапрос("InsertPlat"); //вот это название опубликованного HTTP сервиса
            ЗапросHTTP.Заголовки.Вставить("Content-type", "application/json; charset=utf-8");
ЗапросHTTP.УстановитьТелоИзСтроки(стрJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
            
Ответ = HTTPСоединение.ОтправитьДляОбработки(ЗапросHTTP);

текстОтв = Ответ.ПолучитьТелоКакСтроку("UTF-8");
            
Если Ответ.КодСостояния = 200 тогда
     ЧтениеJSON = Новый ЧтениеJSON;
     ЧтениеJSON.УстановитьСтроку(текстОтв);
     СоставОтвета =  ПрочитатьJSON(ЧтениеJSON);
     ЧтениеJSON.Закрыть();
                
     локОтвет = ПоказатьСостояниеДокументов(СоставОтвета); //разбираешь что тебе ответили
                
Иначе
      Сообщить(текстОтв); //послали НА или В - таки ошибки авторизации или ещё что не слава Богу
КонецЕсли;
19 Fedor-1971
 
11.12.23
09:54
18+ есть возможность импорта из структуры или массива (пошарь за модуль работы с ВЕБ для 1С)
20 Valdis2007
 
11.12.23
09:56
(0) "Или если этот вариант бред сумашедшего подскажите как лучше реализовать эту задачу?"...Если делать по "взрослому", с подтверждениями, и гарантией доставки, то через ESB
21 Fedor-1971
 
11.12.23
10:00
Приём на стороне 1С:
    Сообщение = Запрос.ПолучитьТелоКакСтроку("UTF-8");

    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Сообщение);
    СоставЗапроса = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
//    Прочитали тело запроса

    Ответ = Новый HTTPСервисОтвет(200);
    Если СоставЗапроса["ТипИнформации"] = Неопределено ИЛИ
         СоставЗапроса["Документы"] = Неопределено ИЛИ
          СоставЗапроса["УНП_Организация"] = Неопределено тогда
        
        Ответ.КодСостояния = 400;
        Ответ.УстановитьТелоИзСтроки("Ошибка формата запроса данных");
        
    Иначе
        Если НЕ СоставЗапроса["ТипИнформации"] = "ОтправкаПлатПорученийБух1С8" тогда
            
            Ответ.КодСостояния = 405;
            Ответ.УстановитьТелоИзСтроки("Запрошенный метод не поддерживается");
            
        Иначе
// тут прошли минимальные проверки состава запроса
текстРезультата = игсОбменИнформациейДО.СоздатьППизДО("нов", СокрЛП(СоставЗапроса["УНП_Организация"]), СоставЗапроса["Документы"], Ответ.КодСостояния);
            
// тут уже обработали твои заявки и отправляем результат обратно            Ответ.УстановитьТелоИзСтроки(текстРезультата);
        КонецЕсли;
    КонецЕсли;
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
    Ответ.Заголовки = Заголовки;
    
    Возврат Ответ;
22 Fedor-1971
 
11.12.23
10:02
(16) Да без разницы, рядом установлена или на другом конце света, вопрос авторизации решать придётся
23 Gera1t
 
11.12.23
10:02
Большое спасибо!
24 Fedor-1971
 
11.12.23
10:11
(23) На здоровье.
Чисто для информации: если канал связи не очень, то порешай вопрос небольших порций информации в обмене (например, не более 10 заказов или чего там)
25 Lazy Stranger
 
11.12.23
12:37
Из сообщения в (0) непонятно зачем, собственно отказываться от существующего файлового обмена? Программисту, конечно, не вредно потренироваться в изучении всего перечисленного, а вот в чем радость заказчику от переделки того что и так работает, хоть и через устаревшие технологии?
26 Gera1t
 
11.12.23
16:51
(25) Самописной программой с web интерфейсом занимается сторонний разработчик, инициатива идет от него.
А мне просто интересно разобраться в чем то новом
27 Звездец
 
11.12.23
16:52
(26) ну так пусть напишет ТЗ. По ТЗ проще разбираться
28 Звездец
 
11.12.23
16:55
а так если обмен достаточно простой, то есть odata, и может удастся ничего не дописывать
Закон Брукера: Даже маленькая практика стоит большой теории.