helpf.pro
Регистрация
 +3 
Распечатать

Универсальная функция для чтения данных из Excel в 1С

Иногда требуется разобрать данные из Excel в 1С.
Я считаю что легче и быстрей поместить все данные в ТаблицуЗначений и уже там ими манипулировать.
Пример 2-х функций которые я использую:
ИзExcelВТаблицу – Читает Excel в ТаблицуЗначений
ЭлементСправочника – Создает или находит элемент справочника.
Теперь сам код:
Код 1C v 8.х
 // Загрузка данных из Excel файла в ТаблицуЗначений 
// Возвращает ТаблицуЗначений с данными 
// ПутьДоExcel - путь до Excel файла
// НомерСтраницы - Номер страницы в Excel
// ПерСтрокаЗаголовок - первая строка Excel содержит имена столбцов
// ФормаИндикатора - Стандартная форма прогресса работы
Функция ИзExcelВТаблицу(ПутьДоExcel, НомерСтраницы = 1, ПерСтрокаЗаголовок = Ложь , ФормаИндикатора = Неопределено)
    Попытка
        Док = ПолучитьCOMОбъект(ПутьДоExcel); 
    Исключение
        Сообщить("Произошла ошибка при обращение к Excel:" + Символы.ПС + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;       
 
    ЗакрытьФормуИндиктаора = Ложь;  
    Если ФормаИндикатора = Неопределено тогда
        ЗакрытьФормуИндиктаора = Истина;
        ФормаИндикатора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");       
        ФормаИндикатора.Открыть();  
    КонецЕсли;      
    ФормаИндикатора.КомментарийЗначения = "Загрузка данных из Excel...";
     
    ТЗ = Новый ТаблицаЗначений();   
    Страница = Док.Sheets(НомерСтраницы);
    МакСтрок = Страница.UsedRange.Rows.Count;       // макс. колич. строк
    МакСтолб = Страница.UsedRange.Columns.Count;    // макс. колич. столбцов    
     
    Для Столбец = 1 по МакСтолб цикл
        ИмяСтолбца = "Столбец_"  + Столбец;
        Если ПерСтрокаЗаголовок тогда
            ИмяСтолбца = Страница.Cells(1,Столбец).Value;
            ИмяСтолбца = СокрЛП(ИмяСтолбца);
            ИмяСтолбца = СтрЗаменить(ИмяСтолбца," ","_");
        КонецЕсли;                      
        ТЗ.Колонки.Добавить(ИмяСтолбца, Новый ОписаниеТипов("Строка"));
    КонецЦикла; 
     
    НачальнаяСтрока = 1;    
    Если ПерСтрокаЗаголовок тогда                                       
        НачальнаяСтрока = 2;
    КонецЕсли;          
     
    Для НомСтрока = НачальнаяСтрока по МакСтрок цикл
        СтрТЗ = ТЗ.Добавить();
        Для НомСтолбец = 1 по МакСтолб цикл
            Данные = Страница.Cells(НомСтрока,НомСтолбец).Value;                
            СтрТЗ[НомСтолбец-1] = Данные;
        КонецЦикла;     
         
        ФормаИндикатора.ЭлементыФормы.Индикатор.Значение = НомСтрока/МакСтрок * 100;        
    КонецЦикла;     
     
    Если ЗакрытьФормуИндиктаора тогда
        ФормаИндикатора.Закрыть();
    КонецЕсли;      
     
    Возврат ТЗ; 
КонецФункции    


Пример вызова:
Код 1C v 8.х
 ФормаИндикатора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикатора.НаименованиеОбработкиДанных = "Загрузка данных...";     
ФормаИндикатора.Открыть();  
     
ТЗ = ИзExcelВТаблицу(ФайлExcel,1,Истина,ФормаИндикатора);       
Если ТЗ = Неопределено тогда
    ФормаИндикатора.Закрыть();
    Возврат;
КонецЕсли;              
     
ФормаИндикатора.Закрыть();   

или
Код 1C v 8.х
 ТЗ = ИзExcelВТаблицу(ФайлExcel);        
Если ТЗ = Неопределено тогда
    Возврат;
КонецЕсли;    


Теперь функция которой я использую когда надо создать элемент справочника из полученных данных.
Код 1C v 8.х
 // Создаем в справочнике "ИмяСправочника" элемент
// ИмяЭлемента - Имя созданного элемента в справочнике "ИмяСправочника"
// ИмяРодителя - Имя родительского элемента (отсутствует если не древовидный).
//               Разделитель \\ позволяет писать древовидный путь родителя из нескольких элементов
// Параметры - Соответствие содержащие список параметров для элемента
// СоздатьЕслиНетЭлемента - Создает элемент если нет. Иначе ищет и обновляет
Функция ЭлементСправочника(ИмяСправочника = "",ИмяЭлемента, ИмяРодителя = Неопределено, Параметры = Неопределено, СоздатьЕслиНетЭлемента=Истина)
    Если ИмяСправочника = "" тогда
        Сообщить("Укажите имя спрачоника - ЭлементСправочника()");
        Возврат Неопределено;
    КонецЕсли;      
     
    Если ПустаяСтрока(ИмяЭлемента) тогда
        Возврат Неопределено;
    КонецЕсли;      
     
    // Создаем или ищем родителя
    Родитель = Неопределено;    
    Если ИмяРодителя <> Неопределено тогда
         
        ОбрабатИмяРодителя = ИмяРодителя;
        РодительГруппы = Справочники[ИмяСправочника].ПустаяСсылка();
         
        Пока НЕ ПустаяСтрока(ОбрабатИмяРодителя) цикл
             
            ПозРазделителя = Найти(ОбрабатИмяРодителя,"\\");
            Если ПозРазделителя = 0 тогда
                ИмяГруппы = ОбрабатИмяРодителя;
                ОбрабатИмяРодителя = ""                       
            Иначе
                ИмяГруппы = Сред(ОбрабатИмяРодителя,1, ПозРазделителя-1);               
                ОбрабатИмяРодителя = Сред(ОбрабатИмяРодителя,ПозРазделителя+2);                 
            КонецЕсли;      
             
            ТексЗапроса = "ВЫБРАТЬ
                          | Данные.Ссылка
                          |ИЗ
                          | Справочник."+ИмяСправочника+" КАК Данные
                          |ГДЕ
                          | Данные.Родитель = &Родитель
                          | И Данные.Наименование = &Наименование
                          | И Данные.ЭтоГруппа";
                           
            ЗапросРодителя = Новый Запрос(ТексЗапроса);
            ЗапросРодителя.УстановитьПараметр("Родитель", РодительГруппы);
            ЗапросРодителя.УстановитьПараметр("Наименование", ИмяГруппы);
            РезультатРодителя = ЗапросРодителя.Выполнить().Выгрузить(); 
 
            // Создаем родителя в случае необходимости          
            Если РезультатРодителя.Количество() <> 0 тогда
                РодительГруппы = РезультатРодителя[0].Ссылка
            Иначе               
                ОбъектРодитель = Справочники[ИмяСправочника].СоздатьГруппу();
                ОбъектРодитель.Родитель = РодительГруппы;
                ОбъектРодитель.Наименование = ИмяГруппы;
                ОбъектРодитель.Записать();
                РодительГруппы = ОбъектРодитель.Ссылка;
            КонецЕсли;              
        КонецЦикла;         
        Родитель = РодительГруппы;
    КонецЕсли;      
     
    // Создаем или ищем элемент
    Элемент = Справочники[ИмяСправочника].НайтиПоНаименованию(ИмяЭлемента);
    ОбъектЭлемент = Неопределено;
     
    Если Элемент.Пустая() тогда
        Если СоздатьЕслиНетЭлемента тогда
            ОбъектЭлемент = Справочники[ИмяСправочника].СоздатьЭлемент();
            ОбъектЭлемент.Наименование = ИмяЭлемента;
        Иначе 
            Элемент = Неопределено
        КонецЕсли;              
    Иначе
        ОбъектЭлемент = Элемент.ПолучитьОбъект(); 
    КонецЕсли;  
     
     
    Если ОбъектЭлемент <> Неопределено тогда        
        // Устанвалвиаем доп. параметры 
        Если Параметры <> Неопределено тогда      
            Для каждого СтрПараметр из Параметры цикл               
                ОбъектЭлемент[СтрПараметр.Ключ] = СтрПараметр.Значение;
            КонецЦикла;         
        КонецЕсли;  
                 
        Если Родитель <> Неопределено тогда       
            ОбъектЭлемент.Родитель = Родитель;  
        КонецЕсли;
     
        ОбъектЭлемент.Записать();                   
        Элемент = ОбъектЭлемент.Ссылка; 
    КонецЕсли;      
         
    Возврат Элемент;
КонецФункции       

Автор: borismor
Разместил:   Версии: | 8.x | 8.2 УП |  Дата:   Прочитано: 53272
 +3 
Распечатать
Возможно, вас также заинтересует
Excel файл как Внешний источник данных 17
Подключимся и загрузим из файла Excel данные в таблицу значений 1С. Сделать теперь это очень просто. 1. В конфигурации добавляет новый объект метаданных типа " Внешние источники данных" и назовем его просто " Excel" . https://helpf.pro/uploads/img
Активация открытой книги Excel для корректировки 0
Нужно было получить для изменения уже открытую книгу Excel, а если она закрыта, то открыть и изменять. Ниже код, который данную задачу решает. Попытка Эксель = Неопределено; Книга = Неопределено; Лист = Неопределено; Состояние(" Выполняется
Быстрая выгрузка отчетов в Excel, наложение Фильта и отображение ярлыка 0
Вместо Таб.Показать() используем глобальную функцию - и отчет показывается сразу в Excel в удобоваримом виде - с форматированием колонок по ширине, автофильтром и ярлычками листов Процедура глОткрытьВЭкселе(Таб,ИмяФайла=" " ,НеИзменятьВысотуСтроки=0
Быстрая загрузка данных большого размера файла Excel в многомерный Массив 0
// OldthiefXXX Перем СерверExcel; Процедура КнопкаВыполнитьНажатие(Кнопка) ФайлХЛС=СерверExcel.Application.Workbooks.Open(ДокументХЛС); КонечнаяСтрокаДанных=ФайлХЛС.ActiveSheet.UsedRange.Rows.Count; КоличествоКолонокДанных=ФайлХЛС.ActiveSheet
Быстрая функция чтения данных с листа Excel 11
При чтении файла Excel я использую вариантный массив. Он позволяет быстро получить ВСЮ таблицу листа в память, а также получать данные массива целыми колонками. Тем самым время на чтение области файла Excel в таблицу значений сокращается в десятки ра
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!