Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Загрузка данных из экселя в РС

Загрузка данных из экселя в РС
Я
   bebibo
 
26.07.21 - 13:02
Добрый день! Подскажите, сколько примерно по времени должен грузится файл эксель в 267 000 записей? Данные из файла пишутся в регистр сведений.
   ДенисЧ
 
1 - 26.07.21 - 13:03
от 1 минуты до 5 суток.
   Garykom
 
2 - 26.07.21 - 13:03
(0) 1. количество полей не указано как и их тип
2. какие действия при загрузке в РС не указаны, просто числа/строки или ищем в бд ссылки?
3. какое железо не указано
   Garykom
 
3 - 26.07.21 - 13:04
(1) от 1 секунды до 5 лет
   ДенисЧ
 
4 - 26.07.21 - 13:04
(3) За 5 лет компы уже сдохнут ))
   Garykom
 
5 - 26.07.21 - 13:04
(4) это был синоним 8 на боку
в смысле что задача не решается/бесполезна
   Garykom
 
6 - 26.07.21 - 13:05
от 1С до бесконечности
   Garykom
 
7 - 26.07.21 - 13:05
(6) "от 1с до бесконечности"
   Kassern
 
8 - 26.07.21 - 13:06
(0) сейчас маньяк придет скинет ссылку на свое детище и расскажет, как это быстро работает.
   Beduin
 
9 - 26.07.21 - 13:06
(0) А как у вас в голове родился подобный вопрос. Поэтапно, если можно?
   bebibo
 
10 - 26.07.21 - 13:07
Регистр в который гружу состоит из 3-х измерений и одного ресурса. Два измерения справочник ссылка, третье - перечисление. Ресурс - булево.
Сам прикол в том, что обработка уже отработала, а в режиме 1С, программа так и не отвисла.
   Kassern
 
11 - 26.07.21 - 13:07
(0) а вообще, все должно быстро работать. Читаете файл через табличный документ, далее одним запросом находите соответствие объектов базы к вашей табличке.
   eTmy
 
12 - 26.07.21 - 13:07
(10) Беда
   Kassern
 
13 - 26.07.21 - 13:08
(10) как вы грузите? Наверное по ком цепляетесь к экселю и еше на слабом клиенте в цикле херачите поиск ссылочных данных по коду/наименованию?)
   bebibo
 
14 - 26.07.21 - 13:08
(9) Надо из одной базы данных записи РС переместить в другую базу данных.
   Garykom
 
15 - 26.07.21 - 13:09
(11) лучше это распараллелить на сервере фоновыми если возможно
не в один запрос все засунуть а блоками, причем размеры лучше подбирать на практике
   Kassern
 
16 - 26.07.21 - 13:09
(14) конфигурации одинаковые?
   Kassern
 
17 - 26.07.21 - 13:10
(15) если бы ТС умел распараллеливать, думаю он бы не создавал эту тему)
   Garykom
 
18 - 26.07.21 - 13:10
(15) файл читается и в один поток быстро
далее бьем на куски и запускаем фоновые каждое со своим куском где запросом получаем данные и пишем в РС
   Garykom
 
19 - 26.07.21 - 13:10
(17) на будущее пригодится
это единственный способ ускорения реального, когда весь говнокод уже вычищен
   Beduin
 
20 - 26.07.21 - 13:12
(14) Да, не. Вот в (10) подробности появились.
Программист, сначала смотрит в журнале регистрации, потом в отладчике, потом обнаруживает вызов который все затормозил и тогда уже выкладывает вопрос на форум.
Как пришла идея вопроса в (0) который только и состоит из неизвестного.
   Klesk
 
21 - 26.07.21 - 13:13
(0) думаю, что должен быстро, посмотри в отладчике, что там крутит.
   Kassern
 
22 - 26.07.21 - 13:13
я надеюсь в регистр данные набором записываются, а не каждая строчка через менеджер в цикле?)
   bebibo
 
23 - 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 = Напечатан;
            мНаборЗаписей.Записать();
                        
        КонецЕсли;        
    КонецЦикла;
   nodrama
 
24 - 26.07.21 - 13:14
(0) Вообще ни чего не указано ;)
Железо не указано, а это большая часть времени. Можно на компе 2005 года грузить. А можно на сервере за 4 миллиона. Разница будет в часах и сутках )))
Плюс, а проверки? При загрузки, смотря сколько проверок и как они написаны. Либо бездумно грузит все подряд. То же разное время.
Даже от версии Экселя кстати зависит. ) сам проверял)
   bebibo
 
25 - 26.07.21 - 13:14
(21) Отладчик уже не работает, именно в режиме предприятия зависло..Я думаю не из-за моих ли "Сообщить"?
   Kassern
 
26 - 26.07.21 - 13:16
(23) а нельзя получить текущий набор запросом, соединить с результирующей таблицей с данными из экселя, чтобы уже получить готовую таблицу набора. А далее Набор.Загрузить(ВашаТаблица) и все без всякого цикла?
   Kassern
 
27 - 26.07.21 - 13:17
(23) когда овер дофига записей, метод сообщить реально может нагнуть клиент)
   Beduin
 
28 - 26.07.21 - 13:18
(21) У тебя где-то просто зациклилось. Код, как получаешь массив колонок покажи.
   bebibo
 
29 - 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.Выгрузить();//Выгружаем таблицу в массив

    ЗаполнениеРС(МассивКолонок);
   bebibo
 
30 - 26.07.21 - 13:23
(26) Наверно можно было..))
 
 
   Kassern
 
31 - 26.07.21 - 13:24
(29) ты же понимаешь что для каждой строчки ты каждый раз прочитываешь полный набор данного регистра и каждый раз его полностью перезаписываешь и так делаешь все 267тыс раз...
   bebibo
 
32 - 26.07.21 - 13:25
Просто до этого так же делали, но с другим запросом и с количеством записей до 1 000. А тут записей очень много.
Я всё таки думаю, что это из-за "Сообщить"..Потому что отладка уже не останавливается, конфигуратор отработал, а само предприятие никак не отвиснет, пишет "Не отвечает"
   Kassern
 
33 - 26.07.21 - 13:25
(30) закоменть запись в регистр и посмотри за сколько времени отработает чтение файла.
   bebibo
 
34 - 26.07.21 - 13:25
(31) Да, понимаю. А как по другому?
   bebibo
 
35 - 26.07.21 - 13:25
(33) Очень быстро. Минуты 2
   Kassern
 
36 - 26.07.21 - 13:26
(34) я же написал в (26) в запросе получаешь уже готовую таблицу с твоими доп полями. А далее ее через загрузить в твой набор и все.
   Kassern
 
37 - 26.07.21 - 13:27
(35) это вместе с "сообщить"?)
   bebibo
 
38 - 26.07.21 - 13:29
(37) А, нет. Это просто получение "МассивКолонок"
   Kassern
 
39 - 26.07.21 - 13:31
убирайте сообщить...Если там более 200 записей то смысла в нем нет, все равно работать с этим не сможете. При желании можете текстовый файлик создать и туда писать лог, но никак не в "сообщить".
   bebibo
 
40 - 26.07.21 - 13:33
Пришлось перезапустить 1С предприятие..Загрузилось почему то только 18 911 записей. Хотя отладкой уже не ловил ничего (значит отработал и все загрузил)
   bebibo
 
41 - 26.07.21 - 13:34
(39) Точно больше 200..
   Kassern
 
42 - 26.07.21 - 13:37
(40) те которые на загрузились в лог пихай, далее по ним проверяй почему в набор не попали.
   bebibo
 
43 - 26.07.21 - 13:49
Сейчас попробую без "Сообщить" грузануть
   серый КТУЛХУ
 
44 - 26.07.21 - 14:02
афигеть. каким боком (14) к екселю?
иди читай "Универсальный обмен данными в формате XML" и не морочь людям голову.
   серый КТУЛХУ
 
45 - 26.07.21 - 14:04
и по COM привязываться - наф не вперлось даже если xls(x) в наличии и больше ничего.
Метод "Прочитать" объекта ТабличныйДокумент - загоняет екселя в табличный документ (с областями по именам листов) - и оттуда уже читай хоть обчитайся (да и посмотреть можно прям в 1с что там прочиталось в 1с)
   Kassern
 
46 - 26.07.21 - 14:06
(45) ну хочется полюбаться человеку, я ему выше еще писал про табдок. А если еще и конфа идентичная то можно и через обработку выгрузка/загрузка загнать. Так же есть и одата.
   bebibo
 
47 - 26.07.21 - 14:06
(44)  А если оба регистра не типовые и в той и в той базе?
   Kassern
 
48 - 26.07.21 - 14:07
(47) метаданные грузишь в конвертацию двух конфиг и создаешь правило. В этом правиле привязываешь данные регистры и усе.
   Kassern
 
49 - 26.07.21 - 14:07
(48) через универсальный обмен с твоим созданным правилом перекидываешь нужные данные.
   bebibo
 
50 - 26.07.21 - 14:08
Я сейчас удаляю эти 18 к, которые загрузились, уже 15 минут удаляет)
   Kassern
 
51 - 26.07.21 - 14:09
(50) потому что в цикле опять каждую строчку удаляешь, а надо набор почикать и записать
   bebibo
 
