Имя: Пароль:
1C
1С v8
Не работает экспорт в excel в клиент - серверном варианте
,
0 ahmato
 
10.04.15
14:02
Коллеги, Добрый день!
Проблема не работает экспорт в excel в клиент - серверном варианте, хотя этот же код работает в файловом варианте базы.
Платформа - 8.2.19.80
Конфигурация - Управление торговлей, редакция 11.0 (11.0.8.13)
Код команды для печати:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
    //Если УправлениеПечатьюКлиент.ПроверитьДокументыПроведены(ПараметрКоманды, ПараметрыВыполненияКоманды.Источник) Тогда
        //
        //УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
        //    "Документ.ЗаказКлиента",
        //    "Спецификация",
        //    ПараметрКоманды,
        //    Неопределено,
        //    Неопределено
        //);
        //Система ="";
        //ВвестиСтроку(Система,"Укажите систему");
         ПечатьПКО(ПараметрКоманды);        
        
    //КонецЕсли;
    
КонецПроцедуры
&НаСервере
Процедура ПечатьПКО(МассивОбъектов)  экспорт
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СПЕЦИФИКАЦИЯ";
    УстановитьПривилегированныйРежим(Истина);
    ДанныеДляПечати = ПолучитьДанныеДляПечатнойФормыСпецификация(МассивОбъектов);
    ЗаполнитьТабличныйДокументСпецификация(ТабличныйДокумент, ДанныеДляПечати, МассивОбъектов);
    УстановитьПривилегированныйРежим(Ложь);
    
    
    ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
    ТабличныйДокумент.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLSX);
    ЗапуститьПриложение(ИмяФайла);
    
    
    

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

