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