52 - 26.07.21 - 14:11
Я не знаю как с этими правилами быть, я не разу их не писал. Так что через Универсальный обмен данными в формате XML не получится. У меня только 1 вариант - оптимизировать мой программный код.
   Kassern
 
53 - 26.07.21 - 14:12
(52) а с json/xml работал? Зачем в эксель то выгружать/загружать?
   Kassern
 
54 - 26.07.21 - 14:13
(52) открой для себя дивный мир json и 1совскую типовую функцию ПрочитатьJSON прям услада, все красивенько в массив.
   bebibo
 
55 - 26.07.21 - 14:15
(53) С Json работал. Но работа то стопорится на чтении РС. Не совсем понимаю что в экселе не так..
   Kassern
 
56 - 26.07.21 - 14:18
(55) это вообще, чтобы ты не создавал объект экселя, который еще может подвиснуть в диспетчере. В общем смысла в этом нет. Так как ты цепляешь к экселю есть смысл, если нужно работать с самим файлом, редактировать ексель, менять оформление и прочее. Если же нужно вытянуть данные из него, то лучше табдоком это делать. Если же ты сам создаешь файл для выгрузки, то лучше пользоваться xml/json. А по поводу загрузки РС я тебе все расписал, как быстро его загрузить.
   серый КТУЛХУ
 
57 - 26.07.21 - 14:19
(52): ты и на 1с когда-то "ни разу не писал" - но решил потому что это пригодится - верно?
так по поводу кд2 (конвертации данных) и обработки "Универсальный обмен в формате XML" я тебе один умный вешь скажу: они точно пригодятся и даже ОЧЕНЬ пригодятся тебе, поэтому - осваивай а не ной.
   Kassern
 
58 - 26.07.21 - 14:20
(57) ради простенького обмена для регистра с 2 измерениями и 1 ресурсом можно и не придумывать правила в КД, было бы что-нить по сложнее, то КД наше все)
   серый КТУЛХУ
 
59 - 26.07.21 - 14:26
(58): не только ради них. ну и у него то агрегатные измерения-реквизиты-ресурсы могут быть. на коленке по екселю придумывать, допиливать "с того конца" и снова на этой стороне ковыряться...
а кд2 - моща! все логично и понятно, хотя сначала и страшновато. настроил правила обмена - натравил на них обработку в источнике - выгрузил - натравил на выгрузку ту же самую обработку в приемнике - загрузил.
   bebibo
 
60 - 26.07.21 - 14:30
Kassern: "получить текущий набор запросом, соединить с результирующей таблицей с данными из экселя, чтобы уже получить готовую таблицу набора. А далее Набор.Загрузить(ВашаТаблица)" - а как их соединить то??
 
 
   серый КТУЛХУ
 
61 - 26.07.21 - 14:30
(59): не не такой технологический цикл чуть.
натравил на источник и на приемник md8xExp.epf - выгрузил файлы описания конфигураций - загрузил их в кд2 в справочник конфигураций - слепил между этими ними в кд2 нужный обмен (создать обмен указать эти две конфигурации - и вперед). мне в свое время именно такого вот описания этой "совершенно прозрачной" процедуры "холодного старта" не хватало.
   bebibo
 
62 - 26.07.21 - 14:30
(57) Обещаю, научусь, но сейчас нужно как можно быстрее это сделать, поэтому нет времени разбираться к сожалению..
   серый КТУЛХУ
 
63 - 26.07.21 - 15:35
(62): неа. вот сейчас у тебя именно тот самый простой случай когда кд2 надо. по прозрачному регламенту - слепишь правила обмена быстро если там структура несложная. если сложная - не так быстро но все равно полнее, точнее и быстрее, чем через ексель.
   Kassern
 
64 - 26.07.21 - 15:50
(60) Вот тебе простой пример, на справочнике валюты...
ВЫБРАТЬ
    Валюты.Ссылка КАК Ссылка,
    Валюты.Код КАК Код
ИЗ
    Справочник.Валюты КАК Валюты
ГДЕ
    Валюты.Код = "643"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Валюты.Ссылка,
    Валюты.Код
ИЗ
    Справочник.Валюты КАК Валюты
ГДЕ
    Валюты.Код = "978"

А теперь суть, берем таблица1 со всеми строками нашего набор, объединяем с таблица2 (это ТЗ полученное из экселя). Сопоставляем поля по измерениям. В итоге получаем таблицу включающую все поля из таблица1 и таблица2. Данный результат пихаем в наш набор ТвойНабор.Загрузить(ТЗИзРезультата) и записать. Все.
   Kassern
 
65 - 26.07.21 - 15:52
(64) важно, чтобы колонки таблицы полученной из экселя имели четко прописанные типы. Тогда нормально отработает соединение таблиц.


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.