![]() |
|
Загрузка данных из экселя в РС | ☑ | ||
---|---|---|---|---|
0
bebibo
26.07.21
✎
13:02
|
Добрый день! Подскажите, сколько примерно по времени должен грузится файл эксель в 267 000 записей? Данные из файла пишутся в регистр сведений.
|
|||
1
ДенисЧ
26.07.21
✎
13:03
|
от 1 минуты до 5 суток.
|
|||
2
Garykom
гуру
26.07.21
✎
13:03
|
(0) 1. количество полей не указано как и их тип
2. какие действия при загрузке в РС не указаны, просто числа/строки или ищем в бд ссылки? 3. какое железо не указано |
|||
3
Garykom
гуру
26.07.21
✎
13:04
|
(1) от 1 секунды до 5 лет
|
|||
4
ДенисЧ
26.07.21
✎
13:04
|
(3) За 5 лет компы уже сдохнут ))
|
|||
5
Garykom
гуру
26.07.21
✎
13:04
|
(4) это был синоним 8 на боку
в смысле что задача не решается/бесполезна |
|||
6
Garykom
гуру
26.07.21
✎
13:05
|
от 1С до бесконечности
|
|||
7
Garykom
гуру
26.07.21
✎
13:05
|
(6) "от 1с до бесконечности"
|
|||
8
Kassern
26.07.21
✎
13:06
|
(0) сейчас маньяк придет скинет ссылку на свое детище и расскажет, как это быстро работает.
|
|||
9
Beduin
26.07.21
✎
13:06
|
(0) А как у вас в голове родился подобный вопрос. Поэтапно, если можно?
|
|||
10
bebibo
26.07.21
✎
13:07
|
Регистр в который гружу состоит из 3-х измерений и одного ресурса. Два измерения справочник ссылка, третье - перечисление. Ресурс - булево.
Сам прикол в том, что обработка уже отработала, а в режиме 1С, программа так и не отвисла. |
|||
11
Kassern
26.07.21
✎
13:07
|
(0) а вообще, все должно быстро работать. Читаете файл через табличный документ, далее одним запросом находите соответствие объектов базы к вашей табличке.
|
|||
12
eTmy
26.07.21
✎
13:07
|
(10) Беда
|
|||
13
Kassern
26.07.21
✎
13:08
|
(10) как вы грузите? Наверное по ком цепляетесь к экселю и еше на слабом клиенте в цикле херачите поиск ссылочных данных по коду/наименованию?)
|
|||
14
bebibo
26.07.21
✎
13:08
|
(9) Надо из одной базы данных записи РС переместить в другую базу данных.
|
|||
15
Garykom
гуру
26.07.21
✎
13:09
|
(11) лучше это распараллелить на сервере фоновыми если возможно
не в один запрос все засунуть а блоками, причем размеры лучше подбирать на практике |
|||
16
Kassern
26.07.21
✎
13:09
|
(14) конфигурации одинаковые?
|
|||
17
Kassern
26.07.21
✎
13:10
|
(15) если бы ТС умел распараллеливать, думаю он бы не создавал эту тему)
|
|||
18
Garykom
гуру
26.07.21
✎
13:10
|
(15) файл читается и в один поток быстро
далее бьем на куски и запускаем фоновые каждое со своим куском где запросом получаем данные и пишем в РС |
|||
19
Garykom
гуру
26.07.21
✎
13:10
|
(17) на будущее пригодится
это единственный способ ускорения реального, когда весь говнокод уже вычищен |
|||
20
Beduin
26.07.21
✎
13:12
|
(14) Да, не. Вот в (10) подробности появились.
Программист, сначала смотрит в журнале регистрации, потом в отладчике, потом обнаруживает вызов который все затормозил и тогда уже выкладывает вопрос на форум. Как пришла идея вопроса в (0) который только и состоит из неизвестного. |
|||
21
Klesk
26.07.21
✎
13:13
|
(0) думаю, что должен быстро, посмотри в отладчике, что там крутит.
|
|||
22
Kassern
26.07.21
✎
13:13
|
я надеюсь в регистр данные набором записываются, а не каждая строчка через менеджер в цикле?)
|
|||
23
bebibo
26.07.21
✎
13:13
|
(13) Так вкратце код:
всегоСтрок = (МассивКолонок.Получить(0).Количество()); Сч=0; Для строкаТП = 0 По всегоСтрок Цикл Если ПустаяСтрока(СокрЛП(МассивКолонок.Получить(1).Получить(строкаТП))) тогда Сообщить("Строка пустая "+ строкаТП); Продолжить; Иначе НаименованиеРеквизита1 = МассивКолонок.Получить(0).Получить(строкаТП); НаименованиеРеквизита2 = МассивКолонок.Получить(1).Получить(строкаТП); НаименованиеРеквизита3 = МассивКолонок.Получить(2).Получить(строкаТП); НаименованиеРеквизита3=СтрЗаменить(КонтрагентНаименование,"""",""); НаименованиеРеквизита4 = Булево(МассивКолонок.Получить(3).Получить(строкаТП)); Для каждого ЭлементПеречисления Из Метаданные.Перечисления.нв_ВидыПечати.ЗначенияПеречисления Цикл Если ЭлементПеречисления.Синоним = ВидПечатиНаименование Тогда СсылкаНаПеречисление = Перечисления.нв_ВидыПечати[ЭлементПеречисления.Имя]; Прервать; КонецЕсли; КонецЦикла; ////Тут ниже запрос вытаскивает нужные данные по "НаименованиеРеквизита2", и сообщает, которые данные не нашел ------------ ////Далее идет второй запрос, который ввытаскивает нужные данные по "НаименованиеРеквизита3", которые данные не нашел, сообщает --------------- мНаборЗаписей = РегистрыСведений.МойРегистрСведений.СоздатьНаборЗаписей(); // прочитали то, что есть в базе мНаборЗаписей.Прочитать(); // заполняем свойства НоваяЗапись = мНаборЗаписей.Добавить(); НоваяЗапись.Измерение1 = СсылкаНаПеречисление; НоваяЗапись.Измерение2 = ФизическоеЛицо; НоваяЗапись.Измерение3 = Контрагент; НоваяЗапись.Ресурс1 = Напечатан; мНаборЗаписей.Записать(); КонецЕсли; КонецЦикла; |
|||
24
nodrama
26.07.21
✎
13:14
|
(0) Вообще ни чего не указано ;)
Железо не указано, а это большая часть времени. Можно на компе 2005 года грузить. А можно на сервере за 4 миллиона. Разница будет в часах и сутках ))) Плюс, а проверки? При загрузки, смотря сколько проверок и как они написаны. Либо бездумно грузит все подряд. То же разное время. Даже от версии Экселя кстати зависит. ) сам проверял) |
|||
25
bebibo
26.07.21
✎
13:14
|
(21) Отладчик уже не работает, именно в режиме предприятия зависло..Я думаю не из-за моих ли "Сообщить"?
|
|||
26
Kassern
26.07.21
✎
13:16
|
(23) а нельзя получить текущий набор запросом, соединить с результирующей таблицей с данными из экселя, чтобы уже получить готовую таблицу набора. А далее Набор.Загрузить(ВашаТаблица) и все без всякого цикла?
|
|||
27
Kassern
26.07.21
✎
13:17
|
(23) когда овер дофига записей, метод сообщить реально может нагнуть клиент)
|
|||
28
Beduin
26.07.21
✎
13:18
|
(21) У тебя где-то просто зациклилось. Код, как получаешь массив колонок покажи.
|
|||
29
bebibo
26.07.21
✎
13:22
|
(28) //Открываем xls файлs
Попытка Excel = Новый COMОбъект("Excel.Application"); WB = Excel.Workbooks.Open(ПутьКФайлу); WS = WB.Worksheets(1); //указываем номер листа - 1 arr = WS.UsedRange.Value; //передаём таблицу в переменную WB.Close(0); Исключение Предупреждение("Внимание! Файл не открыт."+Символы.ПС+"Попробуйте открыть и пересохранить данный файл программой Excel."); Возврат; КонецПопытки; //Узнаём данные выходные данные об листе ексель МассивКолонок = arr.Выгрузить(); //Выгружаем таблицу в массив ЗаполнениеРС(МассивКолонок); |
|||
30
bebibo
26.07.21
✎
13:23
|
(26) Наверно можно было..))
|
|||
31
Kassern
26.07.21
✎
13:24
|
(29) ты же понимаешь что для каждой строчки ты каждый раз прочитываешь полный набор данного регистра и каждый раз его полностью перезаписываешь и так делаешь все 267тыс раз...
|
|||
32
bebibo
26.07.21
✎
13:25
|
Просто до этого так же делали, но с другим запросом и с количеством записей до 1 000. А тут записей очень много.
Я всё таки думаю, что это из-за "Сообщить"..Потому что отладка уже не останавливается, конфигуратор отработал, а само предприятие никак не отвиснет, пишет "Не отвечает" |
|||
33
Kassern
26.07.21
✎
13:25
|
(30) закоменть запись в регистр и посмотри за сколько времени отработает чтение файла.
|
|||
34
bebibo
26.07.21
✎
13:25
|
(31) Да, понимаю. А как по другому?
|
|||
35
bebibo
26.07.21
✎
13:25
|
(33) Очень быстро. Минуты 2
|
|||
36
Kassern
26.07.21
✎
13:26
|
(34) я же написал в (26) в запросе получаешь уже готовую таблицу с твоими доп полями. А далее ее через загрузить в твой набор и все.
|
|||
37
Kassern
26.07.21
✎
13:27
|
(35) это вместе с "сообщить"?)
|
|||
38
bebibo
26.07.21
✎
13:29
|
(37) А, нет. Это просто получение "МассивКолонок"
|
|||
39
Kassern
26.07.21
✎
13:31
|
убирайте сообщить...Если там более 200 записей то смысла в нем нет, все равно работать с этим не сможете. При желании можете текстовый файлик создать и туда писать лог, но никак не в "сообщить".
|
|||
40
bebibo
26.07.21
✎
13:33
|
Пришлось перезапустить 1С предприятие..Загрузилось почему то только 18 911 записей. Хотя отладкой уже не ловил ничего (значит отработал и все загрузил)
|
|||
41
bebibo
26.07.21
✎
13:34
|
(39) Точно больше 200..
|
|||
42
Kassern
26.07.21
✎
13:37
|
(40) те которые на загрузились в лог пихай, далее по ним проверяй почему в набор не попали.
|
|||
43
bebibo
26.07.21
✎
13:49
|
Сейчас попробую без "Сообщить" грузануть
|
|||
44
серый КТУЛХУ
26.07.21
✎
14:02
|
афигеть. каким боком (14) к екселю?
иди читай "Универсальный обмен данными в формате XML" и не морочь людям голову. |
|||
45
серый КТУЛХУ
26.07.21
✎
14:04
|
и по COM привязываться - наф не вперлось даже если xls(x) в наличии и больше ничего.
Метод "Прочитать" объекта ТабличныйДокумент - загоняет екселя в табличный документ (с областями по именам листов) - и оттуда уже читай хоть обчитайся (да и посмотреть можно прям в 1с что там прочиталось в 1с) |
|||
46
Kassern
26.07.21
✎
14:06
|
(45) ну хочется полюбаться человеку, я ему выше еще писал про табдок. А если еще и конфа идентичная то можно и через обработку выгрузка/загрузка загнать. Так же есть и одата.
|
|||
47
bebibo
26.07.21
✎
14:06
|
(44) А если оба регистра не типовые и в той и в той базе?
|
|||
48
Kassern
26.07.21
✎
14:07
|
(47) метаданные грузишь в конвертацию двух конфиг и создаешь правило. В этом правиле привязываешь данные регистры и усе.
|
|||
49
Kassern
26.07.21
✎
14:07
|
(48) через универсальный обмен с твоим созданным правилом перекидываешь нужные данные.
|
|||
50
bebibo
26.07.21
✎
14:08
|
Я сейчас удаляю эти 18 к, которые загрузились, уже 15 минут удаляет)
|
|||
51
Kassern
26.07.21
✎
14:09
|
(50) потому что в цикле опять каждую строчку удаляешь, а надо набор почикать и записать
|
|||
52
bebibo
26.07.21
✎
14:11
|
Я не знаю как с этими правилами быть, я не разу их не писал. Так что через Универсальный обмен данными в формате XML не получится. У меня только 1 вариант - оптимизировать мой программный код.
|
|||
53
Kassern
26.07.21
✎
14:12
|
(52) а с json/xml работал? Зачем в эксель то выгружать/загружать?
|
|||
54
Kassern
26.07.21
✎
14:13
|
(52) открой для себя дивный мир json и 1совскую типовую функцию ПрочитатьJSON прям услада, все красивенько в массив.
|
|||
55
bebibo
26.07.21
✎
14:15
|
(53) С Json работал. Но работа то стопорится на чтении РС. Не совсем понимаю что в экселе не так..
|
|||
56
Kassern
26.07.21
✎
14:18
|
(55) это вообще, чтобы ты не создавал объект экселя, который еще может подвиснуть в диспетчере. В общем смысла в этом нет. Так как ты цепляешь к экселю есть смысл, если нужно работать с самим файлом, редактировать ексель, менять оформление и прочее. Если же нужно вытянуть данные из него, то лучше табдоком это делать. Если же ты сам создаешь файл для выгрузки, то лучше пользоваться xml/json. А по поводу загрузки РС я тебе все расписал, как быстро его загрузить.
|
|||
57
серый КТУЛХУ
26.07.21
✎
14:19
|
(52): ты и на 1с когда-то "ни разу не писал" - но решил потому что это пригодится - верно?
так по поводу кд2 (конвертации данных) и обработки "Универсальный обмен в формате XML" я тебе один умный вешь скажу: они точно пригодятся и даже ОЧЕНЬ пригодятся тебе, поэтому - осваивай а не ной. |
|||
58
Kassern
26.07.21
✎
14:20
|
(57) ради простенького обмена для регистра с 2 измерениями и 1 ресурсом можно и не придумывать правила в КД, было бы что-нить по сложнее, то КД наше все)
|
|||
59
серый КТУЛХУ
26.07.21
✎
14:26
|
(58): не только ради них. ну и у него то агрегатные измерения-реквизиты-ресурсы могут быть. на коленке по екселю придумывать, допиливать "с того конца" и снова на этой стороне ковыряться...
а кд2 - моща! все логично и понятно, хотя сначала и страшновато. настроил правила обмена - натравил на них обработку в источнике - выгрузил - натравил на выгрузку ту же самую обработку в приемнике - загрузил. |
|||
60
bebibo
26.07.21
✎
14:30
|
Kassern: "получить текущий набор запросом, соединить с результирующей таблицей с данными из экселя, чтобы уже получить готовую таблицу набора. А далее Набор.Загрузить(ВашаТаблица)" - а как их соединить то??
|
|||
61
серый КТУЛХУ
26.07.21
✎
14:30
|
(59): не не такой технологический цикл чуть.
натравил на источник и на приемник md8xExp.epf - выгрузил файлы описания конфигураций - загрузил их в кд2 в справочник конфигураций - слепил между этими ними в кд2 нужный обмен (создать обмен указать эти две конфигурации - и вперед). мне в свое время именно такого вот описания этой "совершенно прозрачной" процедуры "холодного старта" не хватало. |
|||
62
bebibo
26.07.21
✎
14:30
|
(57) Обещаю, научусь, но сейчас нужно как можно быстрее это сделать, поэтому нет времени разбираться к сожалению..
|
|||
63
серый КТУЛХУ
26.07.21
✎
15:35
|
(62): неа. вот сейчас у тебя именно тот самый простой случай когда кд2 надо. по прозрачному регламенту - слепишь правила обмена быстро если там структура несложная. если сложная - не так быстро но все равно полнее, точнее и быстрее, чем через ексель.
|
|||
64
Kassern
26.07.21
✎
15:50
|
(60) Вот тебе простой пример, на справочнике валюты...
ВЫБРАТЬ Валюты.Ссылка КАК Ссылка, Валюты.Код КАК Код ИЗ Справочник.Валюты КАК Валюты ГДЕ Валюты.Код = "643" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Валюты.Ссылка, Валюты.Код ИЗ Справочник.Валюты КАК Валюты ГДЕ Валюты.Код = "978" А теперь суть, берем таблица1 со всеми строками нашего набор, объединяем с таблица2 (это ТЗ полученное из экселя). Сопоставляем поля по измерениям. В итоге получаем таблицу включающую все поля из таблица1 и таблица2. Данный результат пихаем в наш набор ТвойНабор.Загрузить(ТЗИзРезультата) и записать. Все. |
|||
65
Kassern
26.07.21
✎
15:52
|
(64) важно, чтобы колонки таблицы полученной из экселя имели четко прописанные типы. Тогда нормально отработает соединение таблиц.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |