Разработка отчетов
Форма диалога и макет отчета аналогичны предыдущему отчету. Поэтому новый объект конфигурации формируем копированием объекта, формирующего аналогичный отчет прямым обходом регистров накопления.
В полученном отчете меняем только модуль расчета.
Источником данных при запросе к регистрам накопления являются следующие таблицы:
Для решения используем виртуальную таблицу РН «Закупки»
выбираем поля для отчета (одно из них - вычисляемое)
На закладке «Псевдонимы» назначаем их:
Поскольку запрос ведем к виртуальной таблице, условия-фильтр пишем не на закладке «УСЛОВИЯ», а как параметры виртуальной таблицы:
На закладке «Выходная форма» указываем, что значения параметров будем редактировать в форме(тут же назначаем тип параметров):
Для обеспечсния уникальности каждого товара в отчете на закладке «Группировка» выполняем ее:
На закладке «Итоги» обеспечиваем подведение общих итогов по полям «Количество» и «Сумма»
Наконец, на закладке «Отчет» убираем галочку «Использовать построитель отчета»
Результат:
Задача 2
Ведомость поступления товаров от поставщиков за ___ период
С _____- по ______
Дата |
Товар |
Склад |
Единицы |
Колич. |
цена |
стоимость |
Сумма ндс |
Всего с ндс |
Итого: < > < > < >
Замечание 1. Строки отчета группируются по складам. В конце группы следует включать строку «Итого по складу».
Замечание 2. Поле «Единица» (тип: Справочик.ЕдиницыИзмерения) является реквизитом элемента справочника товаров , а поле «Склад» - реквизит регистратора-документа,Породившего движения в регистрах
Используем Конструктор выходной формы.
а) Формируем поля отчета
б) назначаем псевдонимы полям
в) Поскольку выбрана не виртуальная, а основная таблица — как источник запроса, условия-фильтр на источник формируем на закладке «Условия»:
г) на закладке «ИТОГИ» обеспечиваем промежуточную подсуммировку по складам, а также подведение общих итогов:
д) Наконец, после отказа от использования построителя отчета, Выходим из конструктора.
Получим:
а) Макет
Если хотим улучшить дизайн макета, можно его скорректировать впоследствии вручную
Результат:
Расшифровка ячеек отчетов
1. Расшифровка второго отчета.
Для обеспечения стандартной расшифровки по товару достаточно в модуль расчета добавить строку:
.....................
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
ТабДок.ТолькоПросмотр=Истина;
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ
...................
Расшифровка первого отчета
Расшифровка этого отчета требует формирования конкретизирующего отчета, выводящие все поступления выбранного товара с детализацией по документу, фиксирующему поступление. В качестве конкретизирующего отчета можно взять второй отчет, который детализирует поступление выбранного товара от выбранного поставщика по документам поступления. Для вызова этого отчета по выбору ячейки основного отчета выполним следующие действия:
В событиях Поля табличного документа, куда выводится основной отчет, пишем имя обработчика события «ОбработкаРасшифровки»
Данная Процедура должна вызывать модуль печати конкретизирующего отчета, расположенного во втором отчете
Процедура ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка=ложь;
ТабДок=Новый табличныйДокумент;
Отчет = Отчеты.ВтораяВедомостьПоступленияТоваровОтПоставщиковЗапросомКонструктором.Создать();
ТОвар=Расшифровка;
Отчет.ВтораяВедомостьПоступленияТоваровОтПоставщиковЗапросом(ТабДок, КонПериода, НачПериода,ВыбПоставщик,Товар);
ТабДок.Показать("Ведомость как Расшифровка");
КонецПроцедуры
3) процедуру «ВтораяВедомостьПоступленияТоваровОтПоставщиковЗапросом» удалить из модуля формы второго отчета и поместить в модуль отчета со словом «Экспорт»
Процедура ВтораяВедомостьПоступленияТоваровОтПоставщиковЗапросом(ТабДок, КонПериода, НачПериода,ВыбПоставщик,товар=неопределено) Экспорт
Макет = ПолучитьМакет("ВтораяВедомостьПоступленияТоваровОтПоставщиковЗапросом");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Закупки.Период,
| Закупки.Товар,
| Закупки.Регистратор.Склад КАК Склад,
| Закупки.Количество,
| Закупки.СуммаБезНДС / Закупки.Количество КАК Цена,
| Закупки.СуммаБезНДС КАК СуммаБезНДС,
| Закупки.СуммаНДС КАК СуммаНДС,
| Закупки.СуммаБезНДС + Закупки.СуммаНДС КАК ВСЕГО
|ИЗ
| РегистрНакопления.Закупки КАК Закупки
|ГДЕ
| Закупки.Период МЕЖДУ &НачПериода И &КонПериода
| И Закупки.Поставщик = &ВыбПоставщик ";
Если Товар<>Неопределено Тогда
Запрос.Текст = Запрос.Текст+"
| И Закупки.Товар = &Товар ";
КонецЕСли;
Запрос.Текст = Запрос.Текст+"
|ИТОГИ
| СУММА(СуммаБезНДС),
| СУММА(СуммаНДС),
| СУММА(ВСЕГО)
|ПО
| ОБЩИЕ,
| Склад";
Запрос.УстановитьПараметр("КонПериода", КонПериода);
Запрос.УстановитьПараметр("НачПериода", НачПериода);
Запрос.УстановитьПараметр("ВыбПоставщик", ВыбПоставщик);
Если Товар<>Неопределено Тогда
Запрос.УстановитьПараметр("ТОвар", Товар);
КонецЕСли;
Результат = Запрос.Выполнить();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьОбщийИтог = Макет.ПолучитьОбласть("ОбщиеИтоги");
ОбластьСклад = Макет.ПолучитьОбласть("Склад");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();
ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВыборкаОбщийИтог.Следующий(); // Общий итог
ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());
ВыборкаСклад = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСклад.Следующий() Цикл
ОбластьСклад.Параметры.Заполнить(ВыборкаСклад);
ТабДок.Вывести(ОбластьСклад, ВыборкаСклад.Уровень());
ВыборкаДетали = ВыборкаСклад.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
ТабДок.ТолькоПросмотр=Истина;
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ
КонецПроцедуры
Обратите внимание!!! Заголовок этой процедуры изменился: добавлен еще параметр «ТОвар». Когда данная процедура вызывается из самого второго отчета, параметр «товар» не нужен, т.к. отчет здесь формируется по всем товарам. Но при вызове его из первого отчета товар необходимо указать. Поэтому запрос к источнику данных необходимо немного поправить. (см. отмеченное красным)
Для соответствия между списком формальных и фактических параметров при вызове процедуры ВтораяВедомостьПоступленияТоваровОтПоставщиковЗапросом» из модуля формы второго отчета править не надо
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;
ВтораяВедомостьПоступленияТоваровОтПоставщиковЗапросом(ТабДок, КонПериода, НачПериода,ВыбПоставщик);
Т.к. в случае отсутствия последнего параметра в вызове его значение по умолчанию становится «неопределенно».
Разработка сводной таблицы
товар |
поступило |
|
|
||
Кол |
Сумма |
|
|
|
|
Для разработки сводной таблицы формируем новый объект конфигурации типа «Отчет». Назовем его «СводнаяТаблица».
В форме диалога данного отчета вставим элементы управления «Выбор периода » , «ПолеТабличногоДокумента», а также «ТабличноеПоле»
В
ыбор
периода ПолеТабличногоДокумента1
ТабличноеПоле1
Основу разработки сводной таблицы составляет запрос. Для сводной таблицы с заданными полями необходимо выполнить запрос к основной таблице регистра накопления «Закупки». Получим фрагмент программы расчета:
Запрос = Новый Запрос;
Запрос.Текст = " Выбрать
|Остатки.товар как товар,
|Остатки.ВидОперации как ВидОперации,
|Остатки.СуммаБезНДС как СуммаБезНДС,
|выбор Когда Остатки.ВидОперации=&Приход Тогда СуммаБезНДС Иначе 0 Конец как СуммаПоступило,
|выбор Когда Остатки.ВидОперации=&Приход Тогда Количество Иначе 0 Конец как КолПоступило,
|выбор Когда Остатки.ВидОперации=&Расход Тогда СуммаБезНДС Иначе 0 Конец как СуммаВозвращено,
|выбор Когда Остатки.ВидОперации=&Расход Тогда Количество Иначе 0 Конец как КолВозвращено
| Из РегистрНакопления.Закупки как Остатки
| Где Период<=&Кон и Период>=&Нач
| Итоги Сумма(СуммаПоступило),Сумма(КолПоступило),Сумма(СуммаВозвращено),Сумма(КолВозвращено) ПО товар
|";
Запрос.УстановитьПараметр("Нач", НачалоДня(НачПериода));
Запрос.УстановитьПараметр("Кон", КонецДня( КонПериода));
Запрос.УстановитьПараметр("Приход",Перечисления.ВидыОпераций.Закупка);
Запрос.УстановитьПараметр("Расход",Перечисления.ВидыОпераций.Возврат);
Результат = Запрос.Выполнить() ;
ТабличноеПоле1.Очистить();
ТабличноеПоле1=Результат.Выгрузить();
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
Возврат;
После запуска отчета получим результаты выгрузки в табличное поле результата запроса
Затем возвращаемся в конфигуратор и продолжаем программу, удалив команду «Возврат»
//Возврат;
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента1;
НашаСводТаб=ТабДок.ВстроенныеТаблицы.Добавить(Тип("СводнаяТаблица"));
НашаСводТаб.ИсточникДанных =Результат;
НашаСводТаб.ОтображатьПодписиИтогов=Истина;
НашаСводТаб.Строки.Добавить(НашаСводТаб.Поля.Товар);
НашаСводТаб.Данные.Добавить(НашаСводТаб.Поля.КолПоступило);
НашаСводТаб.Данные.Добавить(НашаСводТаб.Поля.СуммаПоступило);
НашаСводТаб.Данные.Добавить(НашаСводТаб.Поля.КолВозвращено);
НашаСводТаб.Данные.Добавить(НашаСводТаб.Поля.СуммаВозвращено);
НашаСводТаб.ПоложениеИтоговСтрок=ПоложениеИтоговСтрокСводнойТаблицы.Низ;
После запуска отчета получим:
б) тот же отчет формируем с помощью Конструктора выходной формы. Используем основную таблицу «Закупки»
В конструкторе запроса после выбора таблицы-источника и полей получаем
Для успешного формирования сводной таблицы обязательно заходим на закладку “Итоги”. Все поля – координаты, на пересечении которых выводятся числовые поля. В данном отчете задано только одно такое поле “Товар”
На закладке “Отчет” выбираем форму отчета “Сводная таблица”
и нажимаем “ОК”
Результат:
З
амечание.
Содержимое модуля формы, сформированное
конструктором:
Процедура ДействияФормыВедомостьGоступленияNоваровОтПоставщиковСУчетомВозвратовКонструкторомСформировать(Кнопка)
//{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА(ВедомостьGоступленияNоваровОтПоставщиковСУчетомВозвратовКонструктором)
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
СводнаяТаблица = ЭлементыФормы.СводнаяТаблица.ВстроенныеТаблицы[0];
ВедомостьGоступленияNоваровОтПоставщиковСУчетомВозвратовКонструктором(СводнаяТаблица, КонПериода, НачПериода);
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА
КонецПроцедуры
Процедура ВедомостьGоступленияNоваровОтПоставщиковСУчетомВозвратовКонструктором(СводнаяТаблица, КонПериода, НачПериода) Экспорт
//{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ(ВедомостьGоступленияNоваровОтПоставщиковСУчетомВозвратовКонструктором)
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Закупки.Товар КАК Товар,
| СУММА(ВЫБОР
| КОГДА Закупки.Количество > 0
| ТОГДА Закупки.Количество
| ИНАЧЕ 0
| КОНЕЦ) КАК ПоступилоКоличество,
| СУММА(ВЫБОР
| КОГДА Закупки.СуммаБезНДС > 0
| ТОГДА Закупки.СуммаБезНДС + Закупки.СуммаНДС
| ИНАЧЕ 0
| КОНЕЦ) КАК ПоступилоСумма,
| СУММА(ВЫБОР
| КОГДА Закупки.Количество <= 0
| ТОГДА -Закупки.Количество
| ИНАЧЕ 0
| КОНЕЦ) КАК ВозвратКоличество,
| СУММА(ВЫБОР
| КОГДА Закупки.СуммаБезНДС <= 0
| ТОГДА -Закупки.СуммаБезНДС - Закупки.СуммаНДС
| ИНАЧЕ 0
| КОНЕЦ) КАК ВозвратСумма
|ИЗ
| РегистрНакопления.Закупки КАК Закупки
|ГДЕ
| Закупки.Период МЕЖДУ &НачПериода И &КонПериода
|
|СГРУППИРОВАТЬ ПО
| Закупки.Товар
|ИТОГИ
| СУММА(ПоступилоКоличество),
| СУММА(ПоступилоСумма),
| СУММА(ВозвратКоличество),
| СУММА(ВозвратСумма)
|ПО
| Товар";
Запрос.УстановитьПараметр("КонПериода", КонПериода);
Запрос.УстановитьПараметр("НачПериода", НачПериода);
Результат = Запрос.Выполнить();
СводнаяТаблица.РазмещениеИзмеренийВСтроках = ТипРазмещенияИзмерений.Отдельно;
СводнаяТаблица.РазмещениеРеквизитовИзмеренийВСтроках = ТипРазмещенияРеквизитовИзмерений.Отдельно;
СводнаяТаблица.РазмещениеРеквизитовИзмеренийВКолонках = ТипРазмещенияРеквизитовИзмерений.Отдельно;
СводнаяТаблица.ПоложениеИтоговСтрок = ПоложениеИтоговСтрокСводнойТаблицы.Низ;
СводнаяТаблица.МакетОформления = СтандартноеОформление.БезОформления;
СводнаяТаблица.ИсточникДанных = Результат;
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ
КонецПроцедуры
