gifts2017

Загрузка данных из Excel 1С 8.1

Опубликовал Denis Soldatkin (djdos) в раздел Обработки - Ценообразование, прайсы

Ситуация, когда торговые компании получают прайсы от поставщиков в формате Excel - довольно распространенная. И заносить эти прайсы вручную в 1С - занятие довольно трудоемкое, особенно если речь идет о десятках тысяч номенклатурных позиций. Написав небольшую обработку. можно полностью автоматизировать данную задачу.

Рассмотрим пример.
Допустим у нас есть файл Excel. На первом листе присутствует следующая таблица данных:

Код Наименование Розничная цена
6461 Ванна Evolution 180x102/87 525
39311 Ванна Evolution PU-PLUS 180x102/87 675
11225 Ванна Magnolia 1,7х0.75 800
3567 Ванна Magnolia 1,8х0.75 700


Для импорта данных используем следующую функцию:

//Номер листа в книге Excel для получения данных
НомерЛиста         = 1;
   
//Пытаемся подключиться к Excel
Попытка
    Excel = новый COMОбъект("Excel.Application");
Исключение
    Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
    Возврат;
КонецПопытки;     
   
//Подключились удачно, открываем файл
Excel.Workbooks.Open(ИмяФайла);
   
//Открываем необходимый лист
Excel.Sheets(НомерЛиста).select();   
   
//Получим количество строк и колонок.
//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
Если Версия = "8" тогда
    ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
    ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
    ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
    ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;   
Конецесли;
 
//Для установки цен необходимо создать документ "Установка цен номенклатуры"
//Заполним шапку документа, в т.ч. заполним тип цены и валюту
ТипЦеныРозничный                 = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");
НоваяСтрока                      = ДокументУстановкиЦенГривна.ТипыЦен.Добавить();
НоваяСтрока.ТипЦен               = ТипЦеныРозничный;
ДокументУстановкиЦенГривна.Дата  = ТекущаяДата();
ВалютаГривна                     = Справочники.Валюты.НайтиПоКоду("980");
   
//определим по файлу в каких колонках необходимые данные
НомерКолонкиКодаТовара             = 1;
НомерКолонкиНаименованияТовара     = 2;
НомерКолонкиЦеныТовара             = 3;
   
// Выбираем данные из файла
Для а = НомерСтрокиТЧ по ФайлСтрок Цикл           
       
    //Получим данные из соответсвующих ячеек
    КодТовара             = СокрЛП(Excel.Cells(а,НомерКолонкиКодаТовара).Value);
    НаименованиеТовара    = СокрЛП(Excel.Cells(а,НомерКолонкиНаименованияТовара).Value);
    Цена                  = Число(Excel.Cells(а,НомерКолонкиЦеныТовара).Value);
       
    Товар = Справочники.Номенклатура.ПустаяСсылка();       
       
    // Ищем товар в справочнике по коду 
    Товар = Справочники.Номенклатура.НайтиПоКоду(КодТовара);
       
    // Если не нашли по коду, то ищем по наименованию
    Если Товар.Пустая() Тогда
        Товар = Справочники.Номенклатура.НайтиПоНаименованию(тНаименование, Истина);
    Конецесли;
       
    //Если не нашли создаем новый
    Если Товар.Пустая() Тогда
        Товар                      = Справочники.Номенклатура.СоздатьЭлемент();
        Товар.Код                  = КодТовара;
        Товар.Наименование         =  НаименованиеТовара;
        Товар.НаименованиеПолное   =  НаименованиеТовара;
        Товар.Записать();
    Конецесли;   
       
    //Запишем товар и цену в документ установки цен
    НоваяСтрока                     = ДокументУстановкиЦенГривна.Товары.Добавить();
    НоваяСтрока.Валюта              = ВалютаГривна;
    НоваяСтрока.Цена                = Цена;
    НоваяСтрока.Номенклатура        = Товар.Ссылка;                
    НоваяСтрока.ТипЦен              = ТипЦеныРозничный;         
Конеццикла;
 
//Если в документе есть товары записываем и проводим
Если Не(ДокументУстановкиЦенГривна.Товары.Количество() = 0) Тогда
    ДокументУстановкиЦенГривна.Записать(РежимЗаписиДокумента.Запись);
    ДокументУстановкиЦенГривна.Записать(РежимЗаписиДокумента.Проведение);
Конецесли;   
   
//Закрываем Excel
Excel.ActiveWorkbook.Close();   

См. также

Подписаться Добавить вознаграждение

Комментарии

1. artem666 Bogomaz (artem666) 15.04.10 19:24
сколько раз уже поднималась тема на счет загрузки из Экселя... твой метод при больших объемах ооооооооччченььь медленный, уже нав. 100 раз говорили про ADO
2. Армен Арабханян (Arabo_xv) 19.04.10 16:18
дайте пожалуйста ссылку где с помощью ADO загружают данные из EXCEL
3. PlatonovStepan (Jogeedae) 21.04.10 03:14
народ универсальные вещи корячится-делает, а у вас обычный частный случай :)...

для Arabo_xv,artem666 :
а как называется метод загрузки в ТЗ по колонкам массивом ?
4. Сергей (MoneG2) 21.04.10 05:31
Товар = Справочники.Номенклатура.НайтиПоНаименованию(тНаименование, Истина);


>> Товар = Справочники.Номенклатура.НайтиПоНаименованию(НаименованиеТовара, Истина);
5. Сергей Толмачев (sss999) 21.04.10 11:02
главное что работает!!!а адо слово слишком страшное,никаких дел иметь с адо аж не хочется))
7. Алекс Ю (AlexO) 02.07.10 18:29
Работает?! Что работает - строка "Excel = новый COMОбъект("Excel.Application")"?
Больше похоже на учебный файл или сборную солянку.
Откуда появился НомерСтрокиТЧ в:
"Для а = НомерСтрокиТЧ по ФайлСтрок Цикл"?

Где создание документа ДокументУстановкиЦен?
(а потом еще и ТЧ ДокументУстановкиЦенГривна, я так понимаю).
8. Sergey (zsrg) 13.07.10 09:27
ADO конечно хорошо, но проблема появляется при работе с Excel'евскими документами, сохраненными из 1С 8-ки. Дело в том, что числа с буквенным префиксом 8-ка сохраняет как число без префикса, а сам префикс хранит в описании формата вывода ячейки. На экране с префиксом, а в ячейке без префикса. При обработке через АДО мы доступ к префиксу не получаем и имеем серьезные проблемы.
Но данный пример всеравно "кривой" и не имеет универсальности. Плюс ко всему не учитывает ситуацию, когда документ состоит из большого количества узких колонок, который потом объединяются под нужный размер.
Я писал универсальную загрузку для 7-ки, которая автоматически находила табличную часть и определяла в какой колонке товар, артикул цена и т.п. А так же автоматически учитывала формат листа и т.п. Но впоследствии пришлось адаптировать под конкретные задачи.
Сделать 100% универсальную обработку практически невозможно, но попыток я не оставляю :)
9. OBEH (OBEH) 30.09.10 07:16
Посмотри на ИТС. Там, действительно, универсальная вещь по загрузке. И не только из файла, типа, EXEL.
Сам только что хотел набросать обработку для загрузки. Структура присланного файла заранее не была определена. Но обработкой с ИТС за 5 минут решилось все. Просто и элегантно.
10. Евген Сок (6630) 03.05.12 08:40
спасибо большое за выложенный код, хочу разобраться с переносом из excel и с вашей помощью надеюсь у меня получится
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа