gifts2017

Active Document + Excel + 1c8.2

Опубликовал Anatoly Pugin (Matador) в раздел Программирование - Практика программирования

Пример кода в 1С, как использовать макеты Excel листов напрямую.

Редко, но иногда использую - очень полезная штука.

ТабДок = Новый табличныйДокумент;
АктивныйДокумент = ПолучитьМакет("Макет");  //-- Макет Active Document лист Ексель.

КомОбъект = АктивныйДокумент.Получить();

//--- далее пишем в Cells(НомерСтроки, НомерСтолбца). Value  все что нужно. см.пример ниже 

КомОбъект.ActiveSheet.Cells(6,1).Value=сокрлп(ТекДокумент.Организация);
КомОбъект.ActiveSheet.Cells(8,1).Value=сокрлп(ТекДокумент.Подразделение);

КомОбъект.ActiveSheet.Cells(15,35).Value=сокрлп(ТекДокумент.Номер);
КомОбъект.ActiveSheet.Cells(15,43).Value=сокрлп(формат(ТекДокумент.Дата, "ДФ=dd.MM.yyyy"));
  
// строчки
Для Каждого СТР ИЗ ТекДокумент.Материалы Цикл

    Если Лев(сокрлп(стр.Счет), 2) = "20" Тогда

        КомОбъект.ActiveSheet.Cells(28,1).Value=сокрлп(стр.Номенклатура);
        КомОбъект.ActiveSheet.Cells(28,23).Value=сокрлп(стр.Цена);
        КомОбъект.ActiveSheet.Cells(28,27).Value=сокрлп(стр.Количество);
        КомОбъект.ActiveSheet.Cells(28,30).Value=сокрлп(стр.Сумма);

    Иначе

        КомОбъект.ActiveSheet.Cells(Ном,34).Value=сокрлп(стр.Номенклатура);
        КомОбъект.ActiveSheet.Cells(Ном,62).Value=сокрлп(стр.Цена);
        КомОбъект.ActiveSheet.Cells(Ном,66).Value=сокрлп(стр.Количество);
        КомОбъект.ActiveSheet.Cells(Ном,70).Value=сокрлп(стр.Сумма);
        Ном = Ном +1;
    КонецЕсли;

КонецЦикла;
// ну и напоследок отображает открытую книгу Ексель. 

КомОбъект.Application.Visible = 1;
КомОбъект.Windows(1).Visible = 1;

См. также

Подписаться Добавить вознаграждение

Комментарии

1. v_id (v_id) 01.08.11 16:29
EXEL
редко но иногда использую


ндя...
2. Алексей Константинов (alexk-is) 01.08.11 16:59
3. Anatoly Pugin (Matador) 01.08.11 18:30
4. Anatoly Pugin (Matador) 01.08.11 18:32
v_id пишет:
ндя...
исправил.со :)
5. Серазм С (sserazm) 02.08.11 10:56
Не удалось получить работающий результат. Исходные данные : платформа 8.1.15, в обработку поместил макет екселя 97-2003, другой тупо не помещался (на компе Office2007). После запуски обработки, на секунду показывается екселевский документ и пропадает. Как с этим боротся ?
6. Anatoly Pugin (Matador) 02.08.11 12:01
sserazm пишет:

Не удалось получить работающий результат. Исходные данные : платформа 8.1.15, в обработку поместил макет екселя 97-2003, другой тупо не помещался (на компе Office2007). После запуски обработки, на секунду показывается екселевский документ и пропадает. Как с этим боротся ?


попробуйте так поставить.
КомОбъект.Application.Workbooks.visible = 1;

в отладчике можете посмотреть все доступные атрибуты обьекта "КомОбъект.Application" и с ними поработать.
7. Серазм С (sserazm) 02.08.11 12:43
Попробывал использовать КомОбъект.Application.Workbooks.visible = 1; не получилось. У КомОбъект.Application.Workbooks, нету метода visible/
Как получить работающий результат ?
8. Anatoly Pugin (Matador) 02.08.11 18:18
sserazm пишет:

Попробывал использовать КомОбъект.Application.Workbooks.visible = 1; не получилось. У КомОбъект.Application.Workbooks, нету метода visible/
Как получить работающий результат ?


как вариант обновить платформу до 8.2 т.к у меня 8.2 и потестить на 8.1 возможности нет.
9. Серазм С (sserazm) 03.08.11 12:10
Платформа 8.2.13, делаю обработку загоняю в макет двоичных данных ексель формата 97-2003, пишу код :
ТаблДок=Новый ТабличныйДокумент;
АктивныйДокумент=ПолучитьМакет("Макет");
КомОбъект=АктивныйДокумент.Получить();
КомОбъект.ActiveSheet.Cells(5,3).Value=10;
КомОбъект.ActiveSheet.Cells(6,3).Value=20;
КомОбъект.ActiveSheet.Cells(7,3).Value=30;
КомОбъект.Application.Visible = 1;
КомОбъект.Windows(1).Visible = 1;
Запускаю, на мгновение открывается пустое окно Екселя, без рабочих книг и сразу закрывается.
В чем пробелма ??
10. Anatoly Pugin (Matador) 03.08.11 13:29
sserazm пишет:

Платформа 8.2.13, делаю обработку загоняю в макет двоичных данных ексель формата 97-2003, пишу код :
ТаблДок=Новый ТабличныйДокумент;
АктивныйДокумент=ПолучитьМакет("Макет");
КомОбъект=АктивныйДокумент.Получить();
КомОбъект.ActiveSheet.Cells(5,3).Value=10;
КомОбъект.ActiveSheet.Cells(6,3).Value=20;
КомОбъект.ActiveSheet.Cells(7,3).Value=30;
КомОбъект.Application.Visible = 1;
КомОбъект.Windows(1).Visible = 1;
Запускаю, на мгновение открывается пустое окно Екселя, без рабочих книг и сразу закрывается.
В чем пробелма ??


у себя делаю на платформе 8.2.14.96 офис 2010
тут по сути могут быть лишь два типа ошибок. либо платформа не умеет использовать либо VBA вашего офиса. не правильно отрабатывает. последнее врядли .т.к это типовые команды VBA они еще в 97 офисах работали.
11. Андрей Гореликов (alon) 06.08.11 00:48
ТабДок = Новый табличныйДокумент;

Что это и куда?
12. Владимир Чаклин (vec435) 19.10.11 15:51
сама идея хорошая.можно "загнать" в макет нужной структуры
13. Руслан (02RUSlan) 09.11.11 10:27
Сделайте, пожалуйста, типовую обработку для примера
15. Kostya Zhurov (It-developer) 15.02.12 12:47
Не используейте Active Document в 1с - куйня редкостная. Жутко тормознутая, невозможно работать в Excel когда что-то выгружаешь с ее помощью. Особенно плохо себя показывает когда хочешь вставить картинки. Пришлось переделывать отчет, чтобы ее не использовать - я сделал табличные документы, которые сохраняешь в Excel, затем объединение таблиц и потом обработка макросом (чтоб сделать гиперссылки). Все это дало колоссальный прирост производительности
16. розница.net (ZLENKO) 19.03.12 16:41
(9) Проблема в границах видимости переменной КомОбъект.
Когда заканчивается выполнение вашей процедуры или функции, то переменная уничтожается.
Объявите переменную как переменую формы:
Перем КомОбъект;
17. розница.net (ZLENKO) 11.05.12 15:54
(15) Согласен. Не используйте Active Document - его невозможно сохранить!
Убил кучу времени пока понял, что это не я что то не так делаю, а просто невозможно.
Сделал просто через COM.
Однако Excel 2007-2010 через COM ужасно медленно работает с ячейками, поэтому пришлось формировать то что надо вывести в буфер обмена Windows, а потом программно вставить на лист Excel через COM.
18. Вячеслав Козлов (LanGrid) 28.06.12 09:28
(16) розница.net,
+1 , в точку.
Вот аналогично для MSWord.
Переменная в модуле формы не объявлена, процедура в модуле объекта, но Word не закрывается :0)

Процедура ЗаполнитьПечатныйДокументТ5_2004(ИмяМакета)

Попытка
Т5_от_5_1_2004=ПолучитьМакет("Т5_от_5_1_2004");
MSWord=Т5_от_5_1_2004.Получить();
Исключение
Сообщить(ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
КонецПопытки;

Размер1=Формат(Сумма, "ЧЦ=15; ЧДЦ=2;ЧРД=' '");
Размер1ЦелаяЧасть=Формат(Цел(Сумма), "ЧРД=' '");
Размер1Дробнаячасть=Сумма-Цел(Сумма);
Размер1Дробнаячасть1=?(Размер1Дробнаячасть=0,"00",Размер1Дробнаячасть*100);
Сумма_стр=ЧислоПрописью(Сумма,, "Рубль, руб., руб., м, копейка, коп., коп., ж, 2");

MSWord.Content.Find.Execute("[НазваниеОрганизации]",,,,,,,,,Организация);
MSWord.Content.Find.Execute("[НомерДок]",,,,,,,,,НомерПриказа);
MSWord.Content.Find.Execute("[КодПоОКПО]",,,,,,,,,КодПоОКПО);
MSWord.Content.Find.Execute("[ДатаДок]",,,,,,,,,ДатаПриказа);
MSWord.Content.Find.Execute("[Работник]",,,,,,,,,СотрудникФИО);
MSWord.Content.Find.Execute("[ТабельныйНомер]",,,,,,,,,ТабельныйНомер);
MSWord.Content.Find.Execute("[Подразделение1]",,,,,,,,,Подразделение);
MSWord.Content.Find.Execute("[Должность1]",,,,,,,,,Должность);
MSWord.Content.Find.Execute("[Мотив]",,,,,,,,,Приказ);
MSWord.Content.Find.Execute("[Вид_п]",,,,,,,,,Награда.Наименование);
MSWord.Content.Find.Execute("[Основание]",,,,,,,,,Основание);
MSWord.Content.Find.Execute("[Сумма_руб]",,,,,,,,,Размер1ЦелаяЧасть);
MSWord.Content.Find.Execute("[Сумма_коп]",,,,,,,,,Размер1Дробнаячасть1);
MSWord.Content.Find.Execute("[Сумма_стр]",,,,,,,,,Сумма_стр);
MSWord.Content.Find.Execute("[ДолжностьРук]",,,,,,,,,ДолжностьРуководителя);
MSWord.Content.Find.Execute("[ФИОРук]",,,,,,,,,ФИОРуководителя);

MSWord.Application.Visible=Истина;
MSWord.Activate();

КонецПроцедуры
19. Вячеслав Козлов (LanGrid) 28.06.12 09:37
(17) розница.net,
Делаю аналогично, формирую ТаблицаЗначений.
Создаю документ по шаблону
Попытка
Excel = Новый COMОбъект("Excel.Application");
Попытка
Excel.Workbooks.Open(ФайлШаблона);
НомерКниги = Excel.Workbooks.Count;
Книга = Excel.Workbooks.Item(НомерКниги);
Лист = Excel.ActiveSheet;

// содать новую книгу
Excel.Application.Workbooks.Add(1);
НомерКниги = Excel.Workbooks.Count;
КнигаНовая = Excel.Workbooks.Item(НомерКниги);
ЛистНовый = Excel.ActiveSheet;

// копировать область в новую книгу
Лист.Range("Шаблон").Copy(ЛистНовый.Range("A1:Y22"));

Excel.Workbooks.Item(1).Close(Ложь);


Переливаем из ТЗ в документ.
20. 1с-программы.com (ZLENKO) 11.09.12 17:15
(19) С поячеечным переливанием тоже проблема - VBA (по крайней мере при вызове для COM объекта) на Excel 2007-2010 имеет сильную деградацию производительности (первая сотня ячеек быстро, а потом все медленнее и медленнее и после тысячи совсем тормозит). После длительных поисков вариантов решения остановился таки на формировании текстового буфера обмена и вставки его в подготовленный (с созданным оформлением, условным форматированием и т.п.) файл Excel.

	
Функция ПолучитьТекстБуфераОбмена() Экспорт
#Если Клиент Тогда
    Объект = Новый COMОбъект("htmlfile");
    Возврат Объект.ParentWindow.ClipboardData.Getdata("Text");
#КонецЕсли
КонецФункции
 
Функция УстановитьТекстВБуферОбмена(Текст) Экспорт
#Если Клиент Тогда 
    Объект = Новый COMОбъект("htmlfile");
    Объект.ParentWindow.ClipboardData.Setdata("Text", Текст);
    Возврат Текст;
#КонецЕсли 
КонецФункции   

ДокументБуфераОбмена = Новый ТекстовыйДокумент;
...
//Вставим данные в подготовленный лист Excel
УстановитьТекстВБуферОбмена(ДокументБуфераОбмена.ПолучитьТекст());
ЛистДанныхExcel.Paste(ЛистДанныхExcel.Cells(НомерНачСтрокиExcel, 1));
...Показать Скрыть
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа