|
Сервер 1С формирует XML файл, есть рандомный шанс что этот файл будет с неизвест. кодировк | ☑ | ||
---|---|---|---|---|
0
RitterBruder
22.04.20
✎
08:02
|
Всем привет.
В течении месяца пытаюсь понять как такое может быть. Дано: Сервер 1С 8.3.15.1830 В конфигурации развернут веб-сервис. При обращении к этому веб-сервису, он типовой обработкой ВыгрузкаЗагрузкаДанныхXML выгружает все измененные данные по единственному плану обмена в XML файл, в кодировке UTF-8, далее содержимое этого XML файла передается в ответ веб-сервиса. Проблема: Рандомно, в результате выполнения действий из дано, результирующий XML файл может оказаться в неизвестной этому миру кодировке. Эту кодировку не определяет ни один текстовый редактор/браузер/конвертер. При этом файл настолько не понятный, что сам веб-сервис не может корректно отправить этот текст запрашивающему и валится с ошибкой: Фатальная ошибка: Opening and ending tag mismatch: unknownOperation line 3 and h1 : Ошибка разбора XML: - [3,69] Фатальная ошибка: Opening and ending tag mismatch: unknownOperation line 3 and h1 Файл становиться невозможно распознать после завершения клиентского сеанса веб сервиса. Вопрос: Как такое может быть, при создании XML файла явно задается кодировка UTF-8. Пробовал заходить от USRV1CV8 и формировать файл раз в минуту обработкой от клиента, такой проблемы нет. У меня уже дошло до шизы и я начинаю думать, что нечто, рандомно, после записи файла на диск именно от службы сервера 1С подменяет этот файл. Либо в момент выполнения сеанса вебсервиса, именно в этом контексте появляет какаято чудо кодировка UTF-8 которую никто не может понять после завершения этого сеанса. |
|||
1
RitterBruder
22.04.20
✎
08:04
|
Пример файла в неизвестной этому миру кодировке
https://drive.google.com/open?id=1hJhtthkL1cHYIz4FRJr8lXHI--ABdzfb |
|||
2
NorthWind
22.04.20
✎
08:09
|
(1) это не xml файл и не кодировка, это просто мусор. Случайные данные.
А вы его в какой момент подлавливаете в таком виде - сразу после формирования XML файла или после того как он был принят на клиенте с сервиса? |
|||
3
NorthWind
22.04.20
✎
08:13
|
скорее всего это либо косяк платформы, либо проблемы с ОС/троянами/аппаратным обеспечением, которые портят файловую систему, записывают туда случайные данные. Нужно точно понять, в какой момент данные уродуются, и танцевать от этого.
|
|||
4
Комрад1
22.04.20
✎
08:16
|
(0) В потолке открылся люк - ты не бойся, это глюк. Платформы. Их там много таких.
|
|||
5
RitterBruder
22.04.20
✎
08:20
|
(2) Это файл сформированный обработкой из сеанса вебсервиса, именно этот файл читается ЧтениемТекста и отправляется в результат вебсервиса.
Только вот на момент чтения он читается корректно, то есть я даже не могу понять что я верну, этот мусор, или нормальные данные. Что интересно, таких серверов 8, изолированных друг от друга, с таким же функционалом точь в точь, и такая проблема только на 2 из 8. Сейчас возникла идея, если я при выполнении вебсервиса еще могу понять корректно эти данные (но не могу сказать поймут ли их другие), то попробую их записать в какой нибудь справочник и посмотреть будут ли они читаться не из сеанса вебсервиса. Как сделаю обязательно отпишусь. |
|||
6
Lex_Liven
22.04.20
✎
08:23
|
Есть подозрение, что у тебя веб-сервис отваливается во время формирования файла.
Может быть, он пишет для себя временный файл, а по завершении должен конвертировать его в XML, но не успевает. |
|||
7
RitterBruder
22.04.20
✎
12:10
|
Накидал справочник с логами, дождался ошибки. Понятней не стало, происходит чудо не иначе.
Привожу текст функции с моими комментариями вызываемой веб-сервисом, она примитивна: Функция GetChangedDataForDiaspar(MessageNumber = Неопределено) Экспорт ОбработкаВыгрузки = Обработки.ВыгрузкаЗагрузкаДанныхXML.Создать(); ОбработкаВыгрузки.Инициализация(); ОбработкаВыгрузки.ОбработанныхКонстант = 0; ОбработкаВыгрузки.ОбработанныхНаборовЗаписей = 0; Узел = ПланыОбмена.Диаспар.НайтиПоКоду("Диаспар"); MessageNumber = Узел.НомерОтправленного; ВыборкаИзмененных = ПланыОбмена.ВыбратьИзменения(Узел, MessageNumber); Об = Узел.ПолучитьОбъект(); Об.НомерОтправленного = Об.НомерОтправленного + 1; Об.Записать(); Пока ВыборкаИзмененных.Следующий() Цикл ТекОбъект = ВыборкаИзмененных.Получить(); Если НЕ обЗначениеНеЗаполнено(ТекОбъект) Тогда ТекСтрока = ОбработкаВыгрузки.ДополнительныеОбъектыДляВыгрузки.Добавить(); ТекСтрока.Объект = ТекОбъект.Ссылка; ТекСтрока.ИмяОбъектаДляЗапроса = "Документ." + СокрЛП(ТекСтрока.Объект.Метаданные().Имя); КонецЕсли; КонецЦикла; Если ОбработкаВыгрузки.ДополнительныеОбъектыДляВыгрузки.Количество() = 0 Тогда Возврат "no data"; КонецЕсли; КаталогОбмена = КаталогВременныхФайлов(); Путь = КаталогОбмена + "DiasparChangedData - " + Формат(ТекущаяДата(), "ДФ='dd.MM.yyyy HH_mm_ss'") + " (" + Строка(Новый УникальныйИдентификатор) + ").xml"; ОбработкаВыгрузки.ВыполнитьВыгрузку(Путь); // XML ФАЙЛ СФОРМИРОВАН ТИПОВОЙ ОБРАБОТКОЙ И ЛЕЖИТ НА ДИСКЕ ЧтениеТекста = Новый ЧтениеТекста; ЧтениеТекста.Открыть(Путь); Данные = ЧтениеТекста.Прочитать(); // ПРОЧИТАЛИ НАШ XML ФАЙЛ, ПРОЧТЕННЫЙ ТЕКСТ КОРРЕКТЕН НА ЭТОТ МОМЕНТ НовыйЭлементЛога = Справочники.РС_ТестОшибкиВебсервиса_Временно.СоздатьЭлемент(); НовыйЭлементЛога.ТочнаяДата = ТекущаяДата(); НовыйЭлементЛога.ПутьСозданногоФайла = Путь; НовыйЭлементЛога.ДанныеXML_Строка = Данные; НовыйЭлементЛога.ДанныеXML_Хранилище = Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(9)); НовыйЭлементЛога.Записать(); // ЗАПИСАЛИ ДАННЫЕ В ЛОГ, В ЛОГЕ ТОЖЕ ВСЕГДА КОРРЕКТНЫЕ ДАННЫЕ Возврат Данные; // А ТЕПЕРЬ ОТДАЛИ В РЕЗУЛЬТАТ ВЕБСЕРВИСА НАШИ ПРОЧТЕННЫЕ ДАННЫЕ, КОТОРЫЕ МЫ КОРРЕКТНО РАСПОЗНАЕМ В ТЕКУЩЕМ СЕАНСЕ // НО, ДАННЫЕ МОГУТ ОКАЗАТЬСЯ МУСОРОМ, КОТОРЫЙ САМ ВЕБСЕРВИС ПЕРЕДАТЬ НЕ МОЖЕТ И ВАЛИТСЯ С ОШИБКОЙ // НО КАК, ЕСЛИ ЭТО ПРОСТО ТЕКСТ В ПАМЯТИ СЕЙЧАС // ЕСЛИ ПОПЫТАТЬСЯ ПРОЧИТАТЬ ФАЙЛ (Путь) ПОСЛЕ ВСЕГО ЭТОГО, ТАМ ТОЖЕ МУСОР КонецФункции |
|||
8
Lex_Liven
22.04.20
✎
12:21
|
НовыйЭлементЛога.ДанныеXML_Хранилище = Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(9));
А ты уверен, что вот эта процедура тебе Данные не херит? |
|||
9
H A D G E H O G s
22.04.20
✎
12:23
|
(0) Посмотрите, не падают ли серверные процессы
|
|||
10
Lex_Liven
22.04.20
✎
12:23
|
НовыйЭлементЛога.ДанныеXML_Строка = Данные;
НовыйЭлементЛога.ДанныеXML_Хранилище = Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(9)); Проверь свое ДанныеXML_Хранилище - вдруг там тот побайтно же самый «мусор»? |
|||
11
RitterBruder
22.04.20
✎
12:26
|
(8) Не, это логгирование я только что сделал.
НовыйЭлементЛога.ДанныеXML_Хранилище успешно распаковывается и там корректный XML. |
|||
12
Lex_Liven
22.04.20
✎
12:29
|
(11) Ты не понял вопроса.
Я знаю, что ты логируешь. Я тебе говорю, что не любая функция сохраняет свои параметры неизменными. Выполнение конструктора Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(9)); вполне может изменить значение переменной Данные, впихнув туда результат сжатия. И еще я говорю - проверь файл и результат в Хранилище (без распаковки). Если они совпадут, то я прав. Данные подвергаются сжатию и в таком виде заливаются в файл, а также возвращаются в сервис. |
|||
13
Cyberhawk
22.04.20
✎
12:31
|
Переходи с файлов на потоки в памяти
|
|||
14
NWsFF
22.04.20
✎
12:37
|
Глюк платформы.
|
|||
15
RitterBruder
22.04.20
✎
14:15
|
(12) Я тебя понял. Я убрал код с логгированием, и дождался ошибки, тоже самое. К тому же до текущего дня ошибки тоже были. Проблема уже настоялась, ей больше 2 месяцев. Первый месяц я её пытался игнорировать)
|
|||
16
RitterBruder
22.04.20
✎
14:15
|
(9) По журналу событий всё чисто.
|
|||
17
RitterBruder
22.04.20
✎
14:16
|
(13) Скорей всего придется так делать. Не хотелось типовую обработку ковырять.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |