Имя: Пароль:
1C
 
Выгрузка в Excel 2016 по шаблону Active Document
0 НоваяВолна
 
10.06.16
21:06
Господа и Дамы!
...Честно не знаю с каким ещё бубном танцевать...
Выгружаю из 1С в Excel 2007.  Шаблон загружаю из Excel как Active Document. Выглядит шаблон так:
http://s019.radikal.ru/i612/1606/37/40c16382882b.jpg

Код из модуля формы документа 1С такой:

Попытка
        МакетExcel = ПолучитьМакет("ВыгрузкаВExcel");
        msExcel = МакетExcel.Получить();
        WBook = msExcel.Application.Workbooks(1);
        Лист = WBook.Worksheets(1);
        WBook.Activate();
    Исключение
        Сообщить("Ошибка при загрузке Microsoft Excel."
        + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
        Возврат;
    КонецПопытки;
        Лист = WBook.Worksheets("Лист1");
        //// заполнение шапки первой страницы
        // Блок 1
        Лист.Cells(1,1).Value = Строка("" + "Протокол № " + Номер + " от " + Формат(Дата,"ДФ=dd.MM.yyyy" ));
        Лист.Cells(2,10).Value = Строка(ГруппаТоваров); //Категория товара
        Лист.Cells(2,14).Value =  Строка(Покупатель);
        Лист.Cells(4,3).Value = Строка(ДокОснование);  //Заявка
        Лист.Cells(4,10).Value = Строка(СрокПоставки);
        Лист.Cells(4,15).Value = Строка(УсловияОплаты);
        Лист.Cells(6,3).Value = Строка(БазисПоставки);
        Лист.Cells(6,5).Value = Строка(МестоПоставки);
        Лист.Cells(6,10).Value = СтрЗаменить(Строка(Формат(СуммаПродажи,"ЧЦ=20; ЧДЦ=2")),",", ".");
        Лист.Cells(6,11).Value = Строка(ВалютаПродажи);
        Лист.Cells(6,15).Value = Строка(МетодПроведенияЗакупки);
        // заполнение табличных частей с добалением строк
        // Блок 2
        Если ИнформацияОПоставщиках.Количество() > 2 Тогда
            Для Сч = 3 По ИнформацияОПоставщиках.Количество() Цикл
                Лист.Rows(11).Insert();
                Лист.Range("A11:C11").MergeCells = True;
                Лист.Range("D11:F11").MergeCells = True;
                Лист.Range("G11:K11").MergeCells = True;
                Лист.Range("L11:O11").MergeCells = True;
            КонецЦикла;    
        КонецЕсли;
        СтрокаExcel = 10;
        Для Каждого Стр Из ИнформацияОПоставщиках Цикл
            Лист.Cells(СтрокаExcel,1).Value = Строка(Стр.Поставщик);
            Лист.Cells(СтрокаExcel,4).Value = Строка(Стр.СтатусПоставщика);
            Лист.Cells(СтрокаExcel,7).Value = Строка(Стр.Контакты);
            Лист.Cells(СтрокаExcel,12).Value = Строка(Стр.Информация);
            СтрокаExcel = СтрокаExcel + 1;
        КонецЦикла;    
        
        ДобавленоСтрок = ИнформацияОПоставщиках.Количество() - 2;
        // Блок 3
        Если ДобавленоСтрок > 0 Тогда
            СтрокаТретьегоБлока = 15+ДобавленоСтрок;
        Иначе
            СтрокаТретьегоБлока = 15;
        КонецЕсли;
        Область1 = Строка("A" + Строка(СтрокаТретьегоБлока) + ":C" + Строка(СтрокаТретьегоБлока));
        Область2 = Строка("D" + Строка(СтрокаТретьегоБлока) + ":I" + Строка(СтрокаТретьегоБлока));
        Область3 = Строка("J" + Строка(СтрокаТретьегоБлока) + ":K" + Строка(СтрокаТретьегоБлока));
        Область4 = Строка("L" + Строка(СтрокаТретьегоБлока) + ":O" + Строка(СтрокаТретьегоБлока));
        Если ПроверкаПоставщиков.Количество() > 2 Тогда
            Для Сч = 3 По ПроверкаПоставщиков.Количество() Цикл
                Лист.Rows(СтрокаТретьегоБлока).Insert();
                Лист.Range(Область1).MergeCells = True;
                Лист.Range(Область2).MergeCells = True;
                Лист.Range(Область3).MergeCells = True;
                Лист.Range(Область4).MergeCells = True;
            КонецЦикла;    
        КонецЕсли;
        Если ДобавленоСтрок > 0 Тогда
            СтрокаExcel = 14 + ДобавленоСтрок;
        Иначе
            СтрокаExcel = 14;
        КонецЕсли;
        Для Каждого Стр Из ПроверкаПоставщиков Цикл
            Лист.Cells(СтрокаExcel,1).Value = Строка(Стр.Поставщик);
            Лист.Cells(СтрокаExcel,4).Value = Строка(Стр.Состояние);
            Лист.Cells(СтрокаExcel,10).Value = Строка(Стр.УставнойКапитал);
            Лист.Cells(СтрокаExcel,12).Value = Строка(Стр.НаличиеЗадолженностиПоНалогам);
            СтрокаExcel = СтрокаExcel + 1;
        КонецЦикла;    
    ДобавленоСтрок = ДобавленоСтрок + ПроверкаПоставщиков.Количество() - 2;
    // Блок 4
    Если ДобавленоСтрок > 0 Тогда
        СтрокаExcel = 17 + ДобавленоСтрок;
    Иначе
        СтрокаExcel = 17;
    КонецЕсли;

    Лист.Cells(СтрокаExcel,1).Value = Строка(ДополнительныеДетали);
    
    // Блок 5
    Если ДобавленоСтрок > 0 Тогда
        СтрокаПятогоБлока = 22 + ДобавленоСтрок;
    Иначе
        СтрокаПятогоБлока = 22;
    КонецЕсли;
        Область1 = Строка("A" + Строка(СтрокаПятогоБлока) + ":E" + Строка(СтрокаПятогоБлока));
        Область2 = Строка("F" + Строка(СтрокаПятогоБлока) + ":O" + Строка(СтрокаПятогоБлока));
        Если ЗаключениеИсполнителя.Количество() > 2 Тогда
            Для Сч = 3 По ЗаключениеИсполнителя.Количество() Цикл
                Лист.Rows(СтрокаПятогоБлока).Insert();
                Лист.Range(Область1).MergeCells = True;
                Лист.Range(Область2).MergeCells = True;
            КонецЦикла;    
        КонецЕсли;
        Если ДобавленоСтрок > 0 Тогда
            СтрокаExcel = 21 + ДобавленоСтрок;
        Иначе
            СтрокаExcel = 21;
        КонецЕсли;
        Для Каждого Стр Из ЗаключениеИсполнителя Цикл
            Лист.Cells(СтрокаExcel,1).Value = Строка(Стр.Товар);
            Лист.Cells(СтрокаExcel,6).Value = Строка(Стр.Поставщик);
            СтрокаExcel = СтрокаExcel + 1;
        КонецЦикла;    
        
    Лист = WBook.Worksheets("Лист2");        
        
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ИсторияСогласованияПротоколаВыбора.Документ,
        |    ИсторияСогласованияПротоколаВыбора.Период КАК ДатаСогласованияВозврата,
        |    ИсторияСогласованияПротоколаВыбора.СогласуещееЛицо,
        |    ИсторияСогласованияПротоколаВыбора.КомментарийВозврата,
        |    ИсторияСогласованияПротоколаВыбора.ГруппаПользователей,
        |    ИсторияСогласованияПротоколаВыбора.Возврат,
        |    ИсторияСогласованияПротоколаВыбора.ПорядокСогласования КАК ПорядокСогласования
        |ИЗ
        |    РегистрСведений.ИсторияСогласованияПротоколаВыбора КАК ИсторияСогласованияПротоколаВыбора
        |ГДЕ
        |    ИсторияСогласованияПротоколаВыбора.Документ = &ТекущийДокумент
        |
        |УПОРЯДОЧИТЬ ПО
        |    ДатаСогласованияВозврата,
        |    ПорядокСогласования";

    Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
       СтрокаExcel = 1;
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Лист.Cells(СтрокаExcel,1).Value = Строка(ВыборкаДетальныеЗаписи.ГруппаПользователей);
        Лист.Cells(СтрокаExcel,2).Value = Строка("" + ВыборкаДетальныеЗаписи.СогласуещееЛицо + " " + ВыборкаДетальныеЗаписи.ДатаСогласованияВозврата);
        Лист.Cells(СтрокаExcel,3).Value = Строка(ВыборкаДетальныеЗаписи.КомментарийВозврата);
        СтрокаExcel = СтрокаExcel + 2;
    КонецЦикла;    
    
    
    msExcel.Application.Visible = 1;
    msExcel.Windows(1).Visible = 1;/// вот тут Excel 2016 ругается
    msExcel.Activate();
1 Dmitry1c
 
10.06.16
21:08
(0) запиши файл на диск и потом работай через COM-объект Excel.Application
2 НоваяВолна
 
10.06.16
21:10
(0) В Excel 2007 этот код работает. А вот в Excel 2016 выдает ошибку
{Документ.ПротоколВыбораПоставщика.Форма.ФормаДокумента(2269)}: Ошибка при вызове метода контекста (Windows)
WBook.Windows(1).Visible = 1;
по причине:
Произошла исключительная ситуация (0x8002000b)
3 НоваяВолна
 
10.06.16
21:12
(2)+++ WBook.Windows(1).Visible = 1;  читать как
msExcel.Windows(1).Visible = 1
4 НоваяВолна
 
10.06.16
21:15
(1) Записать на диск не могу... Так ка диска нет. База физически на удаленном сервере. Я конечно доступ имею.. Но не давать же доступ сотне пользователей
5 НоваяВолна
 
10.06.16
21:16
(4) + пользователю должен выводится файл Excel, а он уж себе сам его сохранит на своём терминале
6 НоваяВолна
 
10.06.16
21:25
(0) дайте уже ссыль на учебник VBA... Почитаю, просвещюсь )))
7 minele
 
10.06.16
21:34
Все очень просто как день: программы 1С работают максимум до Office 2007 (см. выборку), а  на все что выше просто надо написать конвертацию дополнительно.
8 ViSo76
 
10.06.16
21:37
Попробуй msExcel.Worksheets(1).Visible = Истина
9 НоваяВолна
 
10.06.16
21:42
(7) какую конвертацию? подскажи, где почитать про это?
(8) пробовал открывается пустое окно Excel без файлика....  Именно на строчку
msExcel.Windows(1).Visible = 1;
Excel 2007 реагирует (выводит всё,как я хочу) а 2016 ... ругается как в (2)
10 НоваяВолна
 
10.06.16
22:15
апну потом
11 b_ru
 
10.06.16
23:48
А что, просто
    msExcel.Application.Visible = Истина;
не показывает то что нужно? Вроде должен бы.
12 НоваяВолна
 
20.06.16
00:18
Разрулил. хоть долго не мог понять причину...Уже учебник VBA купил себе и с "умным" видом изучал... =) Не туда копал!
Хочу сделать закрытие ветки. Смысл моей проблемы оказался не в   различии команд MS VBA Excel разных версий. Проблема была в том, что созлавая файл Excel, должен создать временный файл Excel, причем в том месте (по умолчанию), где установлен MS Excel, да и весть МС офис...
В моём случае удаленный компьютер  закрыт от записи извне. То есть у него есть разрешения на запись, но только от определенных IP.
13 НоваяВолна
 
20.06.16
00:22
+(12) При этом команда
msExcel.Windows(1).Visible = 1;
скрыто (не визуально пока) пытается создать временный файл Книги Эквель
14 DES
 
20.06.16
06:46
(12) ищи TMP каталог, 1С - юзает его на запись, вот и ты туда пиши.