8.х Загрузка заказов из 2 таблиц excel

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Itsys, 3 апр 2011.

  1. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Добрый день,

    Стоит задача по загрузке заказов из excel. Данные для загрузки представлены в 2 таблицах: таблица с данными шапки документов, одно из полей - номер заказа, и таблица с данными для заказанных товаров, одно из полей - номер заказа.

    Чтение данных буду делать через ADO.

    Вижу 3 варианта как реализовать загрузку:
    1. Читаем таблицу с шапкой, создаем и заполняем шапку документов, затем объект не записывая помещаем в Соответствие, при чтении строк из Соответсвия получаем документ и добавляем строку с ТЧ. После чтения всех файлов проходим по соответсвию и записываем документы.
    Ожидаемая проблема: неизвестно сколько потребуется оперативной памяти для хранения данных соответствия.

    2. Читаем таблицу с шапкой, создаем и заполняем шапку документов, затем объект записываем в базу. При чтении строк, ищем объект в базе данных и добавляем в него строки и поле этого записываем.
    Как видимая проблема увеличение времени загрузки из-за большего количества операций над базой данных, если строки не отсортировать по номеру заказа, то увеличение количества обращений к БД на чтение и запись в разы.

    3. Читаем таблицу с шапкой, создаем и заполняем шапку документов, читаем таблицу строк, заполняем строки документа и записываем его.
    Проблем не вижу, т.к. не знаю каким образом ADO работает с файлами Excel, пока что мне представляется самым оптимальным вариантом.
  2. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    4 вариант ..
    читаем таблицу с заказами... помещаем во временную таблицу.
    читаем шапки, создаем документ, запрсом из временной таблицы выбираем по номеру заказа нужные строки и пишем их в документ.
  3. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Чем это лучше третьего варианта? ADO поддерживает выборку с условием...
  4. Oleg_NSK
    Offline

    Oleg_NSK Опытный в 1С

    Регистрация:
    25 окт 2010
    Сообщения:
    164
    Симпатии:
    0
    Баллы:
    26
    Соответствие работает довольно шустро. Гораздо быстрее нежели таблица значений.
    Чтение через ADO идет очень быстро. У меня Excel таблица из 70 тысяч позиций и восемью колонками считывается в табличное поле за 3 секунды при 2 Гб оперативной памяти.

    Мои предположения по этому пункту:
    Этот вариант надо использовать в крайнем случае при гигантской таблице номенклатуры. Время записи в базу тут будет не критично, но вот ползать по таблицам каждый раз выискивая строку, возможно, займет длительное время, поэтому сортировка обязательна и ее лучше выполнять средствами Excel.

    Этот вариант, на мой взгляд, наилучший.

    ---------------------------
    Мой вариант...
    Запускаю обработку которая все данные выводит в табличные поля на форме (проходит довольно быстро). Далее запускаю расшифровку которая там же в табличном поле из строки ищет соответствие в базе (это выполняется значительно дольше; тут использую массив оптимизации чтобы каждый раз не строить запрос к базе данных, а извлекать ранее встречавшиеся позиции в массиве). Думаю такой вариант оптимален при количестве строк не более 150-200 тыс. строк, так как позволяет визульно просмотреть загружаемые данные.
    Вот процедура которая Excel таблицу преобразует в таблицу значений:

    Код:
    Функция Ексель2ТзАДо(ИмяФайла,ИмяНомерЛиста=Неопределено,HDR=false) Экспорт
    //Если опущен, тогда 1-й лист
    YES_NO = ?(HDR,"YES","NO");
    еБаза=Новый COMОбъект("ADODB.Connection");
    Если Прав(ФайлЗагрузки,3) = "xls" Тогда
    СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = "+ФайлЗагрузки+ "; Extended Properties = ""Excel 8.0;HDR="+YES_NO+";IMEX=1"";";
    Иначе
    СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ФайлЗагрузки+ ";Extended Properties=""Excel 12.0;HDR="+YES_NO+";IMEX=1""";
    КонецЕсли;
    Попытка 
    еБаза.Open(СтрокаПодключения);	
    Исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;
    Catalog = Новый COMОбъект("ADOX.Catalog");
    Catalog.ActiveConnection = еБаза;
    лСпис=Новый СписокЗначений;
    лИмяЛиста="";
    
    Если ИмяНомерЛиста<>Неопределено тогда
    Попытка 
    лИмяЛиста=Catalog.Tables.Item(ИмяНомерЛиста).Name;	 
    Исключение
    КонецПопытки; 
    Конецесли;
    
    Для iCount = 0 По Catalog.Tables.Count-1 Цикл
    Если Catalog.Tables.Item(iCount).Type <> "VIEW" Тогда
    лСпис.Добавить(Catalog.Tables.Item(iCount).Name);	
    КонецЕсли;
    КонецЦикла;
    
    Если лСпис.Количество()>1 и лИмяЛиста="" тогда
    лИмяЛиста=лСпис.ВыбратьЭлемент("Выберите имя листа");
    Иначе
    лИмяЛиста=лСпис[0];
    Конецесли;	
    Catalog=Неопределено;
    лСтрВнЗапроса="select * from ["+лИмяЛиста+"]";
    RS = Новый COMОбъект("ADODB.Recordset");
    RS.Open(лСтрВнЗапроса,еБаза,0);
    
    лТз=Новый ТаблицаЗначений;
    Для iCount = 0 По RS.Fields.Count-1 Цикл
    лТз.Колонки.Добавить(,,RS.Fields.Item(iCount).Name);
    КонецЦикла;
    
    // Перебор данных
    Если НЕ RS.EOF Тогда
    RS.MoveFirst();
    Пока RS.EOF() = 0 Цикл
    лТз.Добавить();
    Для iCount = 0 По RS.Fields.Count-1 Цикл
    //сообщить(rs.Fields(iCount).Value);
    лТз[лтз.Количество()-1][iCount]=Строка(RS.Fields(iCount).Value);
    КонецЦикла;
    RS.MoveNext();  
    КонецЦикла;
    КонецЕсли; 
    RS=Неопределено;
    еБаза.Close();
    еБаза=Неопределено;
    Возврат лТз;
    Конецфункции
    
  5. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Решение нашлось, надеюсь самое оптимальное. Т.к. файл с заказами один, обе таблицы располагаются на разных закладках, сделал выборку через ADO объединением
    Код:
    Select * from [Таблица1$] as Orders inner join [Таблица2$] as Goods on Orders.OrderID = Goods.OrderID
    

Поделиться этой страницей