Имя: Пароль:
1C
1С v8
СжатиеДанных(9) портит XML
0 perpleks
 
22.02.17
11:36
Есть веб-сервис, который отдает хранилище значения с XML.

Код:
ОтветСжатый = Новый ХранилищеЗначения(Сообщение, Новый СжатиеДанных);
ОтветСжатый.Получить()

Результат:
<CatalogObject.ЗначенияСвойствОбъектов xsi:type="CatalogObject.ЗначенияСвойствОбъектов">
  <Ref>4e745b2e-a9ff-11e5-fb89-da932d334384</Ref>
  <DeletionMark>false</DeletionMark>
  <Owner xsi:type="CatalogRef.СвойстваОбъектов">3695027a-7831-11e3-8927-0007e90f2690</Owner>
  <Code>Ц00000389</Code>
  <Description>blablabla</Description>
</CatalogObject.ЗначенияСвойствОбъектов>

Код:
ОтветСжатый = Новый ХранилищеЗначения(Сообщение, Новый СжатиеДанных(9));
ОтветСжатый.Получить()

Результат:
<CatalogObject.ЗначенияСвойствОбъектов xsi:type="CatalogObject.ЗначенияСвойствОбъектов">
  <Ref>4e745b2e-a9ff-11e5-fb89-da932d334384</Ref>
  <DeletionMark>false</DeletionMark>
  <Owner xsi:type="CatalogRef.СвойстваОбъектов">3695027a-7831-11e3-8927-0007e90f2690</Owner>
  <Description>blablabla</Description>
</CatalogObject.ЗначенияСвойствОбъектов>

WTF? Каждый раз пропадают несколько случайных узлов. Код выполняется на сервере Linux, 8.3.9.1850. На клиенте такого не наблюдается. Такое возможно или я сошел с ума?
1 banco
 
22.02.17
11:40
передавай обычный текст
2 perpleks
 
22.02.17
11:42
Передается на планшеты через мобильный интернет, хотел размер выгрузки как можно меньше сделать
3 Lama12
 
22.02.17
11:44
(2) В 1С лучше написать с примером. Хоть исправят.
4 Fragster
 
гуру
22.02.17
11:46
а 8 портит? а вообще странно.
5 Fragster
 
гуру
22.02.17
11:46
там же зип обыкновенный
6 perpleks
 
22.02.17
11:48
С 8 прошло где-то 600 элементов без проблем сейчас.

С 9 наблюдается только если несколько сотен элементов, испорченными оказываются несколько штук, каждый раз разные
7 perpleks
 
22.02.17
11:50
Ну, т.е. в одном и том же сообщении испорченные одни и те же элементы, вроде бы, если сообщение минимально меняется, вылетают уже другие элементы
8 Fragster
 
гуру
22.02.17
12:07
пиши на [email protected], ошибка то очень жесткая
9 Жан Пердежон
 
22.02.17
12:14
мда, переходи после такого на Linux
10 MrStomak
 
22.02.17
12:25
Используй Fastinfoset вместо сжатия, он компактный вроде.

Вообще по СжатиеДанных и xml я не вижу никакой связи.

В этот момент в платформе не должно происходить никакого анализа узлов, чтобы их можно было потерять. Никакого сбора схем xml или чего-то такого. Т.е. "битый" файл не должен выглядеть, как пропавший целый узел xml.

Я склонен думать, что автор что-то упускает и различие в данных не привязано к сжатию.
11 Жан Пердежон
 
22.02.17
12:29
(10) ага, используй FastInfoSet и лови периодически
"Недостаточно памяти для записи файла формата Base64"
12 perpleks
 
22.02.17
12:31
(10) Я и сам понимаю, что это не похоже на битый файл, но вот больше вообще ничего не менял в коде. С 9 не загружается клиентом, с 8 загружается. Меняю обратно на 9, опять такая же ерунда.

Встаю отладчиком на следующую строчку, пишу ОтветСжатый.Получить(): с 9 пропавшие узлы, с 8 нормально
13 RomanYS
 
