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