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