Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Выгрузка/загрузка данных из 1С 8 в Excel          
Vofka Подменю пользователя
сообщение 20.02.12, 10:00
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Информация на уникальность или новизну не претендует. В первую очередь пишу для себя, чтоб в случае чего можно было зайти и скопипастить готовый кусочек кода.

Выгрузка

Для выгрузки данных в файл Excel нам поможет процедура, типа следующей:

Процедура Выгрузить()
    
    ТзПодразделенийОрганизации = ПолучитьТзПодразделенийОрганизации();
    
    Попытка
        Эксель = Новый COMОбъект("Excel.Application");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Книга = Эксель.WorkBooks.Add();
        
    Лист = Книга.WorkSheets(1);
    Лист = Книга.Sheets.Add();
    
    НомерСтроки = 1;
    Для Каждого Строка ИЗ ТзПодразделенийОрганизации Цикл
        Лист.Cells(НомерСтроки, 1).Value = Строка.Код;
        Лист.Cells(НомерСтроки, 2).Value = Строка.Наименование;
        Лист.Cells(НомерСтроки, 3).Value = Строка.Владелец;
        НомерСтроки = НомерСтроки + 1;
    КонецЦикла;
    
    Попытка
        Книга.SaveAs(ПутьКФайлу);
    Исключение
        Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
    КонецПопытки;
    
    Эксель.Application.Quit();
    
КонецПроцедуры


В ней имеется таблица значений ТзПодразделенийОрганизации, которая состоит из 3 колонок: Код, Наименование и Владелец. Кроме этого где-то (в моем случае это элемент формы) должна присутствовать переменная ПутьКФайлу, которая содержит полный путь к файлу, т.е. должна иметь приблизительно такой вид вид:

ПутьКФайлу = "C:\MyFile.xlsx";


Стоит ещё отметить, что если файл уже существует, то вылезет "подтверждающее" окошко, которое спросит о том заменить ли существующий файл. Поэтому, если выгрузка происходит не интерактивно, то обязательно проверьте, что файла такого не существует. А если он существует, то или сохраните в другое место или удалите существующий файл smile.gif .

Загрузка

Для загрузки используем такую процедуру

Процедура Загрузить()
    
    Если НЕ ЗначениеЗаполнено(ПутьКФайлу) Тогда
        Предупреждение("Файл не выбран!");
        Возврат;
    КонецЕсли;
    
    Попытка
        Эксель = Новый COMОбъект("Excel.Application");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
    
    Лист = Книга.WorkSheets(1);
    СчитанныйФайл = ПрочитатьЛистExcel(, Лист, 1);
    Эксель.Quit();
    
КонецПроцедуры


Здесь мы тоже встречаем переменную ПутьКФайлу. Содержит она в себе то же самое, что и в случае выгрузки. Внимательный читатель может заметить заметит, что в приведенной выше процедуре вызывается функция ПрочитатьЛистExcel. Так вот это не встроенная в 1С функция, а отсюда следует, что надо бы её описать. Данная функция может быть в двух вариантах. Один вариант я взял с [необходимо зарегистрироваться для просмотра ссылки]:

Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт

    Если ЛистЭксель = Неопределено Тогда
        ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application");
    КонецЕсли;
    
    Если ВсегоСтрок = 0 Тогда
        ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
    КонецЕсли;
    
    Если ВсегоКолонок = 0 Тогда
        ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;
    КонецЕсли;
    
    Если ТЗ = Неопределено Тогда
        ТЗ =  Новый ТаблицаЗначений;
        Для Счетчик = 1 По ВсегоКолонок Цикл
            ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
        КонецЦикла;
    КонецЕсли;
    
    Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл
        НоваяСтрока = ТЗ.Добавить();
    КонецЦикла;

    Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки,НомерПервойКолонки), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
    Данные = Область.Value.Выгрузить();

    Для Счетчик = 0 По ВсегоКолонок-1 Цикл
        ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
    КонецЦикла;
    
    ЛистЭксель = Неопределено;
    
    Возврат ТЗ;
    
КонецФункции


Функция рабочая и можно её легко использовать. Но в моем случае она отрабатывала немножко не так, как надо было и немножко модифицировав её я достиг нужного результата:

Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт

    Если ЛистЭксель = Неопределено Тогда
        ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application");
    КонецЕсли;
    
    Если ВсегоСтрок = 0 Тогда
        ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
    КонецЕсли;
    
    Если ВсегоКолонок = 0 Тогда
        ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;
    КонецЕсли;
    
    Если ТЗ = Неопределено Тогда
        ТЗ =  Новый ТаблицаЗначений;
        Для Счетчик = 1 По ВсегоКолонок Цикл
            ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
        КонецЦикла;
    КонецЕсли;
    
    Для СчетчикСтрок = НомерПервойСтроки По ВсегоСтрок Цикл
        НоваяСтрока = ТЗ.Добавить();
        
        Для СчетчикКолонок = 1 По ВсегоКолонок Цикл
            
            НоваяСтрока[СчетчикКолонок - 1] = ЛистЭксель.Cells(СчетчикСтрок, СчетчикКолонок).Value;
            
        КонецЦикла;
        
    КонецЦикла;
    
    ЛистЭксель = Неопределено;
    
    Возврат ТЗ;
    
КонецФункции


Если не ошибаюсь, то первый вариант (оригинал) работает быстрее. Но часто это не критично, поэтому можете использовать тот или иной вариант.

У меня всё, спасибо за внимание smile.gif


Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 11:25
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!