Имя: Пароль:
1C
1С v8
Загрузка из нескольких книг Exel в ТЧ документа
0 altaro
 
13.08.19
23:08
Денька доброго. Промусолено по загрузке много. Не могу догнать, как перебрать несколько книг и загрузить все в одну ТЧ. Конфа самописная. Сейчас загрузка реализована изнутри документа в модуле формы тривиальным способом.
Сначала "ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие)"

ну и потом:
""
    
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(Объект.ФайлExсel);
    Исключение
        Сообщить("При открытии файла произошла ошибка! Операция прервана!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    

    Попытка
        Excel.Sheets(1).Select();    
    Исключение
    
        Excel.ActiveWorkbook.Close();     
        Excel = 0;
        Сообщить("Первый лист не найден!");
        ОтменитьТранзакцию();
        Возврат;
    КонецПопытки;
    
    // Вычисление количества строк и колонок в зависимости от версии Excel
    vExcel = Лев(Excel.Version, Найти(Excel.Version,".")-1);
    Если vExcel = "8" тогда
        КоличествоСтрок = Excel.Cells.CurrentRegion.Rows.Count;
        КоличествоКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count,6 );
    Иначе
        КоличествоСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
        КоличествоКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
    Конецесли;

    МассивКолонок = Новый ТаблицаЗначений;
    МассивКолонок.Колонки.Добавить("НомерКолонки");
    МассивКолонок.Колонки.Добавить("НазваниеКолонки");
    Для КолонкаОтсчета = 2 по КоличествоКолонок Цикл
        ИмяКолонки = Excel.Cells(2, КолонкаОтсчета).Text;
        
        ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ","");
        
            НовСтрока = МассивКолонок.Добавить();    
            НовСтрока.НомерКолонки = КолонкаОтсчета;
            НовСтрока.НазваниеКолонки = ИмяБезПробелов;
        
    КонецЦикла;
    
    
    Если МассивКолонок.Количество() <> 0 и МассивКолонок.НайтиСтроки(Новый Структура("НазваниеКолонки", "Номер")).Количество() <> 0 Тогда    
        
        Для СтрокаОтсчета =3 по КоличествоСтрок Цикл          
            НСтр = Объект.Надой.Добавить();    
            
            Для каждого СтрокаМассив из МассивКолонок Цикл
                ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;
                
                ИмяКолонки = Excel.Cells(2, СтрокаМассив.НомерКолонки).Text;
                
                Если ИмяКолонки = "Номер" Тогда
                    НСтр.Номер = Справочники.Животные.НайтиПоКоду(ТекущееЗначение,Истина);    
                ИначеЕсли ИмяКолонки = "Станок" Тогда
                    НСтр.Станок = ТекущееЗначение;        
                ИначеЕсли ИмяКолонки = "Надой" Тогда
                    НСтр.Надой = ТекущееЗначение;
                ИначеЕсли ИмяКолонки = "Время" Тогда
                    НСтр.Время = ТекущееЗначение;
                ИначеЕсли ИмяКолонки = "Интенсивность" Тогда
                    НСтр.Интенсивность = ТекущееЗначение;    
                ИначеЕсли ИмяКолонки = "Мастит" Тогда
                    НСтр.Мастит = ТекущееЗначение;    
                КонецЕсли;    
            КонецЦикла;
        КонецЦикла;
        
    Иначе
        Сообщить("В Excel файле не достаточно данных для заполнения документа!");
    КонецЕсли;    
    
    Excel.DisplayAlerts = 0;
    Excel.Quit();
    Excel.DisplayAlerts = 1;
"
Грузим по одному файлу, каждый следующий перевыбираем и строки добавляются в ТЧ. Задача: выбрать папку с файлами (всего файлов десять абсолютно одинакового вида) и запихнуть в одну ТЧ последовательно все строки. Файлы небольшие, по 24 строки.

К сожалению, получить файлы для загрузки в виде отличном от .xls не представляется возможным.
1 Консультант Баранов
 
13.08.19
23:20
В чем проблема? Как получить файлы из папки или как написать функцию перебора загрузки файлов?
2 altaro
 
13.08.19
23:39
(1) Да все нужно.
Я так понимаю, получим список файлов на клиенте, аналогично выбору одного файла, использовав Диалог.МножественныйВыбор=Истина;?

Ну и все, ступор
3 MetaDon
 
13.08.19
23:48
Мас = НайтиФайлы( (СокрЛП
(Константы.КаталогВходящихДокументов.Получить
())+"\Stado1\" ,"*.xls");
Если ЗначениеЗаполнено(Мас) Тогда
Для каждого Стр из Мас Цикл
...
4 altaro
 
13.08.19
23:54
(3) Спс за наводку. Ща прогоню
5 altaro
 
20.08.19
17:14
Сделал немного по-другому. Перебрал все файлы в каталоге, данный запихал в ТЗ. А ТЗ уже пхаю в ТЧ. В результате все грузится хорошо и быстро. Одна из колонок в ТЗ является "ссылкой" на справочник, т.е. совпадает с наименованием в справочнике и не загружается. Нужно , чтобы из этого справочника подтягивалось соответствующее наименование и заполнялось в ТЧ.
Как правильно к ТЗ обратится по условию

Можно что-то типа:

Если ??? = "Номер" Тогда
Объект.Номер = Справочники.Животные.НайтиПоКоду(ТекущееЗначение,Истина);

Или запрос городить?
6 altaro
 
20.08.19
17:30
(5) Правильно сформулирую. Сопоставить значения в одной из колонок ТЗ справочнику.
7 altaro
 
21.08.19
15:50
Собрал.
Кому нужно:

Функция ПрочитатьФайл(ИмяФайла)
    
    НомерЛистаExcel = 1;
    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 = 3 По RowCount Цикл         
        НовСтрока = ТЗ.Добавить();
        НовСтрока.ИмяФайла = ИмяФайла;
        НовСтрока.Номер = ExcelЛист.Cells(Row, Column).Text; \\ нужные колонки
        НовСтрока. ... = ExcelЛист.Cells(Row, Column).Text;
        НовСтрока. ... = ExcelЛист.Cells(Row, Column).Text;
        НовСтрока. ... = ExcelЛист.Cells(Row, Column).Text;
        НовСтрока. ... = ExcelЛист.Cells(Row, Column).Text;
        НовСтрока. ... = ExcelЛист.Cells(Row, Column).Text;
    КонецЦикла;
    
    Excel.WorkBooks.Close();
    Excel = 0;           
    Возврат ТЗ;              
КонецФункции  


&НаСервере
Процедура ЗагрузитьНаСервере()  
        МассивФайлов = НайтиФайлы("C:\Обмен", "*.xls", ложь);
        Объект.ТЧ.Очистить();
    Для каждого ТекФайл из МассивФайлов Цикл             
        ТаблицаИзФайла = ПрочитатьФайл(ТекФайл.ПолноеИмя);            
        Для каждого ТекСтрока из ТаблицаИзФайла Цикл
            \\Если ТекСтрока. ... <=100 И ТекСтрока. ... <1 тогда \\некое условие
                \\Возврат;
                \\\Иначе
    
        нСтр = Объект.ТЧ.Добавить();
        
        ЗаполнитьЗначенияСвойств(нСтр,ТекСтрока);
        нСтр.Номер = Справочники.Справочник.НайтиПоКоду(ТекСтрока.Номер);
        КонецЕсли;

        КонецЦикла;
    КонецЦикла;
    КонецПроцедуры

&НаКлиенте
Процедура Загрузить(Команда)
    ЗагрузитьНаСервере();
    ЗапуститьПриложение("C:\Переместить.bat"); //перемещает загруженные файлы в архив

    КонецПроцедуры