8.х Загрузка данных из Экселя методом копирования

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

  1. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С Заблокирован

    Регистрация:
    20 мар 2013
    Сообщения:
    217
    Симпатии:
    1
    Баллы:
    29
    Всем здравствуйте. Нужно выполнить загрузку данных первого листа Экселя. Текст ячейки "B2" нужно загрузить в реквизит обработки, а табличную часть заполнить текстами непустых строк четырёх столбцов A,B,C,D, начиная с пятой строки. В своей обработке я делаю так. Указываю файл Экселя в диалоге выбора файлов и открываю его, запуская приложение. Одновременно с этим я создаю и показываю табличный документ (переменная Таб). Затем я вручную выделяю в открывшемся файле экселя столбцы A-D, копирую их, закрываю эксель, на вопрос о доступности данных из буфера обмена отвечаю "Да", выделяю ячейку "R1C1" в табличном документе и вставляю данные экселя, закрываю табличный документ (вручную), и вызываю процедуру заполнения (КнопкаВыполнитьНажатие). В результате имею ошибку:
    Ошибка при вызове метода контекста (Область)
    ТекущРеквизит1=Таб.Область("R"+строчка+"C1").Текст;
    по причине:
    Область не найдена: R1 000C1.
    Данная ошибка никак не влияет на правильность заполнения табличных данных в 1С из Экселя. Я её игнорирую, но всё равно её надо исправить, подсчитав число заполненных строк в Экселе. Вопрос такой. Как можно всё сделать программно? Т.е. скопировать диапазон листа1 "A1:D65536" (или же диапозон с непустыми строками), вставить скопированный диапозон в табличный документ, и заполнить текстом реквизит "Имейл" обработки из ячейки "B2" и табличную часть. Вот мой нижепреведённый код. Как его исправить?

    Код:
    Перем Таб;
    
    Процедура ПутьКЭкселюНачалоВыбора(Элемент, СтандартнаяОбработка)
        ДиалогВыбора=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        ДиалогВыбора.Заголовок="Выберите файл";
        ДиалогВыбора.Фильтр="Табличный документ(*.xls)|*.xls|Табличный документ(*.xlsx)|*.xlsx|Табличный документ(*.ods)|*.ods";
        Если ДиалогВыбора.Выбрать() Тогда
            ПутьКЭкселю=ДиалогВыбора.ПолноеИмяФайла;
        КонецЕсли;
    КонецПроцедуры
    
    Процедура КоманднаяПанель1ВставитьСюдаИзЭкселя(Кнопка)
        ЗапуститьПриложение(ПутьКЭкселю);
        Таб=Новый ТабличныйДокумент;
        Таб.ТолькоПросмотр=ложь;
        Таб.Показать("Вставьте сюда данные из Экселя");
    КонецПроцедуры
    
    Процедура КнопкаВыполнитьНажатие(Кнопка)
        Имейл=Таб.Область("R2C2").Текст;
        Для строчка=5 по 65536 Цикл
            ТекущРеквизит1=Таб.Область("R"+строчка+"C1").Текст;
            ТекущРеквизит2=Таб.Область("R"+строчка+"C2").Текст;
            ТекущРеквизит3=Таб.Область("R"+строчка+"C3").Текст;
            ТекущРеквизит4=Таб.Область("R"+строчка+"C4").Текст;
            Если ТекущРеквизит1<>"" Тогда
                СТЧ=ТабличнаяЧасть1.Добавить();
                СТЧ.Реквизит1=ТекущРеквизит1;
                СТЧ.Реквизит2=ТекущРеквизит2;
                СТЧ.Реквизит3=ТекущРеквизит3;
                СТЧ.Реквизит4=ТекущРеквизит4;
            КонецЕсли;
        КонецЦикла;
        Таб.Скрыть();
    КонецПроцедуры
  2. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    520
    Симпатии:
    83
    Баллы:
    54
    Все уже придумано за нас.
    Вот пример загрузки из Экселя
    Код:
        xlLastCell = 11;
        ВыбФайл = Новый Файл(ИмяФайла);
        Если НЕ ВыбФайл.Существует() Тогда
            Сообщить("Файл не существует!");
            Возврат Ложь;
        КонецЕсли;
        Попытка
            Excel = Новый COMОбъект("Excel.Application");
            Excel.WorkBooks.Open(ИмяФайла);
            ExcelЛист = Excel.Sheets(НомерЛистаExcel);
        Исключение
            Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel.");
            Возврат ложь;
        КонецПопытки;
        ActiveCell = Excel.ActiveCell.SpecialCells(xlLastCell);
        RowCount = ActiveCell.Row;
        ColumnCount = ActiveCell.Column;
        Для Row = 1 По RowCount Цикл
    ...
    
  3. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С Заблокирован

    Регистрация:
    20 мар 2013
    Сообщения:
    217
    Симпатии:
    1
    Баллы:
    29
    Исправил в своём коде ошибку при помощи свойства ВысотаТаблицы у табличного документа.

    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
        Имейл=Таб.Область("R2C2").Текст;
        ЧислоСтрок=Таб.ВысотаТаблицы;
        Для строчка=5 по ЧислоСтрок Цикл
            ТекущРеквизит1=Таб.Область("R"+строчка+"C1").Текст;
            ТекущРеквизит2=Таб.Область("R"+строчка+"C2").Текст;
            ТекущРеквизит3=Таб.Область("R"+строчка+"C3").Текст;
            ТекущРеквизит4=Таб.Область("R"+строчка+"C4").Текст;
            СТЧ=ТабличнаяЧасть1.Добавить();
            СТЧ.Реквизит1=ТекущРеквизит1;
            СТЧ.Реквизит2=ТекущРеквизит2;
            СТЧ.Реквизит3=ТекущРеквизит3;
            СТЧ.Реквизит4=ТекущРеквизит4;
        КонецЦикла;
        Таб.Скрыть();
    КонецПроцедуры
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.271
    Симпатии:
    966
    Баллы:
    204
    Копайте в сторону Range вместо Cells, а то 10к строк до завтра заполнять можно будет.....
  5. AsadRoman
    Offline

    AsadRoman

    Регистрация:
    22 авг 2011
    Сообщения:
    40
    Симпатии:
    0
    Баллы:
    1
    Опытный в 1С задает такие вопросы с такими кодами?...

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