Имя: Пароль:
1C
 
Выгрузка в ексель из таб части используя ComSafeArray
, , , ,
0 yyyuuu
 
02.02.22
09:02
Всем привет ребята.
Хочу выгрузить табличную часть документа в Excel.
Шапка формируется все хорошо, а вот строки и значения нет. Подскажите пожалуйста ребята как бы можно было это реализовать?
Что Я сделал:

Попытка
        Excel_App = Новый COMОбъект("Excel.Application");
        Excel_App.Interactive = Ложь;
        Excel_App.DisplayAlerts = Ложь;
    Исключение
        Сообщить("Не удалось подключиться к Excel, возможно программа на компьютере не установлена! Операция прервана!");
        Возврат;
    КонецПопытки;

    Книга=Excel_App.Application.Workbooks.Add();
    Д1 = ЭтотОбъект.Дата;
    Сообщить(Д1);
    случайноеЧисло = Новый ГенераторСлучайныхЧисел(0);
    сл = случайноеЧисло.СлучайноеЧисло(0,1000);
    ИмяФайла = "disloc_" + ФЧ(День(Д1), 2) + ФЧ(Месяц(Д1), 2) + ФЧ(Год(Д1), 4) + "_" + ФЧ(Час(Д1), 2) + "_" + ФЧ(Минута(Д1), 2) + сл + ".xls";
    Сообщить(ИмяФайла);
    
    Сообщить("Формирую файл Excel...");
    ТекЛист=Книга.WorkSheets(1);
    ТекЛист.Name = "report";

    Если Выб_Таблица.Количество() = 0 Тогда
        Сообщить("Пустая таблица! Операция прервана!");
        Возврат;
    КонецЕсли;

    КолонкиТаблицы = Выб_Таблица.выгрузитьКолонки().Колонки;//Выб_Таблица.Колонки;

    СтартМассив = Новый Массив;
    Для каждого Колонка Из КолонкиТаблицы Цикл
        //СтартМассив.Добавить(Выб_Таблица.ВыгрузитьКолонку(Колонка.Имя));
           СтартМассив.Добавить(Колонка.Имя);
    КонецЦикла;

    РазмерМассив = Новый Массив;
    РазмерМассив.Добавить(КолонкиТаблицы.Количество());
    РазмерМассив.Добавить(Выб_Таблица.Количество());

    МассивArray = Новый COMSafeArray(СтартМассив, "VT_VARIANT", РазмерМассив);

    НачальнаяСтрока = 3;

    Book_Excel = Excel_App.Workbooks.Add();
    Sheet_Excel = Book_Excel.Sheets(1);
    Кол_Строк = Выб_Таблица.Количество()+1;
    Кол_Колонок = КолонкиТаблицы.Количество();
    
     //Sheet_Excel.Range(Sheet_Excel.Cells(2,1), Sheet_Excel.Cells(Кол_Строк, Кол_Колонок)).Value = МассивArray;
    
     a=0;
    Для каждого Колонка Из КолонкиТаблицы Цикл
         a=a+1;
         Sheet_Excel.Cells(1,a).Value = Колонка.Имя;
         Sheet_Excel.Columns(a).EntireColumn.AutoFit();
     КонецЦикла;
         
     Для каждого СтрокаТабличнойЧасти Из Вагоны Цикл
         а=1;
         //МассивArray.SetValue(3,3,СтрокаТабличнойЧасти);
         //МассивКом.SetValue ( 1 , 3 , СтрокаТабличнойЧасти );
        
         Для каждого Строка Из СтрокаТабличнойЧасти Цикл
            а = а + 1;
//            Sheet_Excel.Cells(НачальнаяСтрока+1,a-1).Value = Строка;
            //МассивArray.SetValue(Кол,Стр,Строка);
                        //Sheet_Excel.Columns(2).EntireColumn.AutoFit();

        КонецЦикла;
        НачальнаяСтрока = НачальнаяСтрока +1;
     КонецЦикла;
    
     Sheet_Excel.Range(Sheet_Excel. Cells ( 1 , 1 ), Sheet_Excel . Cells ( Кол_Строк , Кол_Колонок )). Value = МассивArray ;
    
     ВремТаб = КаталогВременныхФайлов();
     Сообщить(ВремТаб + ИмяФайла);
    Попытка
        //Book_Excel.SaveAs(ИмяФайла);
          Book_Excel.SaveAs(ВремТаб + ИмяФайла,51);
    Исключение
        Book_Excel.Close();
        Book_Excel = Неопределено;
        Сообщить("Ошибка при записи файла! Операция прервана!");
        Возврат;
    КонецПопытки;

    Excel_App.Interactive = Истина;
    Excel_App.DisplayAlerts = Истина;
    Excel_App.Application.Quit();
    Excel_App = Неопределено;
1 Галахад
 
гуру
02.02.22
09:12
А что значит "не хорошо"?
2 yyyuuu
 
02.02.22
09:16
(1) не формируются строки табличной части, не могу понять что делаю не так
3 Галахад
 
гуру
02.02.22
09:23
Наверное криво МассивArray заполняешь.
4 yyyuuu
 
