9 авг. 2013 г.

Загрузка XML во Flash-диаграмму

Описанный в предыдущем посте метод передачи данных через flashvars имеет ограничение на объем передаваемых данных. Поскольку в данном примере будет рассматриваться формирование диаграммы, то стоит предполагать что входные данные могут значительно превышать это ограничение, а так же отличаться от текстового формата (например, картинки или аудиофайлы). Поэтому имеет смысл формировать массив данных в отдельном файле, а через flashvars передавать только путь к этому файлу. Данные из 1С будем выгружать в XML, поскольку в ActionScript3 есть встроенные методы чтения таких файлов. Так же следует учесть следующие особенности взаимодействия Flash'а с внешними данными: кэширование данных и работу с локальными файлами.

Во-первых, прочитанный один раз в текущем сеансе работы с формой файл данных сколько не заполняй новыми данными, он заново не загрузится. Поэтому необходимо генерировать каждый раз новый файл 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 и диаграмму.

<?xml version="1.0" encoding="UTF-8"?>
<data>
<chart legend="Вега-транс" value="149"/>
<chart legend="Дальстрой" value="810"/>
<chart legend="МГТС" value="358"/>
<chart legend="НТЦ &quot;Нанотроника&quot;" value="505"/>
<chart legend="ООО &quot;Альфа&quot;" value="373"/>
<chart legend="Саймон и Шустер" value="574"/>
<chart legend="База &quot;Электротовары&quot;" value="662"/>
</data>


При наведение указателя мыши части круговой диаграммы подсвечиваются и отображают легенду.


Так же их можно перетаскивать как угодно.


Комментариев нет:

Отправить комментарий