gifts2017

v82 управляемые формы: способ вывода excel листа на управляемую форму с перехватом некоторых событий экселя.

Опубликовал Сергей Марченко (MarSeN) в раздел Программирование - Практика программирования

Еще на 256 релизе 8.2 передо мной была поставлена задача в тонком клиенте на форме документа разместить лист ексель, и не просто выложить, а еще и обрабатывать его события. Произведя исследования я с огорчением обнаружил отсутствие возможности в управляемой форме разместить ActiveX. Это обстоятельство натолкнуло меня на некоторые изыскания, результатом которого я решил поделиться в этой статье.  

Предлагаю вашему вниманию разработанный мною способ работы с экселем (OWC) в управляемой форме тонкого клиента с возможностью обработки основных событий экселя (MouseUp, MouseDown, EndEdit, DblClick, OnResize)

Коротко о возникающих проблемах:

1. На тонкую форму нельзя выложить ActiveX, поэтому было решено работать с HTML документом. Для этого формируется текст HTML с выводом в нем OWC (в примере используется OWC10).

На этом этапе  нужно позаботиться чтоб OWC был установлен на клиенте и разрешен запуск активИкс "без вопросов". 

2. После того как мы поместили лист экселя на форму, к сожалению, обнаруживаем что события, генерируемые OWC никак не передаются в 1С. После некоторого мыслительного процесса было решено транслировать события эксель посредством Java скриптов, расположенных в теле HTML. Выглядит это так: 1) в теле HTML определяются "перехватчики" событий екселя; 2) в заголовке HTML определяются переменные для передачи параметров. 3) в перехватчике при наступлении события записываем в переменную имя события и необходимые параметры и генерируем клик на HTML. 

Далее уже в 1С в событии поля HTML "ПриНажатии" читаем значения наших переменных и сами вызываем одноименные процедуры уже в 1C.