02.02.22
09:23
(3) возможно. Вот и хотелось бы узнать, может кто решал подобное и подскажет как
5 lodger
 
02.02.22
09:26
(4) вроде всё хорошо работает. ты в сейф-массив заполнил шапку и расчертил размер Х на У
6 lodger
 
02.02.22
09:29
кстати, а где ты нашёл такой вариант использования конструктора?

РазмерМассив = Новый Массив;
    РазмерМассив.Добавить(КолонкиТаблицы.Количество());
    РазмерМассив.Добавить(Выб_Таблица.Количество());

    МассивArray = Новый COMSafeArray(СтартМассив, "VT_VARIANT", РазмерМассив);
7 Галахад
 
гуру
02.02.22
09:34
(6) Нормальный вариант. В СП есть.
8 yyyuuu
 
02.02.22
09:52
(6) в гугле, нагуглил где то, вроде бы рабочий
9 yyyuuu
 
02.02.22
09:57
Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ;    
по причине:
Произошла исключительная ситуация (0x800a03ec)


Сейчас ошибка
10 lodger
 
02.02.22
10:20
(9) среди значений полей есть нестроковые типы.
11 yyyuuu
 
02.02.22
10:21
(10) Точно, спасибо что подсказал. Сразу заработало, ну не совсем заработало, но эта ошибка ушла
12 yyyuuu
 
02.02.22
10:27
Поля выводятся, но теперь не выводится шапка. Что не так?

ИменаКолонок = Новый Массив;
    Для Каждого Колонка Из Колонки Цикл
        ИменаКолонок.Добавить(Колонка.Имя);    
    КонецЦикла;    

    МассивКОМ = Новый COMSafeArray("VT_VARIANT", ВсегоКолонок, ВсегоСтрок);
    
    МассивКОМ.SetValue(1, 2, ИменаКолонок);
    
    Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ;



{Документ.Дислокация.Форма.ФормаДокумента.Форма(330)}: Ошибка при установке значения атрибута контекста (Value)
    Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ;
по причине:
Произошла исключительная ситуация (0x800a03ec)
13 yyyuuu
 
02.02.22
10:41
(10) а вот смотри еще, а что делать если у Меня в полях есть Даты, не передлывать же Мне их строки, тогда фильтры нельзя будет использовать по датам если дата не строка то ошбика

{Документ.Дислокация.Форма.ФормаДокумента.Форма(330)}: Ошибка при установке значения атрибута контекста (Value)
    Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ;
по причине:
Произошла исключительная ситуация (0x800a03ec)
14 acht
 
02.02.22
10:43
"Что Я сделал ... у Меня ... Мне ..."

Чой-то ржу
15 yyyuuu
 
02.02.22
10:45
Что то понять не могу вообще. В некоторых документах все ок, работает как надо.
В некоторых ошибка.
Каким образом возникает не пойму. Типы данных везде одинаковые: Число, строка, дата

{Документ.Дислокация.Форма.ФормаДокумента.Форма(341)}: Ошибка при установке значения атрибута контекста (Value)
    Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ;    
по причине:
Произошла исключительная ситуация (0x800a03ec)
16 yyyuuu
 
02.02.22
10:46
(14) это очень веселая шутка
17 mistеr
 
02.02.22
11:19
(0) Немного оффтопик, но зачем вообще нужен этот ComSafeArray? Та быстрее выгружается, что ли?
18 lodger
 
02.02.22
11:24
(15) поищи пустые даты
19 lodger
 
02.02.22
11:24
excel не любит дат меньше 01.01.1900, поэтому и пустую дату передавать нельзя
20 yyyuuu
 
02.02.22
11:24
(17) да, конечно быстрее там 5 тысяч строк, не всегда но бывает. через ComSafeArray вообще раз два и в дамках
21 lodger
 
02.02.22
11:28
(20) сохранить табдок в формате excel может быть ещё быстрее.
22 mistеr
 
02.02.22
11:50
(20) Быстрее, чем ТабДок.Записать()?
23 yyyuuu
 
02.02.22
11:52
(19) Мужик, ты вообще всем был прав. Да действительно пустая дата.
Не совсем согласен с таб.доком на больших объемах. Да и макет надо рисовать еще
24 lodger
 
02.02.22
12:16
(23) построитель отчёта выведет тебе любую табличную фигню без рисования макета.
25 yyyuuu
 
02.02.22
12:32
(24) Пожалуйста можешь в качестве примера что нибудь рабочее скинуть?
26 lodger
 
02.02.22
12:43
(25)
        Строитель1 = Новый ПостроительОтчета;
        Строитель1.ИсточникДанных = Новый ОписаниеИсточникаДанных(РезультатЗапроса);//или таблица значений
        Строитель1.ЗаполнитьНастройки();
        
        ТекущаяСтраница = Новый ТабличныйДокумент;
        Строитель1.Вывести(ТекущаяСтраница);

Короче кода для вывода таблицы в табдок, по моему, просто не существует.

//А если разобраться с источником данных и подогнать туда непосредственно запрос, то и копирования данных в оперативке меньше будет.