Имя: Пароль:
1C
 
Проблемы выгрузки больших XML в 7.7 и их решения.
0 H A D G E H O G s
 
23.01.20
11:48
Дня доброго.
Понадобилось тут народу сделать переход с 7.7 в 8.3 БП. И проблема у них образовалась - падает по памяти выгрузка в XML.
И даже 4 Гб не хватает.
Выгрузка идет через MS.XML2.DOM, который не пишет сразу в файл, а формирует дерево в памяти, чтобы оперировать Узлами, а не НачатьЭлемент()/ЗакончитьЭлемент(), вот это все.
Стали думать и гадать, даже форум читали. Там либо все переписывать на потоковый вывод предлагалось, либо грузить частями. Боль, страх, унижение.

И решил я - а че бы это дерево данных не хранить в стороннем x64 процессе из светлого будущего.
Сказано - сделано -  встречайте x64Provider от HADGEHOGs:

Ссыль - https://yadi.sk/d/4L5gHvFMO0f_XQ
Скрин - http://prntscr.com/qrnoq0

В принципе, он позволяет работать с любыми COM-объектами в адресном пространстве x64.

7.7 - зло злобное.
1 H A D G E H O G s
 
23.01.20
11:50
Чуть позже размещу на Инфостарте, вдруг кому то пригодиться.
2 Amra
 
23.01.20
11:52
Забыл добавить "... от моего Гения - вам...." ))
3 H A D G E H O G s
 
23.01.20
11:53
(2) "Мой Гений скромно дарит вам..."
Да, просилось, просилось, но я не могу компрометировать Осипова.
4 pechkin
 
23.01.20
11:59
частями выгружай. зачем все в 1 файл?
5 pechkin
 
23.01.20
12:00
да и вообще частями переход правильнее. ибо выгрузил все 100500 гигов, а потом где-то вконце ошибка
6 H A D G E H O G s
 
23.01.20
12:01
(4) Где там частями в типовом переносе?
7 pechkin
 
23.01.20
12:02
(6) у тебя типовой перенос прошел гладко?
ни разу такого не видел
частями - там же оычные правила с кучей галок
8 Bigbro
 
23.01.20
12:05
ненуачо.
вот так по костылику и 7ка на очередной десяток лет работы пойдет без замены).
Спасибо!
9 H A D G E H O G s
 
23.01.20
12:06
(7) 280000 тыс элементов без косяков, кроме 8 счет-фактур, в которых не заполнен договор.
Но эти 8 счет фактур можно забить руками.
10 H A D G E H O G s
 
23.01.20
12:06
280 тыс, пардон.
11 pechkin
 
23.01.20
12:07
(9) повезло однако
12 H A D G E H O G s
 
23.01.20
12:07
(7) Я не разбираюсь в этих ваших семерках, именно необходимость ковыряния кода в 7.7 подвигла меня по быстрому накропать эту приблуду.
13 pechkin
 
23.01.20
12:08
наверно у них учет был без ошибок
14 pechkin
 
23.01.20
12:09
хотя я правда ни разу полностью типовые базы не переносил. может поэтому
15 d4rkmesa
 
23.01.20
12:22
(0) Спасибо, качнул на всякий.
16 Garykom
 
гуру
23.01.20
12:35
(0) Не DOMь а SAXуй!
17 pechkin
 
23.01.20
12:38
(16) предлагаешь переписать выгрузку из 77?
18 Garykom
 
гуру
23.01.20
13:13
(17) Ну решение с вызовом 64 битных dll из 32 бит приложения тоже тот еще костыль
19 tgu82
 
23.01.20
16:13
(0) Ну надо же я рядом такую ветку создал с вопросом как решать а тут вроде и решение имеется.
Спасибо!
20 tgu82
 
23.01.20
16:30
(0) А не хочет ее регистрировать в вин сервер 2012. Я правда их простой папки его запускал.
Не взлетает. Наверное туплю
21 NorthWind
 
23.01.20
16:48
(7) ну у меня в 14 году ЗиК четырехлетний нормально в ЗУП-УПП перелился штатным переносом. Кое-что потом руками уже в УПП подправили, но по мелочи.
22 NorthWind
 
23.01.20
16:49
(0) полезная штука, спасибо!
23 H A D G E H O G s
 
23.01.20
17:13
(20) Как вариант -
regsrv32 asf.exe

под админом.
Тестировал под Win10 у себя
24 pechkin
 
23.01.20
17:14
(23) ты же в описании написал что не нужно этих мерзких админов
25 H A D G E H O G s
 
23.01.20
17:15
(24) Я не тестировал под Winserver2012
26 pechkin
 
23.01.20
17:16
(25) а что там другая ролевая модель?
27 H A D G E H O G s
 
23.01.20
17:18
(26) Ты с какой целью интересуещься?
28 H A D G E H O G s
 
23.01.20
17:22
(20) Клиентский сеанс под тем же пользователем, под которым устанавливал?
29 pechkin
 
23.01.20
17:24
для общего T-shape развития
30 H A D G E H O G s
 
23.01.20
17:43
Проверил на WinServ 2016.
Все нормально взлетело.
31 H A D G E H O G s
 
23.01.20
17:49
tgu82, если есть возможность дать доступ к серверу - пиши на [email protected]
32 Garykom
 
гуру
23.01.20
18:02
Кривизну разрабов исправлять через костыли вместо написания в саппорт? А потом удивляться а что то 1С такая глюкавая.
33 pechkin
 
23.01.20
18:04
в саппорт по 77?
34 Лефмихалыч
 
23.01.20
18:04
я бы просто делал выгрузку не одинэсом и всё.
Но тогда бы не было магической вундервафли - это да
35 Garykom
 
гуру
23.01.20
18:04
Заодно плиз решение для x64 1С и печати pdf417 из регламентированной ну и заодно ккт штрих как к x64
36 pechkin
 
23.01.20
18:05
(34) сам бы с 0 выгрузку писал?
37 Garykom
 
гуру
23.01.20
18:05
(33) Именно саппорт по переходу с 77 на 8
38 pechkin
 
23.01.20
18:06
(37) и что как ты думаешьони могут ответить?
39 Garykom
 
гуру
23.01.20
18:08
(38) Думаю пришлют подправленную для выгрузки кусочками
40 pechkin
 
23.01.20
18:08
(39) так такая уже есть - см начало ветки
41 Garykom
 
гуру
23.01.20
18:12
(40) Я думаю ТС изучил приобрел новый молоток и терь ему нравится забивать им любые шурупы
42 Garykom
 
гуру
23.01.20
18:13
(41)+ Ну 7.7 плохо знает или уже забыл
43 pechkin
 
23.01.20
18:13
ну таки забилось
44 tgu82
 
23.01.20
18:13
(41) Да нет, просто с нового года все бухгалтерии будут в 8-ке 99.99999%. Сверки норм проходит а с выгрузкой напряги
45 Garykom
 
гуру
23.01.20
18:15
(44) С БП2 на БП3 переход тоже актуален
46 pechkin
 
23.01.20
18:16
(45) там нет такой проблемы в принципе
47 tgu82
 
23.01.20
18:26
(31) отправил Вам письмо
48 Garykom
 
гуру
23.01.20
18:26
(46) Хохо. Там схожая проблема что типовой переход от разрабов в неких ситуациях с много веселых данных нихрена не взлетает.
Ну не получится просто обновиться, надо выгрузку и загрузку в чистую базу делать
49 tgu82
 
23.01.20
18:28
(45) Расчетчик-кадровик год ведет ЗУП и ЗИК по 4 фирмам и матерится на ЗУП по многим причинам. И с большим трудом удается убеждать переходить на 8-ку тех кто с 2003 на 7-ке.
50 tgu82
 
23.01.20
18:30
(48) Само собой загрузка в новую чистую базу - справочники выгрузились а на остатки вот памяти не хватает в парсере 3.0
51 Сияющий в темноте
 
23.01.20
18:31
в адресное пространство другого процесса?
падение скорости в разы.

нет,а что переписывать?
дом он строит добавлением в конец? тогда просто пишешь заглушку-транслятор одних вызовов в другие,и никто не узнает.
просто,зачем гадить в память,если есть диск,который также виртуально в памяти-и он побыстрее межпроцессорного вызова будет,так как при обмене между программами(процессами)реально идет передача данных между нитями исполнения,а они на разных ядрах.
52 tgu82
 
23.01.20
20:01
H A D G E H O G просто гуру и супер. Пока все флудили он все сделал чтоб все заработало.
Мастер одним словом )
53 NorthWind
 
23.01.20
21:14
(51) > в адресное пространство другого процесса? падение скорости в разы.

DOM сам по себе не настолько шустер чтобы это сказалось.
Серьезные выгрузки данных с гигабайтными файлами запускают на ночь - авось наутро выгрузит. Задача разовая. Какая там скорость?
54 NorthWind
 
23.01.20
21:19
+ (51) Транслятор вызовов? Там порядком вызовов придется перенянчить. Плюс если там где-то все же паче чаяния окажется работа с уже загруженными в DOM-документ узлами - то вы попадете в некоторую просрацию...
55 victuan1
 
24.01.20
07:44
(44) Чего это вдруг?
56 tgu82
 
24.01.20
08:14
(55) Приказ руководства. Надо. Базы строительных фирм выделяем из общей управленческой ТИС. Да много всяких причин накопилось. 7-ка пока управленческая остается но думаю что не больше чем на полгода
57 Franchiser
 
гуру
24.01.20
09:01
Нужно ли что-то делать с обработкой кроме регистрации asf. Как это работает?
58 tgu82
 
24.01.20
09:17
(57) Это к автору. в посте 31 есть его адрес.
Но вообще-то он полностью отработанную версию обещал опубликовать здесь

Возиожно действительно поставить последний парсер но я не пробовал - просто пока не надо, ASF+очень умелые руки и мозги (0) мне проблему решили
59 Дык ё
 
24.01.20
09:28
60 Garykom
 
гуру
24.01.20
09:40
(59) Дык не ё, в смысле ты фишки не понял.

Они не хотят типовую выгрузку переписывать на нечто отличное от штатной кривой реализации, которой не хватает оперативки чтобы выгрузить XML под гиг.
По ссылке просто вариант работы с XML который так же потребует переписки, у ТС же решение которое com объект "MSXML2.DOMDocument" заставляет работать в x64 процессе, хотя 1С 7.7 вызывающая x32
61 Garykom
 
гуру
24.01.20
09:49
(60)+ Короче вместо полдня потерять а потом за полчаса долететь, они предпочитают ничего не терять но ждать выгрузки нескоко часов через костыль
62 Franchiser
 
гуру
24.01.20
10:18
(58) посмотрел скрин стало понятно. Думал это консольная утилита, а это целое приложение.
(60) вообще то вместо xml2, в обработке у автора используется xml4
63 pechkin
 
24.01.20
10:28
(61) полдня переписыать типовую обработку - да ты сказочник
64 Garykom
 
гуру
24.01.20
10:55
(62) насчет 2 и 4 не понял
Ибо  "MSXML2.DOMDocument" бывает разных версий  "MSXML2.DOMDocument.4.0" так и "MSXML2.DOMDocument.2.6", "MSXML2.DOMDocument.3.0" и до 6.0

А внутри каких DLL оно уже пофиг https://support.microsoft.com/ru-ru/help/269238/list-of-microsoft-xml-parser-msxml-versions
65 Garykom
 
гуру
24.01.20
10:56
(63) ОК для меня пара часов переписать с DOM на SAX модель XML эту хрень.
66 Franchiser
 
гуру
24.01.20
11:11
(65) перепиши и поделись со всему, все будут благодарны
67 vladko
 
24.01.20
13:22
мне тоже на следующей неделе надо будет писать выгрузку из 7.7 большого объёма данных в .xml. Было бы очень интересно узнать результат, ну и сравнить разные методы выгрузки в xml.
68 d4rkmesa
 
24.01.20
13:26
(65) Есть неудобства определенные, в связи с тем, что модуль обработки V77Exp генерируется в КД.
69 Сияющий в темноте
 
24.01.20
18:17
(65)если в Dom все делается последовательно,то да,но есть "умники" которым нравится встаалять,вот тут потоковая запись ни к лицу,хотя,ее можно писать как сценарий,а потом проигрывать для сбора файла как это делалось во времена DOS для редактирования файла большего по обьему предостааленной памяти в 640к
70 8 bit
 
24.01.20
18:27
(0) >7.7 - зло злобное.

Вот тут ты не прав. Ты памятник должен поставить клюшкам, т.к. благодаря им 1С набрала популярность, а куча программистов нашла себе хоть какое-то применение. Более того, 7-ка дала шанс всяким недопрогам заработать на кусок хлеба, а то и с маслом.
71 Garykom
 
гуру
24.01.20
18:53
(69) Все намного проще.

Пишутся функции - обертки эмулирующие методы com компонента Msxml2.DOMDocument но реально работающие с ТЗ или СЗ.
И везде в коде вызов Msxml2.DOMDocument заменяется на наши обертки.

