История: отчет создание, которого описано в Картинка в таблице СКД (управляемое приложение) на примере УТ11, простое решение "в лоб" или легкая модификация стандартного отчета Прайс-Лист понравился заказчику, но чуть позже захотелось большего, а именно: хотелось добавить некоторое количество сворачиваемых группировкой текстовых полей и логотип в заголовке отчета (причем логотип хотелось добавлять по пути файла с диска), чтобы прямо в таком виде можно было отправлять покупателю.
Как говорится "нет ничего невозможного" (с). Приступим:
Сначала модифицируем Основную схему компоновки данных исходного отчета, добавим нужные нам параметры:
Укажем их в качестве пользовательских настроек:
Добавим строковый реквизит отчета АдресЛоготипа для передачи через него адреса хранилища во временном хранилище:
Добавим управляемую ФормуОтчета,
Реквизит АдресЛоготипа не размещаем на форме:
Обратим внимание на то, что элемент формы КомпоновщикНастроекПользовательскиеНастройки, не имеет в своем составе колонок, а они нам нужны, чтобы упростить выбор пользователем файла логотипа. Вызваем контекстное меню КомпоновщикНастроекПользовательскиеНастройки и выбираем Добавить колонки:
Появятся колонки, что значительно упрощает дальнейшие действия с настройкой отчета:
Для элемента формы КомпоновщикНастроекПользовательскиеНастройки зададим действие ПриАктивизацииЯчейки:
и наполним процедуру (которая включит отображение кнопки выбора для настройки "Путь к логотипу"):
&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиПриАктивизацииЯчейки(Элемент)
Если Не Элемент.ТекущиеДанные = Неопределено Тогда
Элементы.КомпоновщикНастроекПользовательскиеНастройкиЗначение.КнопкаВыбора = ?(Элемент.ТекущиеДанные.Настройка = "Путь к логотипу", Истина, Неопределено);
КонецЕсли;
КонецПроцедуры
Для элемента формы КомпоновщикНастроекПользовательскиеНастройкиЗначение зададим действие НачалоВыбора:
и наполним процедуру (которая для настройки "Путь к логотипу", умеет вызывать диалог выбора файла и при успешном выборе загружает его во временное хранилище заполняя ревкизит отчета АдресЛоготипа):
&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Если Элемент.Родитель.Родитель.ТекущиеДанные.Настройка = "Путь к логотипу" Тогда
Настройка = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ПутьКЛоготипу").ИдентификаторПользовательскойНастройки);
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = Настройка.Значение;
Текст = "ru = ""Логотип""; en = ""Logo""";
Фильтр = НСтр(Текст)+"(*.*)|*.*";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл логотипа";
Если ДиалогОткрытияФайла.Выбрать() Тогда
Настройка.Значение = ДиалогОткрытияФайла.ПолноеИмяФайла;
Настройка.Использование = Истина;
Элементы.КомпоновщикНастроекПользовательскиеНастройки.ТекущийЭлемент = Элементы.КомпоновщикНастроекПользовательскиеНастройкиНастройка;
ОбновитьОтображениеДанных();
Элементы.КомпоновщикНастроекПользовательскиеНастройки.ТекущийЭлемент = Элементы.КомпоновщикНастроекПользовательскиеНастройкиЗначение;
Отчет.АдресЛоготипа = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ДиалогОткрытияФайла.ПолноеИмяФайла), Отчет.АдресЛоготипа);
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Теперь наша форма принимает новые параметры, а при выборе файла логотипа даже сохраняет его во внутреннее хранилище, для дальнейшего использования при компоновке отчета.
Дорабатываем процедуру модуля объекта ПриКомпоновкеРезультата, после строки ДокументРезультат.Очистить(); добавим вызов:
ВывестиСамопальныйЗаголовок(ДокументРезультат, КомпоновщикНастроек);
И пишем новую процедуру: ВывестиСамопальныйЗаголовок (процедура читает параметры компоновки и выводит их предварительно сгруппировав, она же выводит логотип):
Процедура ВывестиСамопальныйЗаголовок(ДокументРезультат, КомпоновщикНастроек)
ДокументРезультат.НачатьАвтогруппировкуСтрок();
КоличествоКолонок = ВернутьКоличествоКолонки(КомпоновщикНастроек.Настройки.Выбор.Элементы);
СекцияЗаголовка = ДокументРезультат.ПолучитьОбласть(1, , 1);
ДокументРезультат.Вывести(СекцияЗаголовка, 1, "ГруппаЗаголовка", Истина);
Область = ДокументРезультат.Область(ДокументРезультат.ВысотаТаблицы, 1);
Область.ВысотаСтроки = 5;
ТекстЗаголовка = ВернутьЗначениеПараметраНастройкиСКД(КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы, "Заголовок");
Если ЗначениеЗаполнено(ТекстЗаголовка) Тогда
Область = СекцияЗаголовка.Область("R1C1");
Область.Шрифт = Новый Шрифт(Область.Шрифт, , 13, Истина);
Область.Текст = ТекстЗаголовка;
ДокументРезультат.Вывести(СекцияЗаголовка, 2, "ЭлементЗаголовка", Истина);
КонецЕсли;
Компания = ВернутьЗначениеПараметраНастройкиСКД(КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы, "Компания");
Если ЗначениеЗаполнено(Компания) Тогда
Область = СекцияЗаголовка.Область("R1C1");
Область.Шрифт = Новый Шрифт(Область.Шрифт, , 10, Истина);
Область.Текст = Компания;
ДокументРезультат.Вывести(СекцияЗаголовка, 2, "ЭлементЗаголовка", Истина);
КонецЕсли;
Адрес = ВернутьЗначениеПараметраНастройкиСКД(КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы, "Адрес");
Если ЗначениеЗаполнено(Адрес) Тогда
Область = СекцияЗаголовка.Область("R1C1");
Область.Шрифт = Новый Шрифт(Область.Шрифт, , 9);
Область.Текст = Адрес;
ДокументРезультат.Вывести(СекцияЗаголовка, 2, "ЭлементЗаголовка", Истина);
КонецЕсли;
Телефон = ВернутьЗначениеПараметраНастройкиСКД(КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы, "Телефон");
Если ЗначениеЗаполнено(Телефон) Тогда
Область = СекцияЗаголовка.Область("R1C1");
Область.Шрифт = Новый Шрифт(Область.Шрифт, , 9);
Область.Текст = Телефон;
ДокументРезультат.Вывести(СекцияЗаголовка, 2, "ЭлементЗаголовка", Истина);
КонецЕсли;
НомерКолонкиЛоготипа = ВернутьЗначениеПараметраНастройкиСКД(КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы, "НомерКолонкиЛоготипа", 4);
Если ЗначениеЗаполнено(АдресЛоготипа) Тогда
Область = ДокументРезультат.Область(1, НомерКолонкиЛоготипа, ДокументРезультат.ВысотаТаблицы - 1, НомерКолонкиЛоготипа + 5);
ВывестиЛоготип(ДокументРезультат, АдресЛоготипа, Область);
КонецЕсли;
ДокументРезультат.ЗакончитьАвтогруппировкуСтрок();
КонецПроцедуры
Отметим, что в модуле формы также присутствует процедура ПриОткрытии, которая при наличии строки в настройке ПутьКЛоготипу, поместит соответствующую информацию во временное хранилище, это необходимо учитывать и при автоматическом формировании отчета. Также отметим что если отчет запускается на разных компьютерах под одним и темже пользователем, то при задании абсолютного пути (с указанием диска конкретного компьютера), возможны ошибки чтения логотипа, т.к. в этом случае реальный путь к логотипу может отличатся от сохраненного на другом компьютере.
В результате сформированный отчет может принять такой вид:
Готовый отчет доступен к скачиванию.
ЗЫ: При передаче больших логотипов может наблюдаться замедление вывода отчета.
PS: Существует еще одна модификация данного отчета Прайс лист с картинками для УТ11 (логотип, картинки товаров, свободные текстовые поля в заголовке, отбор по остаткам), правда без подробного описания процесса изменения... но там изменений минимум.