Имя: Пароль:
1C
1С v8
Загрузка данных из экселя в РС
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) важно, чтобы колонки таблицы полученной из экселя имели четко прописанные типы. Тогда нормально отработает соединение таблиц.