Затем тупой линейный проход по СЗ и запись последовательно в XML.

Лишь бы оперативки для СЗ хватило, если не хватит тут уже придется извращаться как то еще.
72 Garykom
 
гуру
24.01.20
18:58
(71)+ Каждый узел XML легко представим в виде СЗ, где первым элементом лежит вложенная СЗ с атрибутами, а последующие это подчиненные узлы так же СЗ.
73 Franchiser
 
гуру
24.01.20
19:58
(71) это уже не sax, опять все упрется в память и в недостатки ТЗ и СЗ
74 tgu82
 
24.01.20
20:15
(73) Решение-то уже есть, хотя для 1С 7.7 много чего в реестр (0) добавил и заработало, файл в 862 мб родился и закачался в 8-ку БП3
75 Garykom
 
гуру
24.01.20
20:30
(73) Как раз линейно из своего формата в XML это классический SAX.
А свой формат по сравнению с XML даже банальная СЗ будет сильно меньше места кушать.
Ну или да пишем на диск но тут тормоза будут если вставки юзаются или изобретать какие то извраты типа хранения узлов в отдельных файлах и каталогах.
76 NorthWind
 
27.01.20
06:33
(75) не только вставки. У стандартного DOM можно выбирать подмножества узлов, используя выражения XPath. Вот если это понадобится сэмулировать - будет печаль...
77 Garykom
 
гуру
27.01.20
08:59
(76) И это можно но согласен писать полностью движок запросов к XML это слегка перебор, в этом случае вариант (0) сильно проще.
78 dk
 
27.01.20
09:07
на нафейхоа такие извраты если штатный норм робит?

    Анализатор = СоздатьОбъект("AddIn.XMLParser");
    ПоследовательноЗаписываемыйДокумен = Анализатор.СоздатьПоследовательноЗаписываемыйДокумент();
    ПоследовательноЗаписываемыйДокумен.ИмяФайла = Файл;
    ПоследовательноЗаписываемыйДокумен.АтрибутыЭлемента.УстановитьАтрибут("datetime", Формат(ТекущаяДата(), "дДДММГГГГ") + " " + ТекущееВремя() + ".000");
    ПоследовательноЗаписываемыйДокумен.ОткрытьЭлемент("categories");
    ПоследовательноЗаписываемыйДокумен.АтрибутыЭлемента.УдалитьВсе();
    
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку() = 1 Цикл
        
        ПоследовательноЗаписываемыйДокумен.ОткрытьЭлемент("row");
        ПоследовательноЗаписываемыйДокумен.АтрибутыЭлемента.УдалитьВсе();
        ПоследовательноЗаписываемыйДокумен.ВключитьЭлемент("uid",         ТЗ.УИД);
        ПоследовательноЗаписываемыйДокумен.ВключитьЭлемент("category",    ТЗ.Категория);
        ПоследовательноЗаписываемыйДокумен.ЗакрытьЭлемент();
        
        Если (ТЗ.НомерСтроки % 1000) = 0 Тогда
            ПоследовательноЗаписываемыйДокумен.Сбросить();
        КонецЕсли;
        
    КонецЦикла;    
79 NorthWind
 
27.01.20
09:44
(78) да работает, работает. Только когда у вас объем генерируемого XMLя выползет за 200-300М, может несколько приуныть и уронить 1С
80 NorthWind
 
27.01.20
10:01
хотя вы сбрасываете... хм... кстати, вариант!
81 Aleksey
 
27.01.20
10:03
(6) берешь бубен ...
По сути там написана оболочка для кд, т.е. вытаскиваешь правила и можешь частями выгружать, указывая какие типы данных нужно выгрузить
82 dk
 
27.01.20
10:31
(79) формируется XML - 150 мб минут за 9
сбросить - рулит
83 Franchiser
 
гуру
27.01.20
16:55
(82) есть переписанная выгрузка из 7.7 ?
84 Сияющий в темноте
 
27.01.20
18:32
так можно и прямо в файле,если писать всегда в конец.
узел это позиция в файле,позиция родителя очевидна
при добавлении чего-то в узел просто по старому месту пишем переход на новое и в путь.
а файлы можно проецировать в память.
так что dom можно реализовать достаточно просто.
85 Franchiser
 
гуру
27.01.20
19:09
(84) перепиши если просто, я начинал 5 л назад и забросил
86 dk
 
28.01.20
11:42
(83) нету