Версия для печати темы (https://pro1c.org.ua/index.php?s=0266b480bada03977c49fd49b6cc98cf&showtopic=46191)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Табличные части из Эксель документа

Автор: Lexveritas 11.06.18, 15:55

УПП 1.3, 1С8,3,10

В документе "УстановкаЦенНоменклатуры" кнопка.

Вот обработчик кнопки:

Процедура КоманднаяПанельТаблицыТиповЦенДобваитьИзЭксель(Кнопка)
    
    ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбора.Заголовок     ="Выберите файл";
      
    Если ДиалогВыбора.Выбрать()Тогда
        ИмяФайла=ДиалогВыбора.ПолноеИмяФайла;
    КонецЕсли;
    ТаблицаЦен.Очистить();
    Попытка
        Excel=Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(ИмяФайла);
        Состояние("Обработка файла Excel");
        ТекЛист=Excel.Sheets(1);
        Excel.WorkBooks.Close();
    Исключение
        Сообщить(ОписаниеОшибки());
        Предупреждение("Файл не открыт!"+Символы.ПС+"Проверьте файл!");
        Возврат
    КонецПопытки;
    МассивКолонок = ТекЛист.Выгрузить();
    ВсегоСтрок = (МассивКолонок.Получить(0).Количество()) - 1;
    Для СтрокаТП = 0 По ВсегоСтрок Цикл
        НоваяСтрока = ТаблицаЦен.Добавить();
        НоваяСтрока.Номенклатура = СокрЛП(МассивКолонок.Получить(1).Получить(СтрокаТП));
    КонецЦикла;
    
      
КонецПроцедуры


При выполнении появляется вот такая ошибка:

{Документ.УстановкаЦенНоменклатуры.Форма.ФормаДокумента.Форма(2592)}: Метод объекта не обнаружен (Выгрузить)
МассивКолонок = ТекЛист.Выгрузить();

Кто нибудь!
Подскажите что за... Что я делаю не так?

Автор: Petre 11.06.18, 16:13

У данного COM-объекта нет метода "Выгрузить". Там все методы - латинские.

Автор: Lexveritas 12.06.18, 8:40

Цитата(Petre @ 11.06.18, 17:13) *
У данного COM-объекта нет метода "Выгрузить". Там все методы - латинские.

Ну, тогда я вообще в край потерялся. А, какой метод тогда необходимо использовать?
Перебирать методы екселя на МСДН ничего не дало!

Автор: sava1 12.06.18, 9:03

пройти циклом по строкам Листа и заполнить ТЧ

Автор: Lexveritas 12.06.18, 10:32

Цитата(sava1 @ 12.06.18, 10:03) *
пройти циклом по строкам Листа и заполнить ТЧ

А, хоть какой то пример? Вообще не понимаю как это соорудить!

Автор: sava1 12.06.18, 10:55

Вооще-то Гугль дает кучу сцылок

http://pro1c.org.ua/redirect.php?http://1c8xx.ru/excel1c.php

Автор: Lexveritas 12.06.18, 16:03

Цитата(sava1 @ 12.06.18, 11:55) *
http://pro1c.org.ua/redirect.php?http://1c8xx.ru/excel1c.php


Это сработало.
Но.
Вот такой обработчик
Процедура ИмпортироватьЦеныНажатие(Элемент)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите имя файла для чтения";
    Диалог.МножественныйВыбор = Ложь;
    Диалог.Фильтр = "Файл MS Excel (.xlsx)| *.xlsx";
    //Диалог.Фильтр = "Все файлы (*.*)| *.*";
    
    Если Не Диалог.Выбрать() Тогда
        Сообщить("Файл для обработки не выбран!");
    Иначе
        //подключаемся к Excel
        ФайлДанных = Диалог.ПолноеИмяФайла;
        Попытка
            Excel = Новый COMОбъект("Excel.Application");
            Excel.WorkBooks.Open(ФайлДанных);
            Состояние("Обработка файла Microsoft Excel...");
        Исключение
            Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
            Сообщить(ОписаниеОшибки());
            Возврат;
        КонецПопытки;

        Попытка
            //Открываем необходимый лист
            Excel.Sheets(1).Select(); // лист 1, по умолчанию
        Исключение
            //Закрываем Excel
            Excel.ActiveWorkbook.Close();
            Excel = 0;
            Сообщить("Файл " + Строка(ФайлДанных) + " не соответствует необходимому формату! Первый лист не найден!");
            Возврат;
        КонецПопытки;

        //Получим количество строк и колонок.
        //В разных версиях 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;
        КонецЕсли;
        
        ИмпртЦен.Очистить();
        
        Попытка //Если случится ошибка, то закроем файл, чтобы не висел в процессах
            Для Сч = 2 По ФайлСтрок Цикл
                Состояние("Обрабатывается строка " + Строка(Сч) + " из " + Строка(ФайлСтрок));
                Если НЕ СокрЛП(Excel.Cells(Сч, 1).Value) = ""  Тогда
                    НоваяСтрока = ИмпртЦен.Добавить();
                    НоваяСтрока.Номенклатура     = СокрЛП(Excel.Cells(Сч, 1).Text);
                    НоваяСтрока.Цена             = СокрЛП(Excel.Cells(Сч, 2).Text);
                    //НоваяСтрока.ТестовоеЧисло1     = СокрЛП(Excel.Cells(Сч, 3).Value);
                    //НоваяСтрока.ТестовоеЧисло2     = СокрЛП(Excel.Cells(Сч, 4).Value);
                    //НоваяСтрока.ТестовоеЧисло3     = СокрЛП(Excel.Cells(Сч, 5).Value);
                    //НоваяСтрока.ТестовоеЧисло4     = СокрЛП(Excel.Cells(Сч, 6).Value);
                    //НоваяСтрока.ТестовоеЧисло5     = СокрЛП(Excel.Cells(Сч, 7).Value);
                    //НоваяСтрока.ТестовоеЧисло6     = СокрЛП(Excel.Cells(Сч, 8).Value);
                    //НоваяСтрока.ТестовоеЧисло7     = СокрЛП(Excel.Cells(Сч, 9).Value);
                    //НоваяСтрока.ТестоваяДата     = СокрЛП(Excel.Cells(Сч, 10).Value);
                КонецЕсли;
                КонецЦикла;
        Исключение
            //Закрываем Excel
            Excel.ActiveWorkbook.Close();
            Excel.Quit();
            Сообщить(ОписаниеОшибки());
            Возврат;
        КонецПопытки;
        
        Попытка            
            Сообщить("Файл Excel прочитан!");
            Excel.Quit();
        Исключение
            Сообщить(ОписаниеОшибки());
            Возврат;
        КонецПопытки;            
    КонецЕсли;
КонецПроцедуры

Указанный пример сильно изменять не пришлось...

Засада в том, что не хочет заполнять поле "Номенклатура"... Как сделать "НайтиКоду" или наименованию? Я так понимаю что разница в типе данных?

Lexveritas @ Сегодня, 16:30 * ,
Сам же отвечу на свой вопрос...
НоваяСтрока.Номенклатура     = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Excel.Cells(Сч, 1).Text));


НО!
Есть "ХАрактеристикаНоменклатуры" справочник подчиненный владельцу...
Как Здесь быть?

Автор: Vidocq05 13.06.18, 10:27

Цитата(Lexveritas @ 12.06.18, 17:03) *
НО!
Есть "ХАрактеристикаНоменклатуры" справочник подчиненный владельцу...
Как Здесь быть?


НоваяСтрока.ХарактеристикаНоменклатуры = Справочники.ХарактеристикаНоменклатуры.НайтиПоНаименованию(СокрЛП(Excel.Cells(Сч, "КолонкаХарактеристики").Text),,,НоваяСтрока.Номенклатура);


Автор: Lexveritas 13.06.18, 10:33

Vidocq05 @ Сегодня, 11:27 * ,

Именно так и сделал!
По собственной же глупости не увидал что там еще и по владельцу параметр есть...
Но все равно спасибо!

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua