Описанный в предыдущем посте метод передачи данных через flashvars имеет ограничение на объем передаваемых данных. Поскольку в данном примере будет рассматриваться формирование диаграммы, то стоит предполагать что входные данные могут значительно превышать это ограничение, а так же отличаться от текстового формата (например, картинки или аудиофайлы). Поэтому имеет смысл формировать массив данных в отдельном файле, а через flashvars передавать только путь к этому файлу. Данные из 1С будем выгружать в XML, поскольку в ActionScript3 есть встроенные методы чтения таких файлов. Так же следует учесть следующие особенности взаимодействия Flash'а с внешними данными: кэширование данных и работу с локальными файлами.
Во-первых, прочитанный один раз в текущем сеансе работы с формой файл данных сколько не заполняй новыми данными, он заново не загрузится. Поэтому необходимо генерировать каждый раз новый файл XML и производить замену пути к нему в html-странице.
Во-вторых, по умолчанию Flash читает данные с сетевых ресурсов. При попытке чтения локального ресурса возникает ошибка безопасности (SecurityError: Error #2148). Поэтому необходимо при компиляции подобных swf-файлов менять их политику безопасности путем изменения параметра компиляции -use-network=false. В IDE FlashDevelop это можно сделать в свойствах проекта.
Код самого flash-проекта я приводить не буду, просто выложу архив.
Теперь перейдем к самой обработке. Основная часть бралась из обработки прошлого поста.
В бинарном макете flash находится скомпилированный swf-файл, в текстовом макете html - шаблон HTML страницы.
Во-первых, прочитанный один раз в текущем сеансе работы с формой файл данных сколько не заполняй новыми данными, он заново не загрузится. Поэтому необходимо генерировать каждый раз новый файл XML и производить замену пути к нему в html-странице.
Во-вторых, по умолчанию Flash читает данные с сетевых ресурсов. При попытке чтения локального ресурса возникает ошибка безопасности (SecurityError: Error #2148). Поэтому необходимо при компиляции подобных swf-файлов менять их политику безопасности путем изменения параметра компиляции -use-network=false. В IDE FlashDevelop это можно сделать в свойствах проекта.
Код самого flash-проекта я приводить не буду, просто выложу архив.
Теперь перейдем к самой обработке. Основная часть бралась из обработки прошлого поста.
В бинарном макете flash находится скомпилированный swf-файл, в текстовом макете html - шаблон HTML страницы.
<HTML>
<HEAD>
</HEAD>
<BODY>
<param name="movie" value="testFlashVars.swf" />
<param name="quality" value="high" />
<embed src="testFlashVars.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="640" height="480"
flashvars="fileXML=data.xml"
>
</embed>
</BODY>
</HTML>
В результате получаем такой XML и диаграмму.&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); ВремХранилище = ПоместитьВоВременноеХранилище(ОбработкаОбъект.ПолучитьМакет("flash"), УникальныйИдентификатор); ХТМЛ_Шаблон = ОбработкаОбъект.ПолучитьМакет("html").ПолучитьТекст(); КонецПроцедуры &НаКлиенте Процедура ПодготовитьHTML() ВремFlash = ПолучитьИмяВременногоФайла("swf"); ФайлFlash = ПолучитьИзВременногоХранилища(ВремХранилище); ФайлFlash.Записать(ВремFlash); ХТМЛ_Шаблон = СтрЗаменить(ХТМЛ_Шаблон, "testFlashVars.swf", ВремFlash); КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) ПодготовитьHTML(); КонецПроцедуры &НаКлиенте Процедура ПриЗакрытии() УдалитьФайлы(ВремFlash); Если НЕ ПустаяСтрока(ВремXML) Тогда УдалитьФайлы(ВремXML); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Диаграмма(Команда) СоздатьДиаграмму(); КонецПроцедуры &НаКлиенте Процедура СоздатьДиаграмму() Если НЕ ПустаяСтрока(ВремXML) Тогда УдалитьФайлы(ВремXML); КонецЕсли; ВремXML = ПолучитьИмяВременногоФайла("xml"); ХТМЛ = СтрЗаменить(ХТМЛ_Шаблон, "data.xml", ВремXML); ФайлXML = Новый ЗаписьXML; ФайлXML.ОткрытьФайл(ВремXML); ФайлXML.ЗаписатьОбъявлениеXML(); ФайлXML.ЗаписатьНачалоЭлемента("data"); Для Каждого Стр Из ТЗ Цикл ФайлXML.ЗаписатьНачалоЭлемента("chart"); ФайлXML.ЗаписатьАтрибут("legend", Строка(Стр.Контрагент)); ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(Стр.Сумма)); ФайлXML.ЗаписатьКонецЭлемента(); КонецЦикла; ФайлXML.ЗаписатьКонецЭлемента(); ФайлXML.Закрыть(); мФайл = Новый ТекстовыйДокумент; мФайл.Прочитать(ВремXML); ХМЛ = мФайл.ПолучитьТекст(); КонецПроцедуры &НаКлиенте Процедура ЗаполнитьСлучайнымиДанными(Команда) ЗаполнитьСлучайноСервер(); СоздатьДиаграмму(); КонецПроцедуры &НаСервере Процедура ЗаполнитьСлучайноСервер() ТЗ.Очистить(); сТЗ = ТЗ.Выгрузить(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100 | Контрагенты.Ссылка |ИЗ | Справочник.Контрагенты КАК Контрагенты"; Результат = Запрос.Выполнить().Выгрузить(); РНД = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата())); КоличествоКонтрагентов = РНД.СлучайноеЧисло(3, 13); Для Сч = 1 По КоличествоКонтрагентов Цикл ТекКонтрагент = РНД.СлучайноеЧисло(, Результат.Количество() - 1); Стр = сТЗ.Добавить(); Стр.Контрагент = Результат[ТекКонтрагент].Ссылка; Стр.Сумма = РНД.СлучайноеЧисло(100, 1000); КонецЦикла; ТЗ.Загрузить(сТЗ); КонецПроцедуры
<?xml version="1.0" encoding="UTF-8"?>
<data>
<chart legend="Вега-транс" value="149"/>
<chart legend="Дальстрой" value="810"/>
<chart legend="МГТС" value="358"/>
<chart legend="НТЦ "Нанотроника"" value="505"/>
<chart legend="ООО "Альфа"" value="373"/>
<chart legend="Саймон и Шустер" value="574"/>
<chart legend="База "Электротовары"" value="662"/>
</data>
При наведение указателя мыши части круговой диаграммы подсвечиваются и отображают легенду.
Так же их можно перетаскивать как угодно.
Комментариев нет:
Отправить комментарий