//Эмуляция событий экселя
Если ДанныеСобытия.Document = Неопределено Тогда
event = Элемент.Документ.body.attributes.event.value;
Если event = "resize" Тогда
Excel_OnResize();
Возврат
ИначеЕсли event = "DblClick" Тогда
Excel_DblClick();
Возврат
ИначеЕсли event = "MouseUp" Тогда
Excel_MouseUp();
Возврат
ИначеЕсли event = "MouseDown" Тогда
Excel_MouseDown();
Возврат
ИначеЕсли event = "EndEdit" Тогда
Excel_EndEdit();
Возврат
КонецЕсли;
Сообщить("event:"+event+"
|command:"+Элемент.Документ.body.attributes.command.value);
КонецЕсли;

3. При изменении формы эксель не "подтягивается" по размеру HTML поля. Поэтому был произведен перехват onResize и написана процерура, которая правит этот баг

&НаКлиенте
Процедура Excel_OnResize()
Документ = Элементы.HTML.Документ;
Spreadsheet = Документ.all.Spreadsheet;
body = Документ.body;
Если Spreadsheet.Autofit <> Ложь Тогда
Spreadsheet.Autofit = Ложь;
КонецЕсли;
Если Spreadsheet.Height <> ""+body.clientHeight Тогда
Spreadsheet.Height = body.clientHeight
КонецЕсли;
Если Spreadsheet.Width <> ""+body.clientWidth Тогда
Spreadsheet.Width = body.clientWidth;
КонецЕсли;
КонецПроцедуры

Собственно наверное все.

В пикреплении архив с OCW10 и обработкой-примером.

Реализован перехват упомянутых выше событий екселя, проверка на установленный OWC10, интервейс для получения объекта эксель, заготовку процедур чтения XML данных екселя из базы.

PS: Тестировалось на Windows XP. На 7-й винде нужно использовать OWC11. Использование OWC10 приводит к падению. не забываем при этом поменять текст HTML

Скачать файлы

Наименование Файл Версия Размер
Пример 109
.zip 8,18Mb
04.07.12
109
.zip 8,18Mb Скачать

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Сергей Болбачан (sergbsv) (10.00 $m)
Подписаться Добавить вознаграждение
Комментарии
1. Ростислав Кузьмин (Kuzja_R) 05.07.12 12:11
Плюс. Только хорошо бы пояснить вкратце, что такое OWC. Из текста не понятно ни что это такое, ни где его брать. То ли от экселя приблуда, то ли сторонняя разработка.
2. Сергей Марченко (MarSeN) 05.07.12 12:22
OWC - Office Web Component. Это бесплатный пакет от MS Office который реализует вывод в частности екселя в HTML.
Берется из инета в свободном доступе. В прикрепленном архиве он есть.
Спасибо
3. г. Казань Рустем Гумеров (Rustig) 07.07.12 11:23
(0) сложновато для понимания для чего это нужно, и в части реализации много всего надо увязывать.
У меня вопрос: все ли возможности Эксель можно использовать при таком встраивании в 1С?
4. Сергей Марченко (MarSeN) 07.07.12 13:18
to: Rustig
Согласен, понять сложно. Но в примере рабочий код который можно просто использовать. Наверное все мы начинали с того что анализировали примеры и использовали "чужие" подходы для решения своих задач.
В этой статье я попытался описать/показать на примере способ выложить на форму ActivX и работать с ним, в том числе и перехватывать/передавать события "актива" для обработки в 1С. Это может быть не не только ексель.

В моей практике использовал подход в бюджетировании. Сужествовала настройка щаблона (екселя: определение активных областей с привязкой к ним типов 1С) и последующее заполнение в доступные поля информацией с последующим проведением (данные помещались в регистры). Причем настройка была универсальная. Отмечалась область(ти) экселя и им присваивался тип/вид/предопределенное значение и т.п.

С объектом эексель листа доступные все необходимые методы и свойства (перебор, доступность ячейки, считывание/помещение данных и т.п.). Что касается событий - основные я выложил в примере и описал.

Спасибо за проявленный интерес.
5. Дмитрий (deemaa) 07.07.12 21:31
статья хорошая, вот только как быть в случае использования 8.3 с линуксом на клиенте? activeX уже не канает...
6. Сергей Марченко (MarSeN) 08.07.12 00:21
to: deemaa
Да, с Linux явно проблема...
Успокаивает то что в ближайшее время большинство будет работать под виндой, а там глядишь и 1С что-нить придумает )
7. Игорь Юндин (kereo) 09.07.12 09:26
(4) MarSeN, а почему не использовались таблицы 1С?
8. Сергей Марченко (MarSeN) 09.07.12 10:01
to: kereo
Дело в том что для того чтобы организовать пересчет калькулируемых ячеек в MXL нужно серьезно поработать программисту и всегда это будет "фиксировано" алгоритмами. Используя лист экселя настроить калькулируемые колонки может любой пользователь мало-мальски знающий ексель. Далее его можно уже сохранять в шаблон/подгружать в документ, вводить нужные (статические данные) и считывать информацию из листа екселя на форме для постинга/сохранения этих данных в 1С.

Если Вы готовы удовлетворить каждый "чих" пользователя можно использовать MXL. Я за универсальные решения.
Спасибо за вопрос
С уважением
Сергей Марченко
9. г. Казань Рустем Гумеров (Rustig) 09.07.12 14:54
(4), (5), (7) конструкция to: Rustig не работает.
Если бы я не посмотрел новые комментарии, я бы не узнал, что вы ответили мне.
А если бы вы использовали конструкцию (3), мне пришло бы уведомление на эл. ящик.
В моей практике использовал подход в бюджетировании. Сужествовала настройка щаблона (екселя: определение активных областей с привязкой к ним типов 1С) и последующее заполнение в доступные поля информацией с последующим проведением (данные помещались в регистры). Причем настройка была универсальная. Отмечалась область(ти) экселя и им присваивался тип/вид/предопределенное значение и т.п.

Дело в том что для того чтобы организовать пересчет калькулируемых ячеек в MXL нужно серьезно поработать программисту и всегда это будет "фиксировано" алгоритмами. Используя лист экселя настроить калькулируемые колонки может любой пользователь мало-мальски знающий ексель. Далее его можно уже сохранять в шаблон/подгружать в документ, вводить нужные (статические данные) и считывать информацию из листа екселя на форме для постинга/сохранения этих данных в 1С.


А почему для этих целей такие продвинутые пользователи не открывают и не готовят шаблон непосредственно в приложении Эксель? Пока это загадка за семью печатями.
10. Игорь Юндин (kereo) 09.07.12 15:02
(9) Rustig, я так подозреваю, что разгадка кроется вот в этой таинственной фразе
щаблона (екселя: определение активных областей с привязкой к ним типов 1С)


Только вот чтобы это значило? Ссылки на справочники в экселе?
11. Сергей Марченко (MarSeN) 09.07.12 16:07
(9),(10)
Если вы обсуждаете мое решение, о котором я вскользь упомянул в комментариях, то совершенно верно: ячейки екселя в шаблоне "типизировались" (справочник/перечисление/.../Число/Ячейка данных из 1С и т.п), задавались предопределенные значения справочников/перечислений.... прямо в шаблоне ексель. Соответственно на основании этого шаблона создавался документ с уже с частично заполненными данными и ожиданием заполнения оставшихся.

Это долгий рассказ, который правтически не связан с текущей публикацией.

Спасибо
12. Stamper (Stamper) 10.07.12 17:38
вмемориез! автору балловсколькохош
а ведь часто требуют "сделайте мне как в Excel"
13. Сергей Сергеев (SERJ_1CC) 12.07.12 17:39
Интересная вещь, однозначно пригодиться, спасибо за решение...
14. Сергей Марченко (MarSeN) 13.07.12 08:13
(13)
Пожалуйста, SERJ_1CC
формой благодарности может послужить "+" к этой статье )
15. Иван (Sairys) 16.07.12 15:49
Хорошая статья, очень интересная и занимательная, автору спасибо.
16. KV1s (KroVladS) 21.02.13 19:14
Разъясните плиз.
Могу ли я легально использовать OWC, без установленного/купленного MS Office?
17. Александр Гуляев (gavrikprog) 21.02.13 21:13
Помогите, кому скучно... :)
Есть вроде веб компонент для MS Project.
pjgrid11.ocx Отображает сведения о задаче, расписание и диаграмму Ганта.

Но пока что-то не осилил его.
Сам компонент
http://www.microsoft.com/ru-ru/download/details.aspx?id=20488
Дока
http://msdn.microsoft.com/ru-ru/library/ff407962(v=office.14).aspx
18. Сергей Марченко (MarSeN) 21.02.13 21:47
(16) как я понимаю - Да. Но я не юрист )
19. Сергей Болбачан (sergbsv) 04.03.13 03:32
Как добавить возможность открыть и сохранить файл из 1С ?
20. Bul Tum (bubu) 04.03.13 06:33
21. Сергей Марченко (MarSeN) 04.03.13 09:42
(19) Файл должен быть xml. Я точно не помню методы, но на вскидку можно прочитаьь и записать непосредсьвенно XMLData
22. Сергей Марченко (MarSeN) 04.03.13 09:44
(20) конфа на УФ? если да, то какая фирма писала, кто аввтор?
23. Сергей Болбачан (sergbsv) 04.03.13 14:08
конфа самодельная на 100%,
автор я
24. Сергей Болбачан (sergbsv) 04.03.13 14:10
25. Сергей Марченко (MarSeN) 05.03.13 00:02
Кто пояснит, за что раздают мани в этом посте?
26. Сергей Марченко (MarSeN) 05.03.13 11:48
(23) sergbsv, вопрос "конфа на УФ? если да, то какая фирма писала, кто автор?" был адресован bubu(20) )
27. Dima Dima (bayce) 12.05.14 00:09
По-моему отличная вещь.
Если клиенты платят, то почему бы не сделать и Excel на форме.