Функция ПолучитьДанныеДляПечатнойФормыСпецификация(МассивОбъектов)  экспорт
    
    Запрос = Новый Запрос("ВЫБРАТЬ
                      |    ЗаказКлиентаТовары.Категория КАК Категория,
                      |    ЗаказКлиентаТовары.Номенклатура КАК Наименование,
                      |    ЗаказКлиентаТовары.Номенклатура.Артикул КАК ПартНомер,
                      |    ЗаказКлиентаТовары.Номенклатура.Производитель КАК Производитель,
                      |    ЗаказКлиентаТовары.Номенклатура.ЕдиницаИзмерения КАК ЕдИзм,
                      |    ЗаказКлиентаТовары.КоличествоУпаковок КАК Количество,
                      |    ЗаказКлиентаТовары.СтоимостьКлиента КАК Стоимостьединицы,
                      |    ЗаказКлиентаТовары.СтавкаНДС КАК НДС,
                      |    ЗаказКлиентаТовары.Комплектация КАК Комплектация,
                      |    ЗаказКлиентаТовары.ОбщаяСтоимостьКлиента КАК ОбщаяСтоимостьКлиента,
                      |    ЗаказКлиентаТовары.ОбщаяСтоимостьКлиентаСНДС КАК ОбщаяСтоимостьКлиентаСНДС,
                      |    ЗаказКлиентаТовары.СуммаНДСКл КАК НДСКл,
                      |    ЗаказКлиентаТовары.Ссылка.Партнер,
                      |    ЗаказКлиентаТовары.ОбъектЗаказа КАК Объект
                      |ИЗ
                      |    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
                      |ГДЕ
                      |    ЗаказКлиентаТовары.Ссылка В(&МассивОбъектов)
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ЗаказКлиентаТовары.Категория,
                      |    ЗаказКлиентаТовары.Наименование,
                      |    ЗаказКлиентаТовары.Номенклатура,
                      |    ЗаказКлиентаТовары.Номенклатура.Артикул,
                      |    ЗаказКлиентаТовары.Номенклатура.Производитель,
                      |    ЗаказКлиентаТовары.Номенклатура.ЕдиницаИзмерения,
                      |    ЗаказКлиентаТовары.КоличествоУпаковок,
                      |    ЗаказКлиентаТовары.СтоимостьКлиента,
                      |    ЗаказКлиентаТовары.СтавкаНДС,
                      |    ЗаказКлиентаТовары.Комплектация,
                      |    ЗаказКлиентаТовары.ОбщаяСтоимостьКлиента,
                      |    ЗаказКлиентаТовары.ОбщаяСтоимостьКлиентаСНДС,
                      |    ЗаказКлиентаТовары.СуммаНДСКл,
                      |    ЗаказКлиентаТовары.Ссылка.Партнер,
                      |    ЗаказКлиентаТовары.ОбъектЗаказа
                      |ИТОГИ ПО
                      |    Комплектация,
                      |    Комплектация");
    Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
    //Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыПозицииВЗаказе.СогласованоОД);
    //Запрос.УстановитьПараметр("Система",Система);
    
    Возврат Запрос.Выполнить();



КонецФункции


Процедура ЗаполнитьТабличныйДокументСпецификация(ТабличныйДокумент, ДанныеДляПечати , МассивОбъектов)   экспорт
    Макет = УправлениеПечатью.ПолучитьМакет("Документ.ЗаказКлиента.Спецификация");     //Документ.ЗаказКлиента.Спецификация
    ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
    ОбластьМакета.Параметры.Партнер = МассивОбъектов.Получить(0).Партнер;
    ТабличныйДокумент.Вывести(ОбластьМакета);
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрока2 = Макет.ПолучитьОбласть("Строка2");
    ОбластьИтого = Макет.ПолучитьОбласть("Итого");
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    
    НС = 0;
    ИтогНДС = 0;
    ИтогСтЕД = 0;
    ИтогОбСтЕД = 0 ;    
    ИтогОбСтЕДСНДС = 0 ;
    ДанныеПоСистемам = ДанныеДляПечати.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ДанныеПоСистемам.Следующий() Цикл
        ДанныеПоКатегориям = ДанныеПоСистемам.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        
        
        Пока ДанныеПоКатегориям.Следующий() Цикл
            //Если НЕ ЗначениеЗаполнено(ДанныеПоКатегориям.Комплектация) Тогда
            //    Продолжить;
            //КонецЕсли;
            ОбластьСтрока2.Параметры.Комплектация =ДанныеПоКатегориям.Комплектация;
            ТабличныйДокумент.Вывести(ОбластьСтрока2);
            ДанныеПоТоварам = ДанныеПоКатегориям.Выбрать();
            
                        Пока ДанныеПоТоварам.Следующий() Цикл
                НС=НС+1;
                ИтогНДС = ИтогНДС + число(ДанныеПоТоварам.НДСкл);
                ИтогСтЕД = ИтогСтЕД + число(ДанныеПоТоварам.Стоимостьединицы);    
                ИтогОбСтЕД = ИтогОбСтЕД + число(ДанныеПоТоварам.ОбщаяСтоимостьКлиента);    
                ИтогОбСтЕДСНДС = ИтогОбСтЕДСНДС + число(ДанныеПоТоварам.ОбщаяСтоимостьКлиентаСНДС);
                ОбластьСтрока.Параметры.Заполнить(ДанныеПоТоварам);
                ОбластьСтрока.Параметры.НомерСтроки = НС;
                ОбластьСтрока.Параметры.Наименование = ДанныеПоТоварам.Наименование;
                ТабличныйДокумент.Вывести(ОбластьСтрока);
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
    
    Рубли = Цел(ИтогОбСтЕДСНДС);
    Копейки = (ИтогОбСтЕДСНДС - Рубли) * 100;
    пропись = ЧислоПрописью(ИтогОбСтЕДСНДС,,"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2" );
    
    ОбластьИтого.Параметры.ИтогСтЕД = ИтогСтЕД;
    ОбластьИтого.Параметры.ИтогОбСтЕД = ИтогОбСтЕД;
    ОбластьИтого.Параметры.ИтогОбСтЕДСНДС = ИтогОбСтЕДСНДС;
    ОбластьИтого.Параметры.ИтогНДС = ИтогНДС;
    
    ТабличныйДокумент.Вывести(ОбластьИтого);
    
    ОбластьПодвал.Параметры.Рубли = Рубли;
    ОбластьПодвал.Параметры.Копейки = Копейки;
    ОбластьПодвал.Параметры.пропись = пропись;
    ТабличныйДокумент.Вывести(ОбластьПодвал);

    ТабличныйДокумент.АвтоМасштаб = Истина;
1 ahmato
 
10.04.15
14:03
Возможно важный важный момент, когда запускаю экспорт в эксель, все зависает, какое то время висит и далее ничего не происходит.
2 vicof
 
10.04.15
14:05
Ну на сервере у тебя эксельный файл появляется. И чо?
3 George Wheels
 
10.04.15
14:08
(0) На сервере Excel установлен?
4 fisher
 
10.04.15
14:34
(0) Мне очень интересно, а чего ты ожидаешь от ЗапуститьПриложение() на сервере для ексельного файла?
5 vicof
 
10.04.15
14:45
(4) ТС стыдится
6 ahmato
 
10.04.15
14:57
(2) В принципе разобрался в вопросе, добавил:
ExcelПриложение = Новый COMОбъект("Excel.Application");
ExcelПриложение.WorkBooks.Open(ИмяФайла);
+ на сервере, где крутится сервер 1С, переустановили офис на 64х битную, как оказалось иначе ошибка:
"ExcelПриложение = Новый COMОбъект("Excel.Application");
по причине:
Отказано в доступе."

После все взлетело.

Отдельное спасибо за идею :)
7 ahmato
 
10.04.15
14:59
(3) Оно было установлено, но битность не та.
Вспомнилась фраза из фильма "Белое солнце пустыни":
"..Гранаты у него не той системы.." (С) :)))
8 ahmato
 
10.04.15
15:00
(4) ТО что я ожидаю, никак не соответствовала тому что я получил)))
(5) Вот вот)))
9 ahmato
 
10.04.15
15:08
Еще кое что забыл указать, перед тем как переустановить эксель на верный, на одном форуме вычитал следующее:
"Используется клиент-серверный вариант работы. Операционка Windows Server 2008, СУБД MS SQL 2008. При синхронизации используется прямое подключение к базе данных. При проверке подключения, вне зависимости от того, какой указывается путь и логин к синхронизируемой базе данных, появляется ошибка: "Не удалось подключиться к другой программе: -2147024891 (0x80070005): Отказано в доступе".

Решение:
1. Администрирование - Службы компонентов – Компьютеры – Мой компьютер – Приложения COM+ - Создать приложение – Создать новое приложение – вводим имя «V82.COMConnector»(переключатель «Серверное приложение») – Указанный пользователь (Администратор)
2. В появившейся ветке V82COMConnector – подветка Компоненты – создание нового компонента – Установка новых компонентов - <каталог 1С>\bin\comcntr.dll
3. Правой кнопкой по ветке V82COMConnector – Свойства – Безопасность – Снял галку «Принудительная проверка доступа для приложений» - Поставил галку «Применить политику программных ограничений» - Уровень ограничений «Неограниченный»"
Так что точно сказать, что именно помогло не смогу, возможно обе части решения вопроса нужны.
10 George Wheels
 
10.04.15
16:20
Как ты с сервера файл получать будешь? Почему бы не записывать файл на клиенте?
11 ssh2006
 
10.04.15
16:36
(0) непонятно зачем на сервере ЗапуститьПриложение(ИмяФайла);
А для ТабличныйДокумент.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLSX)
эксель там не нужен
12 ahmato
 
15.04.15
17:17
(10) На тот момент, я все тестировал на самом сервере, где располагался сервер 1С.
Соответственно все летало и взлетало. Но когда попытался сделать выгрузку из клиента запушенного на другом компьютере, у пользователя ничего не появлялось, зато запускалась копия эксель с табличным документом ?)) было забавно.
В итоге сегодня переделал код как привел ниже (все работает как на сервере, также на клиентской машине), может кому пригодится:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
            ВыгрузкаВЭксель(ПараметрКоманды);        
    
КонецПроцедуры
        
&НаКлиенте
Процедура ВыгрузкаВЭксель(МассивОбъектов)
    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ПечатьПКО(МассивОбъектов,ТабличныйДокумент);
    ВходящаяСтрока= МассивОбъектов[0];
    Пока Найти(ВходящаяСтрока," ")<>0 Цикл
    ВходящаяСтрока=СтрЗаменить(ВходящаяСтрока," ","_");
    КонецЦикла;
    ПоследнийСимвол = Прав(ВходящаяСтрока, 9);
    ВходящаяСтрока=СтрЗаменить(ВходящаяСтрока,ПоследнийСимвол,"");
    
    ИмяФайла = "\\optimus\1cdoc\Спецификации\"+ВходящаяСтрока+".XLSX";//+"_"+строка(МассивОбъектов.Получить(0).номер)+МассивОбъектов.Получить(0).проект+"_"+строка(Формат(МассивОбъектов.Получить(0).дата, "ДЛФ=Д"))+".XLSX";//+ДанныеДляПечати.Номер+" "+ДанныеДляПечати.проект;
    ТабличныйДокумент.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLSX);
    ExcelПриложение = Новый COMОбъект("Excel.Application");
    ExcelПриложение.Visible = Истина;
    ExcelПриложение.WorkBooks.Open(ИмяФайла);
    
    
    
КонецПроцедуры

&НаСервере
Процедура ПечатьПКО(МассивОбъектов,ТабличныйДокумент)  экспорт
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СПЕЦИФИКАЦИЯ";
ДанныеДляПечати = ПолучитьДанныеДляПечатнойФормыСпецификация(МассивОбъектов);
ЗаполнитьТабличныйДокументСпецификация(ТабличныйДокумент, ДанныеДляПечати, МассивОбъектов);
КонецПроцедуры


Функция ПолучитьДанныеДляПечатнойФормыСпецификация(МассивОбъектов)  экспорт
    
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    ЗаказКлиентаТовары.Категория КАК Категория,
                          |    ЗаказКлиентаТовары.Номенклатура КАК Наименование,
                          |    ЗаказКлиентаТовары.Номенклатура.Артикул КАК ПартНомер,
                          |    ЗаказКлиентаТовары.Номенклатура.Производитель КАК Производитель,
                          |    ЗаказКлиентаТовары.Номенклатура.ЕдиницаИзмерения КАК ЕдИзм,
                          |    ЗаказКлиентаТовары.КоличествоУпаковок КАК Количество,
                          |    ЗаказКлиентаТовары.СтоимостьКлиента КАК Стоимостьединицы,
                          |    ЗаказКлиентаТовары.СтавкаНДС КАК НДС,
                          |    ЗаказКлиентаТовары.Комплектация КАК Комплектация,
                          |    ЗаказКлиентаТовары.ОбщаяСтоимостьКлиента КАК ОбщаяСтоимостьКлиента,
                          |    ЗаказКлиентаТовары.ОбщаяСтоимостьКлиентаСНДС КАК ОбщаяСтоимостьКлиентаСНДС,
                          |    ЗаказКлиентаТовары.СуммаНДСКл КАК НДСКл,
                          |    ЗаказКлиентаТовары.Ссылка.Партнер КАК Партнер,
                          |    ЗаказКлиентаТовары.ОбъектЗаказа КАК Объект,
                          |    ЗаказКлиентаТовары.Ссылка.Контрагент КАК Контрагент,
                          |    ЗаказКлиентаТовары.Ссылка.Дата КАК Дата,
                          |    ЗаказКлиентаТовары.Ссылка.Номер КАК Номер,
                          |    ЗаказКлиентаТовары.Ссылка.Проект КАК Проект
                          |ИЗ
                          |    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
                          |ГДЕ
                          |    ЗаказКлиентаТовары.Ссылка В(&МассивОбъектов)
                          |
                          |СГРУППИРОВАТЬ ПО
                          |    ЗаказКлиентаТовары.Категория,
                          |    ЗаказКлиентаТовары.Наименование,
                          |    ЗаказКлиентаТовары.Номенклатура,
                          |    ЗаказКлиентаТовары.Номенклатура.Артикул,
                          |    ЗаказКлиентаТовары.Номенклатура.Производитель,
                          |    ЗаказКлиентаТовары.Номенклатура.ЕдиницаИзмерения,
                          |    ЗаказКлиентаТовары.КоличествоУпаковок,
                          |    ЗаказКлиентаТовары.СтоимостьКлиента,
                          |    ЗаказКлиентаТовары.СтавкаНДС,
                          |    ЗаказКлиентаТовары.Комплектация,
                          |    ЗаказКлиентаТовары.ОбщаяСтоимостьКлиента,
                          |    ЗаказКлиентаТовары.ОбщаяСтоимостьКлиентаСНДС,
                          |    ЗаказКлиентаТовары.СуммаНДСКл,
                          |    ЗаказКлиентаТовары.Ссылка.Партнер,
                          |    ЗаказКлиентаТовары.ОбъектЗаказа,
                          |    ЗаказКлиентаТовары.Ссылка.Контрагент,
                          |    ЗаказКлиентаТовары.Ссылка.Дата,
                          |    ЗаказКлиентаТовары.Ссылка.Номер,
                          |    ЗаказКлиентаТовары.Ссылка.Проект
                          |
                          |УПОРЯДОЧИТЬ ПО
                          |    Категория УБЫВ
                          |ИТОГИ ПО
                          |    Комплектация,
                          |    Комплектация");
    Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
    //Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыПозицииВЗаказе.СогласованоОД);
    //Запрос.УстановитьПараметр("Система",Система);
    
    Возврат Запрос.Выполнить();



