Excel или XML

1. ArCtic 3 24.04.17 19:09 Сейчас в теме
Вопрос собственно такой, сделал обработку для загрузки новой номенклатуры, закупочных цен из Excel в 1с, если в 1с есть такой артикул то не создаем.в прайсе 80 000 наименований, грузится все оооочень долго. Если сделать загрузку из XML быстрее будет обрабатываться прайс или нет?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. comptr 57 24.04.17 20:27 Сейчас в теме
(1) а чтение из Excel как реализовано? "Новый COMОбъект("Excel.Application")" или через "Новый COMОбъект("ADODB.Connection")"?
8. ArCtic 3 25.04.17 08:38 Сейчас в теме
(3)
а чтение из Excel как реализовано? "Новый COMОбъект("Excel.Application")" или через "Новый COMОбъект("ADODB.Connection")"?

первый вариант. Есть ли разница по времени работы?
10. comptr 57 25.04.17 08:51 Сейчас в теме
(8) да, есть. Предлагаю взять готовые функции, прочитать файл в ТЗ, дальше уже её в запрос и там искать номенклатуру.
http://newblog.kz/posts/view/131


(6) А что за "ПрочитатьТаблицу()" ? Это которое "ТабличныйДокумент.Прочитать(ПутьКФайлуЭксель)"? И зачем? Чтобы потом опять разбирать уже ТабДок? Почему сразу не получить ТЗ, если вопрос стоит в простой, судя по всему, загрузке по артикулу? И для этого платформа должна быть не ниже 8.3.6.
13. KazanKokos 11 25.04.17 09:18 Сейчас в теме
(8) разница бешенная.
17. PhoenixAOD 62 25.04.17 09:29 Сейчас в теме
(3)да тут дело не в методе даже, а просто он получает из экселя артикул и по всей номенклатуре его погнал, получил второй и так же и так все 80к прогоняет. естественно будет долго.
5. PhoenixAOD 62 25.04.17 05:08 Сейчас в теме
(1)Может тогда уже сделать проще? Загружаем данные из Экселя во временную таблицу, и уже с этой временной таблицей путем запросов и левых соединений работаем? А так получается, что читаем строку из экселя ищем в 80к строках справочника номенклатура, и так далее и так далее. В разы быстрее будет ИМХО
9. ArCtic 3 25.04.17 08:39 Сейчас в теме
(5)можно конкретный пример загрузки в ТЧ?
14. KazanKokos 11 25.04.17 09:22 Сейчас в теме
(9)
всовываете в общий модуль с галочкой "клиент". у меня на сервере не отрабатывает. код взят с инфостарта. тему не помню.


//Процедуры работы с EXEL файлами через ADO (ODBC)
Функция СоединитьсяСADO(ИмяФайла) Экспорт
    Поз = 0;
    Найден = 1;
    ТмпСтр = ИмяФайла;
    Пока Найден <> 0 Цикл
        Найден = Найти(ТмпСтр,"\");
        ТмпСтр = Прав(ТмпСтр,СтрДлина(ТмпСтр) - Найден);
        Если Найден <> 0 Тогда
            Поз = Найден;
        КонецЕсли;
    КонецЦикла;
    Путь = Лев(ИмяФайла,Поз-1);                     
    
    Данные = Новый Структура;
    СтрокаСоединения = "
    | Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+СокрЛП(ИмяФайла)+";
    | Extended Properties=""Excel 12.0 Xml;HDR=YES""";
    Соединение = Новый COMОбъект("ADODB.Connection");    
    Попытка        
        Соединение.Open(СтрокаСоединения);                   
	Исключение 
		Тест = ОписаниеОшибки();
        Сообщить ("Не возможно подключится к Microsoft Excel Driver!!!        
        |Возможно файл ["+ИмяФайла+"] открыт другим пользователем. 
		|Описание ошибки: "+ Символы.ПС + Тест);        
        Возврат Неопределено;
    КонецПопытки;
    Данные.Вставить("Соединение",Соединение);
    Возврат Данные;
КонецФункции

Процедура ОтключитьсяОтADO(Подключение) Экспорт
    Попытка
        Подключение["Соединение"].Close();
        Подключение = Неопределено;
    Исключение
    КонецПопытки;
КонецПроцедуры

Функция ВыполнитьЗапросADO(ТекстЗапроса,Подключение) Экспорт
    Попытка        
        Записи = Новый COMОбъект("ADODB.Recordset");                   
    Исключение        
        Сообщить ("Не удалось создать  Microsoft Excel Driver!!!");        
        Возврат Неопределено;
    КонецПопытки;
    Попытка
        Записи.Open(ТекстЗапроса, Подключение["Соединение"]);
        Возврат Записи;
    Исключение
        Сообщить ("Проблемы с выполнением запроса");
    КонецПопытки;    
КонецФункции
Показать
15. KazanKokos 11 25.04.17 09:25 Сейчас в теме
16. PhoenixAOD 62 25.04.17 09:28 Сейчас в теме
(9) Просо создаете таблицу значений программно, задаете нужные колонки и их заполняете через цикл, и все. а потом эту таблицу загружаете в запрос помещаете во временную таблицу, потом во вторую таблицу отбираете всю номенклатуру, потом соединяете по номенклатуре, или уже как там Вам нужно и все
18. antz 25.04.17 10:11 Сейчас в теме
Для чтения из Excel предложу еще ComSafeArray.

Excel = ПолучитьCOMОбъект(Диалог.ПолноеИмяФайла);
Значения = Excel.Sheets(1).UsedRange.Value.Unload();

Переменная Значения - это массив, заполненный массивами со значениями колонок листа экселя.
21. herfis 522 25.04.17 11:54 Сейчас в теме
(18) Работать с Excel на чтение через его объектную модель - это ересь. Это как из пушки по воробьям. Очень медленно и проблемно.
Вот запись ComSafeArray способен ускорить в разы. Потому как поячеечная запись тормозит как не в себя.
2. VmvLer 24.04.17 19:26 Сейчас в теме
от более медленных к более быстрым формам для пакетов данных в десятки тысяч:

Excel > XML > Json
4. E_Johnny 25.04.17 04:43 Сейчас в теме
в конфигураторе есть функция "Замер производительности". Можете запустить ее при загрузки номенклатуры и найти самые трудозатратные моменты загрузки.
и эти замеры можете произвести с разными форматами.
Но думаю основная проблема будет не в формате файла, а в поиске номенклатуры
6. SyachinS 25.04.17 07:21 Сейчас в теме
Я считаю что надо воспользоваться методом ПрочитатьТаблицу() - штатный механизм, причем достаточно быстрый
7. ArCtic 3 25.04.17 08:36 Сейчас в теме
да, больше всего времени уходит на
СпрНоменклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",СокрЛП(ExcelЛист.Cells(Row,4).Text));
, заменил запросом, замерил - больше всего уходит время на чтение данных из Excel. Можно ли одним махом загрузить данные из файла во временную таблицу 1С? Если можно с примерами.
11. ipoloskov 165 25.04.17 09:07 Сейчас в теме
(7) если большая часть времени уходит на поиск, то:
1) загружаете артикулы в таблицу
2) подсовываете эти артикулы (все сразу) в запрос
Выбрать Ссылка, Артикул из Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Артикул В (&МассивАртикулов);

3) выполняете запрос.
4) заполняете ссылки в таблице:
Для Каждого Строчка Из Таблица Цикл
Выборка.Сбросить();
Если Выборка.НайтиСледующий(Строчка.Артикул, "Артикул") Тогда
Строчка.НоменклатураСсылка = Выборка.Ссылка;
КонецЕсли;
КонецЦикла;

Ускорение будет в разы.
alex-l19041; +1 Ответить
12. KazanKokos 11 25.04.17 09:17 Сейчас в теме
(7) грузите через ADO. очень быстро. недостаток только один. теряете группировки. то есть папки создать не сможете и всё новое грузите сплошным листом. хотя может это я не смог. Пытался копаться в RecordSet так и не допер как. поэтому пока тоже мучаюсь с эксель. Но сейчас все идет к тому что регламенты загрузки цен и остатков поставщиков(каждый занимает полчаса) скоро не будут умещаться в сутки и придется на АДО возвращаться....
19. herfis 522 25.04.17 11:45 Сейчас в теме
Вот тебе примитивное решение. Только не на любом файле будет адекватный результат. В идеале - нужен однолистовой простой структуры.
Функция Excel_ПолучитьТаблицу836(ПутьКФайлу,  СообщенияОбОшибках = "") Экспорт
	
	ТаблицаРезультата = Неопределено;
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	
	// импорт файла Excel в табличный документ
	Попытка
        ТабличныйДокумент.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Текст);
    Исключение
		СообщенияОбОшибках = "Ошибка при импорте файла Excel " + ПутьКФайлу + ": " + ОписаниеОшибки();
        Возврат ТаблицаРезультата;
    КонецПопытки;
    
    КвоСтрок = ТабличныйДокумент.ВысотаТаблицы;
    КвоКолонок = ТабличныйДокумент.ПолучитьОбласть().ШиринаТаблицы;
    
    Если КвоСтрок = 0 Тогда
		СообщенияОбОшибках = "Ошибка при импорте файла Excel " + ПутьКФайлу + ": файл пуст";
        Возврат ТаблицаРезультата;
	КонецЕсли;
	
	ТаблицаРезультата = Новый ТаблицаЗначений;
	
	// создание колонок таблицы значений
	Для НомерКолонки = 1 По КвоКолонок Цикл
		ТаблицаРезультата.Колонки.Добавить();
	КонецЦикла;
	
	// перенос содержимого ячеек табличного документа в таблицу значений
	Для НомерСтроки = 1 По КвоСтрок Цикл
		
		СтрокаРезультата = ТаблицаРезультата.Добавить();
		
		Для НомерКолонки = 1 По КвоКолонок Цикл
			
			Область = ТабличныйДокумент.ПолучитьОбласть(НомерСтроки, НомерКолонки).ТекущаяОбласть;
			СтрокаРезультата[НомерКолонки - 1] = Область.Текст;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат ТаблицаРезультата;
	
КонецФункции
Показать
20. herfis 522 25.04.17 11:48 Сейчас в теме
Сам в большинстве случаев по-старинке читаю через ADO. Там у меня и распознавание листов прикручено и примитивные типы автоматом преобразуются и т.п.
Но если есть возможность сделать через XML - надо делать через XML. Excel - это ни разу не транспортный формат.
Для отправки сообщения требуется регистрация/авторизация

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот