По теме из базы знаний
- Загрузка поступлений от поставщиков из товарных накладных в формате xlsx, xml, mxl
- Обработка по загрузке номенклатуры из файлов Еxcel и / или xml
- Загрузка изображений (картинок) по ссылке из файла форматов YML (Yandex Market Format) или XML (управляемые формы)
- Гибкая выгрузка документов (Excel, CSV, JSON, XML, TXT) в 1С
- ObjectFlow — сервис загрузки данных в 1С из Excel и CSV без программирования
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(8) да, есть. Предлагаю взять готовые функции, прочитать файл в ТЗ, дальше уже её в запрос и там искать номенклатуру.
(6) А что за "ПрочитатьТаблицу()" ? Это которое "ТабличныйДокумент.Прочитать(ПутьКФайлуЭксель)"? И зачем? Чтобы потом опять разбирать уже ТабДок? Почему сразу не получить ТЗ, если вопрос стоит в простой, судя по всему, загрузке по артикулу? И для этого платформа должна быть не ниже 8.3.6.
(6) А что за "ПрочитатьТаблицу()" ? Это которое "ТабличныйДокумент.Прочитать(ПутьКФайлуЭксель)"? И зачем? Чтобы потом опять разбирать уже ТабДок? Почему сразу не получить ТЗ, если вопрос стоит в простой, судя по всему, загрузке по артикулу? И для этого платформа должна быть не ниже 8.3.6.
17.
PhoenixAOD
62
25.04.17 09:29
Сейчас в теме
(3)да тут дело не в методе даже, а просто он получает из экселя артикул и по всей номенклатуре его погнал, получил второй и так же и так все 80к прогоняет. естественно будет долго.
5.
PhoenixAOD
62
25.04.17 05:08
Сейчас в теме
(1)Может тогда уже сделать проще? Загружаем данные из Экселя во временную таблицу, и уже с этой временной таблицей путем запросов и левых соединений работаем? А так получается, что читаем строку из экселя ищем в 80к строках справочника номенклатура, и так далее и так далее. В разы быстрее будет ИМХО
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(ТекстЗапроса, Подключение["Соединение"]);
Возврат Записи;
Исключение
Сообщить ("Проблемы с выполнением запроса");
КонецПопытки;
КонецФункции Показать
16.
PhoenixAOD
62
25.04.17 09:28
Сейчас в теме
(9) Просо создаете таблицу значений программно, задаете нужные колонки и их заполняете через цикл, и все. а потом эту таблицу загружаете в запрос помещаете во временную таблицу, потом во вторую таблицу отбираете всю номенклатуру, потом соединяете по номенклатуре, или уже как там Вам нужно и все
Для чтения из Excel предложу еще ComSafeArray.
Переменная Значения - это массив, заполненный массивами со значениями колонок листа экселя.
Excel = ПолучитьCOMОбъект(Диалог.ПолноеИмяФайла);
Значения = Excel.Sheets(1).UsedRange.Value.Unload();
Переменная Значения - это массив, заполненный массивами со значениями колонок листа экселя.
(18) Работать с Excel на чтение через его объектную модель - это ересь. Это как из пушки по воробьям. Очень медленно и проблемно.
Вот запись ComSafeArray способен ускорить в разы. Потому как поячеечная запись тормозит как не в себя.
Вот запись ComSafeArray способен ускорить в разы. Потому как поячеечная запись тормозит как не в себя.
в конфигураторе есть функция "Замер производительности". Можете запустить ее при загрузки номенклатуры и найти самые трудозатратные моменты загрузки.
и эти замеры можете произвести с разными форматами.
Но думаю основная проблема будет не в формате файла, а в поиске номенклатуры
и эти замеры можете произвести с разными форматами.
Но думаю основная проблема будет не в формате файла, а в поиске номенклатуры
да, больше всего времени уходит на , заменил запросом, замерил - больше всего уходит время на чтение данных из Excel. Можно ли одним махом загрузить данные из файла во временную таблицу 1С? Если можно с примерами.
СпрНоменклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",СокрЛП(ExcelЛист.Cells(Row,4).Text));
(7) если большая часть времени уходит на поиск, то:
1) загружаете артикулы в таблицу
2) подсовываете эти артикулы (все сразу) в запрос
3) выполняете запрос.
4) заполняете ссылки в таблице:
Ускорение будет в разы.
1) загружаете артикулы в таблицу
2) подсовываете эти артикулы (все сразу) в запрос
Выбрать Ссылка, Артикул из Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Артикул В (&МассивАртикулов);3) выполняете запрос.
4) заполняете ссылки в таблице:
Для Каждого Строчка Из Таблица Цикл
Выборка.Сбросить();
Если Выборка.НайтиСледующий(Строчка.Артикул, "Артикул") Тогда
Строчка.НоменклатураСсылка = Выборка.Ссылка;
КонецЕсли;
КонецЦикла;Ускорение будет в разы.
12.
KazanKokos
11
25.04.17 09:17
Сейчас в теме
(7) грузите через ADO. очень быстро. недостаток только один. теряете группировки. то есть папки создать не сможете и всё новое грузите сплошным листом. хотя может это я не смог. Пытался копаться в RecordSet так и не допер как. поэтому пока тоже мучаюсь с эксель. Но сейчас все идет к тому что регламенты загрузки цен и остатков поставщиков(каждый занимает полчаса) скоро не будут умещаться в сутки и придется на АДО возвращаться....
Вот тебе примитивное решение. Только не на любом файле будет адекватный результат. В идеале - нужен однолистовой простой структуры.
Функция Excel_ПолучитьТаблицу836(ПутьКФайлу, СообщенияОбОшибках = "") Экспорт
ТаблицаРезультата = Неопределено;
ТабличныйДокумент = Новый ТабличныйДокумент;
// импорт файла Excel в табличный документ
Попытка
ТабличныйДокумент.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Текст);
Исключение
СообщенияОбОшибках = "Ошибка при импорте файла Excel " + ПутьКФайлу + ": " + ОписаниеОшибки();
Возврат ТаблицаРезультата;
КонецПопытки;
КвоСтрок = ТабличныйДокумент.ВысотаТаблицы;
КвоКолонок = ТабличныйДокумент.ПолучитьОбласть().ШиринаТаблицы;
Если КвоСтрок = 0 Тогда
СообщенияОбОшибках = "Ошибка при импорте файла Excel " + ПутьКФайлу + ": файл пуст";
Возврат ТаблицаРезультата;
КонецЕсли;
ТаблицаРезультата = Новый ТаблицаЗначений;
// создание колонок таблицы значений
Для НомерКолонки = 1 По КвоКолонок Цикл
ТаблицаРезультата.Колонки.Добавить();
КонецЦикла;
// перенос содержимого ячеек табличного документа в таблицу значений
Для НомерСтроки = 1 По КвоСтрок Цикл
СтрокаРезультата = ТаблицаРезультата.Добавить();
Для НомерКолонки = 1 По КвоКолонок Цикл
Область = ТабличныйДокумент.ПолучитьОбласть(НомерСтроки, НомерКолонки).ТекущаяОбласть;
СтрокаРезультата[НомерКолонки - 1] = Область.Текст;
КонецЦикла;
КонецЦикла;
Возврат ТаблицаРезультата;
КонецФункции Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот