При нажатии кнопки печать в отчете, в таблицу нужно вывести некоторые данные + секцию с данными Excel.
В конфигураторе в таблицу вставил OLE объект с типом "Лист Microsoft Excel", в поле текст написал процедуру ОлеДокумент(Таб.ТекущийОбъект, ПутьКФайлу)
Мне нужно чтобы при выводе на печать этот объект открывал файл "ПутьКФайлу".
В процедуре ОлеДокумен я планировал открывать нужный мне файл
Процедура ОлеДокумент(Объект, ПутьФайла)
Сообщить(ТипЗначенияСТР(Объект));
Объект.WorkBooks.Open(ПутьФайл);
//...
! | http://pro1c.org.ua/index.php?act=announce&id=2: 9 |
А можно поинтересоваться:
1. Зачем при выводе на печать открывать файл "ПутьКФайлу" ?
2. Что Вы пытаетесь оттуда еще достать, если до момента вывода таблицы Вы уже знаете что там (в книге) находится и где ?
3. Зачем вообще эту книгу размещать в таблице ?
1. Есть excel файлы информация в которых может меняться. Есть пользователи которые не занимаются этими файлами и вообще не знают где они находятся, но им нужно сформировать печать, где часть информации это данные из 1с, а другая часть это excel файл. Все это вывести при нажатии кнопки печать в стандартную привычную таблицу, которую потом можно распечатать.Одной секцией я вывожу информацию из 1с, а затем следующей хотел через ole объект вывести информацию из excel файла. Все то же самое нужно еще сделать и для word и для pdf, но начал я с excel.
На текущий момент я знаю как вносить информацию в ячейки экселя встроенного в таблицу как оле объект, но не знаю как загрузить в него уже созданный и заполенный файл экселя.
Процедура ОлеДокумент(Объект, ПутьФайла)
Лист = Объект.WorkSheets.Add();
Лист.Cells(1,2).Value = "Вася";
КонецПроцедуры
Процедура ОлеДокумент(Объект, ПутьФайла)
Эксель= СоздатьОбъект("Excel.Application");
Эксель.Visible = 1;
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
//Заполнить ячейку строкой "Вася" для сравнения с кодом выше
Лист = Книга.WorkSheets.Add();
Лист.Cells(1,2).Value = "Вася";
КонецПроцедуры
Зачем вам открывать эксель, просто добавьте данные из экселя в таблицу 1с
"Зачем вам открывать эксель, просто добавьте данные из экселя в таблицу 1с"
Если другого варианта не будет, то придется. Добавить не так то и просто, информация в разных ячейках, с разным форматированием, возможно есть таблицы, диаграммы и т.д.
//======================================================================
Функция ВернутьБезЛишнихПробелов(прСтрока)
лпСтрока = СокрЛП(прСтрока);
Пока Найти(лпСтрока," ") > 0 Цикл
лпСтрока = СтрЗаменить(лпСтрока," "," ");
КонецЦикла;
Возврат лпСтрока;
КонецФункции // ВернутьБезЛишнихПробелов
//======================================================================
Процедура УстановитьМаксДлинуВМассив(прМассив,прЗначение,прНомер)
лпСтрДлина = СтрДлина(прЗначение);
лпСтрДлина = ?(лпСтрДлина = 0,1,лпСтрДлина);
лпРазмерМассива = прМассив.РазмерСписка();
Если лпРазмерМассива >= прНомер Тогда
лпДлина = прМассив.ПолучитьЗначение(прНомер);
лпСтрДина = Макс(лпСтрДлина,лпДлина);
прМассив.УстановитьЗначение(прНомер,лпСтрДина);
Иначе
прМассив.ДобавитьЗначение(лпСтрДлина);
КонецЕсли;
КонецПроцедуры // УстановитьШиринуКолонокТаблЗнач
//======================================================================
Процедура УстановитьПараметрыКолонкиШирина(прМассив,прТаблЗнач)
лпКолКолонок = прТаблЗнач.КоличествоКолонок();
Для лпСч = 1 По лпКолКолонок Цикл
лпДлина = прМассив.ПолучитьЗначение(лпСч);
лпДлина = ?(лпДлина > 10,10,лпДлина);
прТаблЗнач.УстановитьПараметрыКолонки(лпСч,,,,,лпДлина);
КонецЦикла;
КонецПроцедуры // УстановитьПараметрыКолонкиШирина
//======================================================================
Функция ПрочитатьXLSФайлVBA(прФайл)
Перем WB;
лпФайл = Нрег(СокрЛП(прФайл));
Excel = СоздатьОбъект("Excel.Application");
WB=Excel.Workbooks.Open(лпФайл);
лпТаблЗнач = СоздатьОбъект("ТаблицаЗначений");
scr=СоздатьОбъект("MSScriptControl.ScriptControl");
scr.language="javascript";
scr.timeout=-1;
scr.addobject("WS",WB.Worksheets(1));
arr = scr.eval("new VBArray(WS.UsedRange.Value)");
WB.Close(0);
лпСтроки = arr.ubound(1);
лпКолонки = arr.ubound(2);
лпТаблЗнач = СоздатьОбъект("ТаблицаЗначений");
Для лпКолонка = 1 по лпКолонки Цикл
лпТаблЗнач.НоваяКолонка();
КонецЦикла;
Состояние("Чтение файла xls...");
лпСчСтрок = 0; лпРазмерФайла = лпСтроки;
лпМассив = СоздатьОбъект("СписокЗначений");
Для лпСчСтрок = arr.lbound(2) По arr.ubound(1) Цикл
Если лпСчСтрок > лпРазмерФайла Тогда
Прервать;
КонецЕсли;
лпТаблЗнач.НоваяСтрока();
Для лпСчКолонок = arr.lbound(1) По arr.ubound(2) Цикл
лпЗначение = ВернутьБезЛишнихПробелов(arr.getItem(лпСчСтрок,лпСчКолонок));
лпТаблЗнач.УстановитьЗначение(лпСчСтрок,лпСчКолонок,лпЗначение);
УстановитьМаксДлинуВМассив(лпМассив,лпЗначение,лпСчКолонок)
КонецЦикла;
Если (лпСчСтрок % 100 = 0) Тогда
Состояние("Обработано строк: "+лпСчСтрок+" из: "+лпРазмерФайла);
КонецЕсли;
КонецЦикла;
УстановитьПараметрыКолонкиШирина(лпМассив,лпТаблЗнач);
Excel.Quit();
scr = 0; arr = 0;
Возврат лпТаблЗнач;
КонецФункции // ПрочитатьXLSФайлVBA(прФайл)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua