В затишье между проектами Александр Кунташов подсказал идею создания настраиваемых стопок дел для отображения их пользователю. Идея подсмотрена в Microsoft Dynamics AX 2009.
Была выбрана следующая схема реализации. Разработчик в режиме толстый клиент (управляемое приложение) настраивает стопки дел. Стопки дел представляют собой СКД с минимум двумя элементами на закладке «Настройки». Первый элемент настройки не должен содержать группировок, он используется для вычисления количества попавших элементов в стопку дел. Отсутствие группировок объясняется тем, что для подсчета количества результат СКД выгружается в таблицу значений, поэтому первым элементом должны быть только «детальные записи». Второй и все последующие элементы настройки СКД отображаются пользователю при расшифровке стопки дел (нажатии на стопку) в сформированном табличном документе.
Генерация стопок дел происходил с помощью программного добавления элементов в управляемую форму. Отображение картинки в управляемом приложении заключается в следующем: реквизиту строке соотносится ПолеФормы вида ПолеКартинки. В реквизит строку записывается адрес во временном хранилище, по которому размещена нужная картинка для отображения. Для реализации программного добавления картинки сначала добавляется реквизит строка на форму с помощью метода ИзменитьРеквизиты(). Затем на форму добавляется элемент ПолеВода вида ПолеКартинки.
Процедура ДобавитьСписок(НастройкаСсылка, ИндексСписка) РеквизитыКДобавлению = Новый Массив; РеквизитыКУдалению = Новый Массив; РеквизитыКДобавлению.Добавить(Новый РеквизитФормы("СписокКартинка" + Строка(ИндексСписка), ПолучитьОписаниеТиповСтроки(100))); ИзменитьРеквизиты(РеквизитыКДобавлению,РеквизитыКУдалению); КоличествоЭлементовВСписке = КоличествоЭлементовВСписке(НастройкаСсылка); ЭтаФорма["СписокКартинка" + Строка(ИндексСписка)] = РаботаСИзображением.ПоместитьВодянойЗнакНаКартинку(ПолучитьИмяКартинки(КоличествоЭлементовВСписке),Строка(КоличествоЭлементовВСписке), УникальныйИдентификатор); НоваяКартинка = Элементы.Добавить("СписокКартинка"+ Строка(ИндексСписка),Тип("ПолеФормы")); НоваяКартинка.Вид = ВидПоляФормы.ПолеКартинки; НоваяКартинка.ПутьКДанным = "СписокКартинка"+ Строка(ИндексСписка); НоваяКартинка.Заголовок = НастройкаСсылка.Наименование; НоваяКартинка.Гиперссылка = Истина; НоваяКартинка.УстановитьДействие("Нажатие","ОткрытьСписок"); КонецПроцедуры
Отображение количества дел в стопке в заголовке не сильно было информативным, поэтому пришлось покопать немного дальше в сторону наложения текста на существующую картинку. В этом мне помогла найденная разработка на infostart с использованием ImageMagick. Во время наложения текста на картинку из общих макетов распаковывается сам файл ImageMagick и файлы шрифтов.
Есть правда одно ограничение: не работает ImageMagick с файлом, в пути которого есть символы кириллицы. Из-за этого пришлось отказаться от использования каталога временных файлов и создавать папку «SlideShowTemp» в корне системного диска.
Функция ПоместитьВодянойЗнакНаКартинку(ИмяКартинки, Надпись, УникальныйИдентификатор) Экспорт КВФ = Лев(КаталогВременныхФайлов(), 3) + "SlideShowTemp\"; СоздатьКаталог(КВФ); КаталогКонвертатора = КаталогВременныхФайлов() + "SlideShow\ImageMagick\"; WScript = Новый COMОбъект("WScript.Shell"); ИмяФайлаТекста = КВФ + "txt.txt"; Текст = Новый ТекстовыйДокумент; Текст.УстановитьТекст(Надпись); Текст.Записать(ИмяФайлаТекста, "windows-1251", Символы.ВК); Темп_ИмяФайлаШрифта = КаталогВременныхФайлов() + "SlideShow\Fonts\AGCROWO.TTF"; ИмяФайлаШрифта = КВФ + "font.TTF"; КопироватьФайл(Темп_ИмяФайлаШрифта, ИмяФайлаШрифта); ИмяФайлаСлайда =КВФ + "text." + Строка(БиблиотекаКартинок[ИмяКартинки].Формат()); ИмяФайлаКартинки = КВФ + "img.bmp"; ИмяФайлаНовойКартинки = КВФ + "img." + Строка(БиблиотекаКартинок[ИмяКартинки].Формат()); БиблиотекаКартинок[ИмяКартинки].Записать(ИмяФайлаКартинки); КомандаКонвертацииКартинки = """" + КаталогКонвертатора + "convert.exe"" -background transparent -font """ + ИмяФайлаШрифта + """ -pointsize 18 -page A2 -fill #000000ff text:""" + ИмяФайлаТекста + """ -trim -bordercolor transparent -border 24 """ + ИмяФайлаСлайда + """"; WScript.Run(КомандаКонвертацииКартинки, 0, Истина); ИмяФайлаПодложки = КВФ + "source.png"; КопироватьФайл(ИмяФайлаКартинки, ИмяФайлаПодложки); КомандаКонвертацииКартинки = """" + КаталогКонвертатора + "convert.exe"" """ + ИмяФайлаПодложки + """ -compose over -gravity South """ + ИмяФайлаСлайда + """ -composite -alpha off """ + ИмяФайлаКартинки + """"; WScript.Run(КомандаКонвертацииКартинки, 0, Истина); Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайлаКартинки), УникальныйИдентификатор); КонецФункции
При использовании данного подхода на большом количестве стопок дел имеет смысл кешировать картинки с цифрами в самой базе чтобы не дергать каждый раз ImageMagick на сервере и уменьшить тем самым нагрузку и время создания стопок.
Выгрузку базы данных, демонстрирующая описанное выше, получилась немного великоватой так как в макет загружен файл ImageMagick. Выгрузку можно скачать тут:
Стопки дел (8,0 MiB, 640 скачиваний)
Если у вас возникли какие-то вопросы или предложения по дальнейшему усовершенствованию — пишите, с радостью почитаю.
Похожие записи:
Pingback: Блог программиста 1с » Blog Archive » Стопки дел v 1.0()