Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> 1c 7.7. Работа с Ole объектом из "Таблицы" , Управление OLE объектом типа "Лист Microsoft Excel" в таблице          
Lunatik_5 Подменю пользователя
сообщение 31.10.16, 8:17
Сообщение #1

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

При нажатии кнопки печать в отчете, в таблицу нужно вывести некоторые данные + секцию с данными Excel.
В конфигураторе в таблицу вставил OLE объект с типом "Лист Microsoft Excel", в поле текст написал процедуру ОлеДокумент(Таб.ТекущийОбъект, ПутьКФайлу)
Мне нужно чтобы при выводе на печать этот объект открывал файл "ПутьКФайлу".
В процедуре ОлеДокумен я планировал открывать нужный мне файл

Процедура ОлеДокумент(Объект, ПутьФайла) 
   Сообщить(ТипЗначенияСТР(Объект));
   Объект.WorkBooks.Open(ПутьФайл);
   //...


ТипЗначенияСТР дает значение "OLE._Workbook", но любые команды которые работают с Объект = СоздатьОбъект("Excel.Application") в случае когда этот объект получен из таблицы не работают. Пробовал разные варианты ничего не работает. То же самое пробовал и с Word, проблема та же. Подскажите что я не правильно делаю? Или с объект "excel" полученным из таблицы шаблона 1с нельзя программно работать?


 ! 

Правила: 9
 


Сообщение отредактировал Vofka - 31.10.16, 9:34

Sharzem Подменю пользователя
сообщение 31.10.16, 16:53
Сообщение #2

Оратор
Иконка группы
Группа: Местный
Сообщений: 298
Спасибо сказали: 98 раз
Рейтинг: 99.1

А можно поинтересоваться:

1. Зачем при выводе на печать открывать файл "ПутьКФайлу" ?
2. Что Вы пытаетесь оттуда еще достать, если до момента вывода таблицы Вы уже знаете что там (в книге) находится и где ?
3. Зачем вообще эту книгу размещать в таблице ?


Signature
То, что для одного человека константа, для другого - переменная. (Алан.Дж.Перлис)

Lunatik_5 Подменю пользователя
сообщение 31.10.16, 23:08
Сообщение #3

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

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с без данных экселя и отдельно откроется эксель с нужными мне данными.
Заполнять мне конечно ничего не нужно, но если проанализровать два примера, то в качестве "объекта" в процедуру ОлеДокумент передается уже созданная книга и метод Open(ПутьКФайлу) к книге нельзя применять, его нужно применять к объекту "эксель" который каким то образом встроен в качестве оле-объекта в таблице, но у меня есть только объект "Книга". Может можно через "Книгу", которую стандартно передает 1с в мою процедуру добраться к объекту эксель связанному с моей таблицой?

igmig65 Подменю пользователя
сообщение 01.11.16, 7:24
Сообщение #4

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 613
Из: Донецкая обл
Спасибо сказали: 168 раз
Рейтинг: 140.9

Зачем вам открывать эксель, просто добавьте данные из экселя в таблицу 1с

Lunatik_5 Подменю пользователя
сообщение 03.11.16, 9:26
Сообщение #5

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

"Зачем вам открывать эксель, просто добавьте данные из экселя в таблицу 1с"
Если другого варианта не будет, то придется. Добавить не так то и просто, информация в разных ячейках, с разным форматированием, возможно есть таблицы, диаграммы и т.д.

Sharzem Подменю пользователя
сообщение 03.11.16, 11:00
Сообщение #6

Оратор
Иконка группы
Группа: Местный
Сообщений: 298
Спасибо сказали: 98 раз
Рейтинг: 99.1

Цитата(Lunatik_5 @ 03.11.16, 9:26) *
Добавить не так то и просто

Мне кажется что Вы себе усложняете жизнь. Приведу кусок кода, может поймете:
//======================================================================
Функция ВернутьБезЛишнихПробелов(прСтрока)
    лпСтрока = СокрЛП(прСтрока);
    Пока Найти(лпСтрока,"  ") > 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 С. После вывода на экран можете работать с глобальными и предопределенными во время заполнения объектами/процедурами (с глобальными только до тех пор пока открыта форма отчета).
Т.е. фактически получаем то что Вы хотите:
Цитата(Lunatik_5 @ 31.10.16, 23:08) *
1. Есть excel файлы информация в которых может меняться. Есть пользователи которые не занимаются этими файлами и вообще не знают где они находятся, но им нужно сформировать печать, где часть информации это данные из 1с, а другая часть это excel файл. Все это вывести при нажатии кнопки печать в стандартную привычную таблицу, которую потом можно распечатать.Одной секцией я вывожу информацию из 1с, а затем следующей хотел через ole объект вывести информацию из excel файла.

Почему предлагаю Таблицу значений, думаю понятно: сможете в ней искать все что Вам необходимо (коды номенклатуры, названия - если не будете пробелы убирать см. функцию ВернутьБезЛишнихПробелов())


Signature
То, что для одного человека константа, для другого - переменная. (Алан.Дж.Перлис)

Спасибо сказали: assa62,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 19.04.24, 1:15
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!