Задача выглядит так: у фирмы несколько складов, с каждого склада происходит отпуск товара покупателям. У каждого отпуска товара указан вид доставки (самовывоз, централизованная доставка, Ж/Д транспорт).
Требуется вывести отчет СКД в виде круговой диаграммы для каждого склада по количеству и видам доставок.
Если в отборах отчета указаны склады или способы доставки, то выводить круговые диаграммы с учетом отборов.
Если отборы не указаны, то выводить диаграммы для всех способов доставки из справочника СпособыДоставки.
Создаем Внешний отчет, создаем макет СКД. В макете СКД создаем набор данных запрос и пишем текст запроса. В запросе сгенерируем вот такую таблицу:
На вкладке Ресурсы в СКД добавим ресурс «КоличествоДоставок». Настроим вывод отчета в виде диаграммы, в качестве точек выберем СпособДоставки, в качестве серий Склады.
На вкладке Другие настройки выберем Тип диаграммы «Круговая», состав подписей «Серия+значсение+процент», размещение легенды «нет», расположение ресурсов в диаграмме «Авто».
Удаляем кнопку Сформировать с формы отчета и добавляем на форму новую кнопку, называем ее ДействиеСформировать, в свойствах кнопки из стандартной коллекции картинок ставим картинку «СформироватьОтчет». В свойстве «Отображение» устанавливаем «Надпись и картинка».
На Действие кнопки пишем код:
Процедура ДействияФормыДействиеСформировать(Кнопка)
ЭлементыФормы.Результат.Очистить();
Рез = Новый ТабличныйДокумент;
текОтбор = КомпоновщикНастроек.Настройки.Отбор.Элементы;
ЕстьОтбор = Ложь;
Для Каждого ЭлементОтбора Из текОтбор Цикл
Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СпособДоставки") И ЭлементОтбора.Использование Тогда
ЕстьОтбор = истина;
КонецЕсли;
КонецЦикла;
Если НЕ ЕстьОтбор Тогда
нЭлемент = текОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
нЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СпособДоставки");
//берем все способы доставки из справочника и для каждого выводим круговую диаграмму
Запрос = Новый запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка
|ИЗ Справочник.СпособыДоставки ";
Выборка = Запрос.Выполнить().Выбрать();
Пока выборка.Следующий() Цикл
нЭлемент.ПравоеЗначение = выборка.Ссылка;
ОтчетОбъект.СкомпоноватьРезультат(Рез, ДанныеРасшифровки);
Рез.Рисунки[0].Ширина = ЭлементыФормы.Результат.ШиринаСтраницы;
ЭлементыФормы.Результат.Вывести(Рез);
Рез.Очистить();
КонецЦикла;
текОтбор.Очистить();
Иначе
ОтчетОбъект.СкомпоноватьРезультат(Рез, ДанныеРасшифровки);
Рез.Рисунки[0].Ширина = ЭлементыФормы.Результат.ШиринаСтраницы;
ЭлементыФормы.Результат.Вывести(Рез);
КонецЕсли;
КонецПроцедуры