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