Кэширование файла Excel (без загрузки в базу данных).

Способ работы с большим файлом Excel, так же быстро, как с обычной таблицей (при помощи кэширования).

При первом открытии обработки видим надпись Файл не загружен

Загрузим вот такой файл Excel  для примера

Теперь при открытии обработки видим, что файл загружали и дату последней загрузки.

В дальнейшем при открытии обработки можно сразу жать кнопку Выполнить.

Сделал это с помощью выгрузки ТаблицыЗначений в файл и последующего использования этого файла.

По нажатию кнопки обновить:

Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
Сообщить("Выберите файл для загрузки!");
Возврат;
КонецЕсли;

Док = ПолучитьCOMОбъект(ПутьКФайлу);

НомерЛиста = 1;
ВсегоСтрок = Док.Sheets.Item(НомерЛиста).UsedRange.Rows.Count();

КЧ = Новый КвалификаторыЧисла(10,0);
КС = Новый КвалификаторыСтроки(200);
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
Массив.Очистить();
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);

ТЗЕксель = Новый ТаблицаЗначений;
ТЗЕксель.Колонки.Добавить("Наименование",ОписаниеТиповС);
ТЗЕксель.Колонки.Добавить("Количество",ОписаниеТиповЧ);

Для сч = 1 По ВсегоСтрок Цикл
Наименование    =СокрЛП(Док.Sheets(НомерЛиста).Cells(сч, 1).Value);
Количество =СокрЛП(Док.Sheets(НомерЛиста).Cells(сч, 2).Value);
НовСтр = ТЗЕксель.Добавить();
НовСтр.Наименование = Наименование;
НовСтр.Количество = Количество;
КонецЦикла;

УдалитьФайлы(ВремХранилище, "*.sel");
ИмяФайла = СтрЗаменить(ТекущаяДата(),":",".");
ЗначениеВФайл(ВремХранилище+ИмяФайла+".sel",ТЗЕксель);
ЭлементыФормы.НадписьФайл.Заголовок = "Файл Excel последний раз обновлялся: " + ИмяФайла;

При открытии:

ВремХранилище = КаталогВременныхФайлов() + "excel";
Файл = Новый Файл(ВремХранилище);
Если Не Файл.Существует() Тогда
СоздатьКаталог(ВремХранилище);
Иначе
МассивНайденных = НайтиФайлы(ВремХранилище, "*.sel");

Если МассивНайденных.Количество() > 0 Тогда
ЭлементыФормы.НадписьФайл.Заголовок = "Файл Excel последний раз обновлялся: " + МассивНайденных[0].ИмяБезРасширения;
ТЗЕксель = ЗначениеИзФайла(ВремХранилище + МассивНайденных[0].Имя);
Иначе
ЭлементыФормы.НадписьФайл.Заголовок = "Файл Excel не загружали!";
КонецЕсли;
КонецЕсли;

По нажатию кнопки Выполнить:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТЗЕксель.Наименование,
| ТЗЕксель.Количество
|ПОМЕСТИТЬ ВТ
|ИЗ
| &ТЗЕксель КАК ТЗЕксель
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ.Наименование,
| СУММА(ВТ.Количество) КАК Количество
|ИЗ
| ВТ КАК ВТ
|
|СГРУППИРОВАТЬ ПО
| ВТ.Наименование";
Запрос.УстановитьПараметр("ТЗЕксель",ТЗЕксель);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование +" = "+ Выборка.Количество);
КонецЦикла;


 



8 Comments

  1. Yashazz

    Тю… Я-то понадеялся на ADODB…

    Reply
  2. Gureev

    ерунда какая-то… ладно нет АДОДВ, так можно хотя бы область выгрузить! а не считывать поячеечно документ.

    а если колонок 100, а строк 100тыщ ? этот алгоритм будет работать вечно.

    ничего быстрого. заголовок не соответствует содержимому.

    Reply
  3. ander_

    хм, «(без загрузки в базу данных)»…

    а это что?

    Для сч = 1 По ВсегоСтрок Цикл
    Наименование    =СокрЛП(Док.Sheets(НомерЛиста).Cells(сч, 1).Value);
    Количество =СокрЛП(Док.Sheets(НомерЛиста).Cells(сч, 2).Value);
    НовСтр = ТЗЕксель.Добавить();
    НовСтр.Наименование = Наименование;
    НовСтр.Количество = Количество;
    КонецЦикла;

    или надо понимать фразу как «мы же в справочники/документы/регистры не сохраняем» ? 🙂

    Reply
  4. John_d

    (2) Gureev, смысл не в том как загрузить ексель в ТаблицуЗначений.

    А в том, что загрузить можно всего один раз. А дальше пользоваться уже сохраненной ТаблицейЗначений.

    Reply
  5. DrAku1a

    Если XLSX — то его можно безо всяких драйверов читать (на ИС есть примеры прямого чтения) — это ж набор XML, обжатых в ZIP.

    А вообще, статью правильнее назвать например «Кэширование читаемых Excel-файлов»…

    Reply
  6. Yashazz

    А как тут минуснуть можно?

    Reply
  7. mihast

    Нда… Кэширование входного файла… Это ж только при разработке/отладке один и тот же файл по 20 раз загружаешь… Да и там у меня, например, основные косяки с тем, что из Excel в 1С что-то не так загрузилось, а значит надо файл по новой загружать…

    Короче — не могу даже придумать когда ЭТО реально может быть нужно…

    Reply
  8. John_d

    (7) mihast, Например когда типовая конфа и она такой должна остаться. Нужно написать дополнительную обработку которая часть данных берет из Excel.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *