Рассмотренный в данной статье способ является компромиссным, приложение разрабатывается в другой среде, но прекрасно может быть встроено в конфигурацию. Сразу скажу, для меня этой самой задачей была реализация в 1С простенького графического редактора. Итак, начнем.
Сознательно не буду расписывать, что из себя представляет Silverlight, поскольку статья не о нем, точнее не совсем о нем, а о его интеграции в 1С. Достаточно будет сказать, что это что-то вроде Flash, но от Microsoft. А это значит, что мы имеем:
Последний пункт означает, что мы можем встроить Silverlight-приложение в поле HTML-документа. Этим и займемся, но сначала, в качестве примера, создадим простейшее приложение в Silverlight.
Рассказывать буду на примере Visual Studio 2012, разница с прошлыми версиями несущественна. Создаем новый проект (File – New– Project…). В левой части выбираем желаемый язык программирования (для полноценной работы с Silverlight нужен C# или VisualBasic), посередине из списка выбираем Silverlight Application, задаем имя проекта, если нужно – директорию, остальное можно не трогать, нажимаем ОК.
Появится вот такое окошко:
Здесь важно убрать единственную галочку, поскольку приложение у нас полностью локальное и в списке выбрать именно четвертую версию Silverlight, пятая не поддерживается в IE 6.
После создания проекта автоматически откроется окно редактора XAML. Это основное рабочее место по части разметки нашего приложения, если, конечно, не выводить всё программно (а такая возможность есть!). Увы, в рамках этой статьи невозможно будет пробежаться хотя бы по основам, на то есть соответствующие статьи на других ресурсах, моя же задача - отметить то, что необходимо для работы в нашей конфигурации. Поэтому примером будет банальный “Hello world!” с кнопкой.
В левой части экрана есть закладка Toolbox, где располагаются необходимые нам компоненты (в Common Silverlight Controls).
Нам нужны TextBlock и Button. Расположим их произвольно на форме, VisualStudio сама сгенерирует необходимый XAML код. Справа внизу располагается палитра свойств выбранного компонента, где можно, например, задать выравнивание элементов относительно окна (Horizontal/Vertical Alignment), отступы, шрифт для нашего TextBlock и т.д. Нас интересует свойство Name, пусть будет “TextBlock1” (важно задать имя, иначе мы не сможем обратиться к объекту из кода) и Text у компонента TextBlock – его нужно очистить. Затем выберем нашу Button и в палитре свойств перейдем на закладку событий (маленькая кнопка со значком молнии). Мы хотим, чтобы нажатие на кнопку выводило на экран “HelloWorld!”, поэтому создадим событие Click, для чего дважды щелкнем в соответствующей строчке, обработчик события создастся автоматически и Visual Studio перенесет вас в файл “MainPage.xaml.cs” на строчку с обработчиком. Именно в этом файле будет писаться основной код, отвечающий как за обработку информации, так и за её визуализацию, причем в руках разработчика почти всё, что может быть реализовано с помощью XAML. К слову, мы могли бы по нажатию кнопки не просто изменять поле Text у компонента TextBlock, но и динамически создать сам объект, но это другая тема. Итак, добавим в обработчик события простой и прозрачный код:
Запустим приложение (F5), для его открытия будет использоваться браузер, установленный по умолчанию. Убедимся, что все работает правильно. Итак, заготовка у нас есть, можно встраивать, но для начала разберемся, что нам нужно и как работает Silverlight-приложение. Для этого заходим в папку, которую вы указывали при создании проекта, далее проходим “silv-1c-application\Bin\Debug”, где видим 5 файлов:
Нам нужны только 2 – “silv_1c_applicationTestPage.html” и “silv-1c-application.xap”. Первый – это пример, заготовка, создаваемая отладчиком Visual Studio, которая демонстрирует, как Silverlight-приложение встраивается в html-документ. Поскольку мы не собираемся помещать в html поле что-то еще, нам этого файла хватит и в таком виде. Второй – это, собственно, наше приложение, а вернее архив с ним (можете открыть в WinRAR и проверить), в него помещаются все необходимые библиотеки, так что разработчику не приходится волноваться о том, что у кого-то приложение не запустится. Переместите эти файлы в отдельное удобное для вас место.
В нашей конфигурации создадим внешнюю обработку, так удобнее и добавим ей форму. В форме добавим реквизит, например, “ДокументHTML” типа Строка, длина, разумеется, неограниченная. И добавим поле, связанное с этим реквизитом, вид – “Поле HTMLдокумента”. Также нам потребуется два макета, один назовем, например “МакетСтраницы” – тип “Текстовый документ”, второй “XAP” – тип “Двоичные данные”. И сразу скопируем в первый макет текст файла “silv_1c_applicationTestPage.html”, а во второй поместим наш архив “silv-1c-application.xap”. И сразу пробежимся по первому файлу.
После стандартных объявлений html-документа идет код обработчика ошибок Silverlight, написанный на JavaScript – он нас не интересует, во всяком случае, пока. А вот в теле документа имеет смысл пробежаться по параметрам. Их список может расширяться, но рассмотрим только те, которые там уже есть.
Итак:
Разобрались, вернемся к нашей форме и добавим еще реквизиты:
Теперь добавим для формы обработчик события “ПриСозданииНаСервере”, который будет содержать следующий код:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //Получаем HTML-страницу из макета МакетСтраницы = ПолучитьДанныеИзМакета("МакетСтраницы"); СтраницаHTML = МакетСтраницы.ПолучитьТекст(); //сохраняем текст из нее //Получаем xap-файл для Silverlight из макета XAP = ПолучитьДанныеИзМакета("XAP"); КонецПроцедуры &НаСервере Функция ПолучитьДанныеИзМакета(ИмяМакета) Обработка = РеквизитФормыВЗначение("Объект"); Возврат Обработка.ПолучитьМакет(ИмяМакета); КонецФункции
Здесь всё довольно просто и не требует пояснения, мы извлекаем наши данные из макетов и сохраняем в реквизитах. Поскольку приложение будет исполняться на клиенте, нам их надо куда-то сохранить. Создаем обработчик формы “ПриОткрытии”.
&НаКлиенте Процедура ПриОткрытии(Отказ) //Формирование путей к файлам и имен Каталог = Новый Файл(КаталогВременныхФайлов() + "SilverlightApp\"); Если Не Каталог.Существует() Тогда СоздатьКаталог(Каталог.ПолноеИмя); КонецЕсли; ВременныйКаталог = Каталог.ПолноеИмя; //Сохраняем путь в реквизит ИмяФайлаXAP = Каталог.ПолноеИмя + "silv-1c-application.xap"; //путь нашего архива ИмяФайлаСтраница = Каталог.ПолноеИмя + "silv_1c_applicationTestPage.html"; //путь html-страницы //Сохраняем страницу ТекстДокВрем = Новый ТекстовыйДокумент; ТекстДокВрем.УстановитьТекст(СтраницаHTML); ТекстДокВрем.Записать(ИмяФайлаСтраница); //Сохраняем xap-файл XAP.Записать(ИмяФайлаXAP); //Загружаем страницу в наше поле html-документа Элементы.ДокументHTML.Документ.location.href = ИмяФайлаСтраница; КонецПроцедуры
Опять-таки код прозрачен. Стандартной функцией получаем каталог временных файлов, создаем в нем свой подкаталог, добавляем к нему имена двух наших файлов и сохраняем их. Затем остается только указать путь для нашего поля HTML документа. Можно запускать! Если у вас уже установлен пакет Silverlight, то вы увидите ваше приложение в поле, по нажатии на кнопку выводящее “HelloWorld!”. В противном случае вам будет предложено скачать пакет (он небольшой, установка моментальная).
Остался один момент. Поскольку мы создаем временные файлы, их стоит удалять при выходе, чтобы не захламлять систему. В принципе некрасиво, когда программа оставляет что-то после себя без ведома пользователя. Поэтому путь к временному каталогу мы также будем хранить в реквизите, а при закрытии формы проверять, существуют ли он и удалять. Добавим один строковый реквизит "ВременныйКаталог", а в обработчике "ПриЗакрытии" будет следующий код:
&НаКлиенте Процедура ПриЗакрытии() Если ЗначениеЗаполнено(ВременныйКаталог) Тогда Каталог = Новый Файл(ВременныйКаталог); Если Каталог.Существует() Тогда Попытка УдалитьФайлы(Каталог.ПолноеИмя); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецЕсли; КонецЕсли; КонецПроцедуры
Увы, пока это не более чем два разных приложения, одно из которых помещено в другое. Взаимодействия между ними нет. Хотя даже в таком виде наше встроенное приложение смотрится гораздо лучше, чем то, которое было бы написано отдельно. И уже сейчас с помощью широчайших средств .NET и Silverlight можно воплощать практически любые фантазии заказчика, которые выходят за рамки платформы. Однако далее мы усовершенствуем приложение и заставим-таки 1С и Silverlight общаться друг с другом, но это тема отдельной статьи, тем более, что там придется немного повозиться с JavaScript.