22.02.17
12:38
"Не верю!"
Проблема явно не в хранилище и не в платформе. Смотри где у тебя формируется Сообщение.
14 MrStomak
 
22.02.17
12:39
(12)
1. Подготовь xml, сохрани в файл.
2. Напиши обработку, где ты этот файл берёшь, сжимаешь, разжимаешь и он <> исходному файлу.
3. Файл и обработку шлешь на [email protected] и сюда желательно тоже

Но скорее всего, по такому алгоритму ты ошибку не воспроизведешь, потому что сжатие не при чем.
15 Жан Пердежон
 
22.02.17
12:56
(12) покажи код как сообщение собираешь
16 perpleks
 
22.02.17
13:43
Так, значит от степени сжатия не зависит, то воспроизводится, то нет с любой степенью.

Без сжатия ни разу не получилось воспроизвести. Полностью согласен, что это бредово звучит и скорее всего ошибка в чем-то другом, но почему без сжатия это у меня не воспроизводится я понять не могу.

Формирую примерно так

НаборСхемXML = ФабрикаXDTO.ЭкспортСхемыXML("...");
Фабрика = Новый ФабрикаXDTO(НаборСхемXML);

...

Пока Выборка.Следующий() Цикл
Элемент = Фабрика.Создать(Фабрика.Тип(УИР, "CatalogObject.ЗначенияСвойствОбъектов"));
Элемент.Ref = XMLСтрока(Выборка.Ссылка);
Элемент.DeletionMark = XMLСтрока(Выборка.ПометкаУдаления);
Элемент.Owner = Фабрика.Создать(Фабрика.Тип(URI, "CatalogRef.СвойстваОбъектов"), XMLСтрока(Выборка.Владелец));
Элемент.Code = XMLСтрока(Выборка.Код);
Элемент.Description = XMLСтрока(ЗаменитьНедопустимыеСимволыXML(Выборка.Наименование));
Фабрика.ЗаписатьXML(ХМЛ, Элемент,,,,НазначениеТипаXML.Явное);
КонецЦикла;
17 Fragster
 
гуру
22.02.17
13:49
и зачем ты для примитивных типов вызываешь XMLСтрока?
18 Fragster
 
гуру
22.02.17
13:50
да и для ссылок, емнип, тоже не надо
19 Fragster
 
гуру
22.02.17
13:51
если правильный тип в пакете/схеме
20 perpleks
 
22.02.17
13:52
(17) (18) это артефакты попыток выяснить, в чем проблема с формированием XML, надо убрать
21 Жан Пердежон
 
22.02.17
13:55
(20) в схеме "косяк", фабрика может необязательные пустые поля выкидывать
22 Fragster
 
гуру
22.02.17
13:58
а CatalogObject.ЗначенияСвойствОбъектов мне подозрительно напоминает использование current-config. если структура метаданных идентична - то можно использовать СериализаторXDTO.ЗаписатьXDTO для сериализации/десериализации объектов
23 perpleks
 
22.02.17
14:03
(22) нет, не current-config, схема экспортирована из конфигурации базы-приемника

(21) наверное может, но в выборке нет пустых полей, там все значения заполняются
24 Жан Пердежон
 
22.02.17
15:52
В чем разница?
Фабрика.Тип(URI
Фабрика.Тип(УИР
25 Лефмихалыч
 
22.02.17
16:03
(0) может там прокси какой и это какой-нить гнилой кэш?
26 vde69
 
22.02.17
16:22
цифорку 9 может уберешь ??? а то алгоритм сжатия и раскрытия может быть разный...
27 Вафель
 
22.02.17
16:25
возможно zip файлы бьются.
Делай хэш и сравнивай также его.
У нас на одном проекте такое было
28 Вафель
 
22.02.17
16:26
пусть веб сервис отдает также md5
Закон Брукера: Даже маленькая практика стоит большой теории.