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

Публикация № 142204

Программирование - Практика программирования

71
Еще на 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

71

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

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

См. также

Специальные предложения

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

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

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

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

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


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


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

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

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

Если Вы готовы удовлетворить каждый "чих" пользователя можно использовать MXL. Я за универсальные решения.
Спасибо за вопрос
С уважением
Сергей Марченко
12. Stamper 37 10.07.12 17:38 Сейчас в теме
вмемориез! автору балловсколькохош
а ведь часто требуют "сделайте мне как в Excel"
13. SERJ_1CC 48 12.07.12 17:39 Сейчас в теме
Интересная вещь, однозначно пригодиться, спасибо за решение...
14. MarSeN 974 13.07.12 08:13 Сейчас в теме
(13)
Пожалуйста, SERJ_1CC
формой благодарности может послужить "+" к этой статье )
15. Sairys 16.07.12 15:49 Сейчас в теме
Хорошая статья, очень интересная и занимательная, автору спасибо.
16. KroVladS 21.02.13 19:14 Сейчас в теме
Разъясните плиз.
Могу ли я легально использовать OWC, без установленного/купленного MS Office?
18. MarSeN 974 21.02.13 21:47 Сейчас в теме
(16) как я понимаю - Да. Но я не юрист )
17. gavrikprog 108 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
19. sergbsv 61 04.03.13 03:32 Сейчас в теме
Как добавить возможность открыть и сохранить файл из 1С ?
21. MarSeN 974 04.03.13 09:42 Сейчас в теме
(19) Файл должен быть xml. Я точно не помню методы, но на вскидку можно прочитаьь и записать непосредсьвенно XMLData
20. bubu 04.03.13 06:33 Сейчас в теме
прям как в микроинвесте
22. MarSeN 974 04.03.13 09:44 Сейчас в теме
(20) конфа на УФ? если да, то какая фирма писала, кто аввтор?
23. sergbsv 61 04.03.13 14:08 Сейчас в теме
конфа самодельная на 100%,
автор я
26. MarSeN 974 05.03.13 11:48 Сейчас в теме
(23) sergbsv, вопрос "конфа на УФ? если да, то какая фирма писала, кто автор?" был адресован bubu(20) )
24. sergbsv 61 04.03.13 14:10 Сейчас в теме
25. MarSeN 974 05.03.13 00:02 Сейчас в теме
Кто пояснит, за что раздают мани в этом посте?
27. bayce 23 12.05.14 00:09 Сейчас в теме
По-моему отличная вещь.
Если клиенты платят, то почему бы не сделать и Excel на форме.

Оставьте свое сообщение