КонецФункции


Процедура ЗаполнитьТабличныйДокументСпецификация(ТабличныйДокумент, ДанныеДляПечати , МассивОбъектов)   экспорт
    Макет = УправлениеПечатью.ПолучитьМакет("Документ.ЗаказКлиента.Спецификация");     //Документ.ЗаказКлиента.Спецификация
    ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
    ОбластьМакета.Параметры.Партнер = МассивОбъектов.Получить(0).Партнер;
    ТабличныйДокумент.Вывести(ОбластьМакета);
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрока2 = Макет.ПолучитьОбласть("Строка2");
    ОбластьИтого = Макет.ПолучитьОбласть("Итого");
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    
    НС = 0;
    ИтогНДС = 0;
    ИтогСтЕД = 0;
    ИтогОбСтЕД = 0 ;    
    ИтогОбСтЕДСНДС = 0 ;
    ДанныеПоСистемам = ДанныеДляПечати.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ДанныеПоСистемам.Следующий() Цикл
        ДанныеПоКатегориям = ДанныеПоСистемам.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        
        
        Пока ДанныеПоКатегориям.Следующий() Цикл
            //Если НЕ ЗначениеЗаполнено(ДанныеПоКатегориям.Комплектация) Тогда
            //    Продолжить;
            //КонецЕсли;
            ОбластьСтрока2.Параметры.Комплектация =ДанныеПоКатегориям.Комплектация;
            ТабличныйДокумент.Вывести(ОбластьСтрока2);
            ДанныеПоТоварам = ДанныеПоКатегориям.Выбрать();
            
                        Пока ДанныеПоТоварам.Следующий() Цикл
                НС=НС+1;
                ИтогНДС = ИтогНДС + число(ДанныеПоТоварам.НДСкл);
                ИтогСтЕД = ИтогСтЕД + число(ДанныеПоТоварам.Стоимостьединицы);    
                ИтогОбСтЕД = ИтогОбСтЕД + число(ДанныеПоТоварам.ОбщаяСтоимостьКлиента);    
                ИтогОбСтЕДСНДС = ИтогОбСтЕДСНДС + число(ДанныеПоТоварам.ОбщаяСтоимостьКлиентаСНДС);
                ОбластьСтрока.Параметры.Заполнить(ДанныеПоТоварам);
                ОбластьСтрока.Параметры.НомерСтроки = НС;
                ОбластьСтрока.Параметры.Наименование = ДанныеПоТоварам.Наименование;
                ТабличныйДокумент.Вывести(ОбластьСтрока);
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
    
    Рубли = Цел(ИтогОбСтЕДСНДС);
    Копейки = (ИтогОбСтЕДСНДС - Рубли) * 100;
    пропись = ЧислоПрописью(ИтогОбСтЕДСНДС,,"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2" );
    
    ОбластьИтого.Параметры.ИтогСтЕД = ИтогСтЕД;
    ОбластьИтого.Параметры.ИтогОбСтЕД = ИтогОбСтЕД;
    ОбластьИтого.Параметры.ИтогОбСтЕДСНДС = ИтогОбСтЕДСНДС;
    ОбластьИтого.Параметры.ИтогНДС = ИтогНДС;
    
    ТабличныйДокумент.Вывести(ОбластьИтого);
    
    ОбластьПодвал.Параметры.Рубли = Рубли;
    ОбластьПодвал.Параметры.Копейки = Копейки;
    ОбластьПодвал.Параметры.пропись = пропись;
    ТабличныйДокумент.Вывести(ОбластьПодвал);

    ТабличныйДокумент.АвтоМасштаб = Истина;

КонецПроцедуры
13 ahmato
 
15.04.15
17:20
(11) Задача стояла другая, необходимо было не только записать эксель с определенным названием, но и запустить его на клиентской машине.
14 ahmato
 
15.04.15
17:25
(12) "...зато запускалась копия эксель с табличным документом на сервере*?))"
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс