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

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

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

См. также

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

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

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

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

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

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


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


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

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

Спасибо
12. Stamper (Stamper) 34 10.07.12 17:38 Сейчас в теме
вмемориез! автору балловсколькохош
а ведь часто требуют "сделайте мне как в Excel"
13. Сергей Сергеев (SERJ_1CC) 45 12.07.12 17:39 Сейчас в теме
Интересная вещь, однозначно пригодиться, спасибо за решение...
14. Сергей Марченко (MarSeN) 857 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) 103 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) 857 21.02.13 21:47 Сейчас в теме
(16) как я понимаю - Да. Но я не юрист )
19. Сергей Болбачан (sergbsv) 54 04.03.13 03:32 Сейчас в теме
Как добавить возможность открыть и сохранить файл из 1С ?
20. Bul Tum (bubu) 04.03.13 06:33 Сейчас в теме
21. Сергей Марченко (MarSeN) 857 04.03.13 09:42 Сейчас в теме
(19) Файл должен быть xml. Я точно не помню методы, но на вскидку можно прочитаьь и записать непосредсьвенно XMLData
22. Сергей Марченко (MarSeN) 857 04.03.13 09:44 Сейчас в теме
(20) конфа на УФ? если да, то какая фирма писала, кто аввтор?
23. Сергей Болбачан (sergbsv) 54 04.03.13 14:08 Сейчас в теме
конфа самодельная на 100%,
автор я
24. Сергей Болбачан (sergbsv) 54 04.03.13 14:10 Сейчас в теме
25. Сергей Марченко (MarSeN) 857 05.03.13 00:02 Сейчас в теме
Кто пояснит, за что раздают мани в этом посте?
26. Сергей Марченко (MarSeN) 857 05.03.13 11:48 Сейчас в теме
(23) sergbsv, вопрос "конфа на УФ? если да, то какая фирма писала, кто автор?" был адресован bubu(20) )
27. Dima Dima (bayce) 18 12.05.14 00:09 Сейчас в теме
По-моему отличная вещь.
Если клиенты платят, то почему бы не сделать и Excel на форме.