Имя: Пароль:
1C
 
Логирование SOAP веб-сервиса на стороне 1С
,
0 anchar007
 
06.08.19
14:29
Всем привет!
В 1С приходят запросы от внешних источников на создание каких-нибудь документов.
Подскажите какие-нибудь оптимальные способы логирования всех водящих запросов и желательно ответов от 1С
1 rsv
 
06.08.19
14:31
(0) если копнуть в сторону логов веб сервера ?Там
Должно быть все
2 palsergeich
 
06.08.19
14:31
(0) делай на стороне 1с не веб сервис, а http, тогда ты сможешь сохранять все запросы, в том числе и не валидные.
SOAP это частный случай http.
Фабрика уже есть, проблем быть не должно
3 rsv
 
06.08.19
14:34
+(1)  текстовики как бы есть . Нужен доступ и парсинг
4 anchar007
 
06.08.19
14:37
(2) имею дело с уже готовым веб-сервисом. Пытаюсь понять как получить входящий xdto и сохранить хотя бы в xml
5 palsergeich
 
06.08.19
14:38
Если надо вообще всё, тогда (1) , если то что прошло авторизацию, то достаточно (2)
ИМХО в (2) реализация попроще чем (1)
6 palsergeich
 
06.08.19
14:38
(4) через Записьxml
7 anchar007
 
06.08.19
14:39
(1) сервер на линуксе, хочется более доступных логов
8 palsergeich
 
06.08.19
14:39
(4) но есть тонкий ньюанс, если сообщение невалидно, то до модуля webсервиса ты не дойдешь и отлуп будет дан раньше и в логах этого не будет
9 anchar007
 
06.08.19
14:41
(6) загвоздка в том что именно записывать?
Пробовал сделать так:

ПакетXDTO = ФабрикаXDTO.Пакеты.Получить("http://client.ibc.ru/DocumentSet";);
    
    ИмяФайла = ПолучитьИмяВременногоФайла("XML");
        
    МойXML = Новый ЗаписьXML;
    
    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
    
    МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML);
    
    МойXML.ЗаписатьОбъявлениеXML();
    
    ФабрикаXDTO.ЗаписатьXML(МойXML, ПакетXDTO.КорневыеСвойства);
    
    МойXML.Закрыть();
10 anchar007
 
06.08.19
14:42
но ПакетXDTO не сохраняется в XML
11 Cyberhawk
 
06.08.19
14:44
На стороне 1С как поставщика веб-сервиса никак не залогируешь
12 AquaMan
 
06.08.19
14:50
(0) Регистр сведений отдельный самое простое.
13 anchar007
 
06.08.19
14:58
(12) во входных данных может быть очень много информации. Например по счету клиенту помимо реквизитов Организация, Контрагент, Договор, СуммаДокумента еще и табличная часть передаётся. А строк в табличной части может быть очень много. Как это всё в регистр сведений записать, чтоб еще и наглядно было?

Я планирую в XML файлах сохранять, чтобы в будущем можно было использовать какие-нибудь сервисы для анализа логов
14 AquaMan
 
06.08.19
15:02
(13) Строка неограниченной длинны, туда Json или Xml, все работает - проблем нет. Если отдельно, то лучше в текстовый файл, его потом скормить ELK, но это оверинженирг в данном случае, скорее всего.
15 anchar007
 
06.08.19
15:05
(14) тогда опять же как получить все входящие параметры одним пакетом и записать в JSON или XML?
16 nicxxx
 
06.08.19
15:06
(14) ХранилищеЗначения будет компактней
17 anchar007
 
06.08.19
15:07
(13) Можно конечно брать и каждое значение по отдельности записывать в XML в цикле. Тогда для каждой функции веб-сервиса будет своя функция сохранения логов. Это же жесть
18 AquaMan
 
06.08.19
15:22
(16) Строковые удобнее анализировать.
(17) Функция сохранения одна, которая вызывается из каждого сервиса с разными параметрами, параметры для сохранения в виде структуры передаешь, например.
19 Вафель
 
06.08.19
15:23
лучше в отдельную базу, чтоб не засорять
20 anchar007
 
06.08.19
16:42
(18) Спасибо! Сделал почти так, но всё-таки в отдельные xml файлы. Моя проблема была в том, что я думал, что можно ко всем входным параметрам обратиться как к какой-то одной структуре и её целиком записать в xml. Но всё-таки нужно записывать каждый входной параметр в xml отдельно.

Мое решение, может кому пригодится:

В функции веб-сервиса создаю массив входных переменных:

Функция CreateDocument(DocumentSet,ID,DocumentObjects)
    
    МассивВходныхПараметров = Новый Массив;
    МассивВходныхПараметров.Добавить(DocumentSet);
    МассивВходныхПараметров.Добавить(ID);
    МассивВходныхПараметров.Добавить(DocumentObjects);

    ЗаписатьСтруктуруПараметров(МассивВходныхПараметров);

КонецФункции

Функция записи лога входных данных:

Функция ЗаписатьСтруктуруПараметров(ВходящиеПараметры)
    
    ИмяФайла = ПолучитьИмяВременногоФайла("XML");
    ЗаписьXML = Новый ЗаписьXML;
    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
    ЗаписьXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML);
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    ЗаписьXML.ЗаписатьНачалоЭлемента("Root");
    
    Для каждого элемент из ВходящиеПараметры Цикл
        
        ЗаписьXML.ЗаписатьНачалоЭлемента("Parametr");
        Если ТипЗнч(элемент) = ТИП("ОбъектXDTO") Тогда
            ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, элемент);
        Иначе
            ЗаписатьXML(ЗаписьXML, элемент, НазначениеТипаXML.Явное);
        КонецЕсли;
        ЗаписьXML.ЗаписатьКонецЭлемента();
        
    КонецЦикла;
    
    ЗаписьXML.ЗаписатьКонецЭлемента();    
    ЗаписьXML.Закрыть();
        
КонецФункции
2 + 2 = 3.9999999999999999999999999999999...