История рефакторинга одного отчета
В Нетленке столкнулся в отчетом, который в зависимости от условий собирался в трех ветках если. То есть было три варианта текста отчета.
И каждый из них заканчивался запросом с объединением.
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
...
ИЗ
ОстаткиИОборотыСВидомЦен КАК ОстаткиИОборотыСВидомЦен
ЛЕВОЕ СОЕДИНЕНИЕ СписокЦен КАК СписокЦен
ПО ОстаткиИОборотыСВидомЦен.ВидЦен = СписокЦен.ВидЦены
И ОстаткиИОборотыСВидомЦен.Номенклатура = СписокЦен.Номенклатура
И ОстаткиИОборотыСВидомЦен.Категория = СписокЦен.Категория
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
...
ИЗ
РегистрНакопления.ЗаказМатериалов.ОстаткиИОбороты(
&ДатаНачало,
&ДатаКонец,
Регистратор,
ДвиженияИГраницыПериода,
...) КАК ЗаказМатериаловОстаткиИОбороты
УПОРЯДОЧИТЬ ПО
ПодразделениеНаименование,
Материал,
ДатаДокумента
ИТОГИ
СУММА(ВЫБОР КОГДА Регистратор = Неопределено И Период = &ДатаНачало ТОГДА КоличествоНачальныйОстаток ИНАЧЕ 0 КОНЕЦ) КАК КоличествоНачальныйОстаток,
СУММА(ВЫБОР КОГДА Регистратор = Неопределено И Период = &ДатаКонец ТОГДА КоличествоКонечныйОстаток ИНАЧЕ 0 КОНЕЦ) КАК КоличествоКонечныйОстаток,
СУММА(КоличествоПриход),
СУММА(КоличествоРасход),
...
ПО
Подразделение,
Материал
Я предпринял как-то попытку сделать рефакторинг этого отчета, но спекся, не мог понять, в чем разница между ветками. В итоге отложил это дело.
Но как-то понадобилось выводить дополнительные поля и вынужден был заняться этим отчетом вплотную.
Для начала я поместил результат каждого последнего запроса с объединением во временную таблицу ТРЕЗ и убрал итоги во всех трех ветках.
Дальше оказалось проще:
Запрос.Текст = Запрос.Текст + ";" + "ВЫБРАТЬ *, ЗПП.МинЗапас ИЗ ТРЕЗ КАК Т | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗапасыПоПодразделениям КАК ЗПП ПО | ЗПП.Подразделение = Т.Подразделение И | ЗПП.Номенклатура = Т.Номенклатура |УПОРЯДОЧИТЬ ПО | Т.ПодразделениеНаименование, | Т.Материал, | Т.ДатаДокумента "; //Итоги конструктор с полями * не понимает, поэтому отдельно Запрос.Текст = Запрос.Текст + " | |ИТОГИ | СУММА(ВЫБОР КОГДА Т.Регистратор = Неопределено И Т.Период = &ДатаНачало ТОГДА Т.КоличествоНачальныйОстаток ИНАЧЕ 0 КОНЕЦ) КАК КоличествоНачальныйОстаток, | СУММА(ВЫБОР КОГДА Т.Регистратор = Неопределено И Т.Период = &ДатаКонец ТОГДА Т.КоличествоКонечныйОстаток ИНАЧЕ 0 КОНЕЦ) КАК КоличествоКонечныйОстаток, | СУММА(Т.КоличествоПриход), | СУММА(Т.КоличествоРасход), | СУММА(ВЫБОР КОГДА Т.Регистратор = Неопределено И Т.Период = &ДатаНачало ТОГДА Т.СуммаНачальныйОстаток ИНАЧЕ 0 КОНЕЦ) СуммаНачальныйОстаток, | СУММА(ВЫБОР КОГДА Т.Регистратор = Неопределено И Т.Период = &ДатаКонец ТОГДА Т.СуммаКонечныйОстаток ИНАЧЕ 0 КОНЕЦ) СуммаКонечныйОстаток, | СУММА(Т.СуммаПриход), | СУММА(Т.СуммаРасход), | СУММА(ВЫБОР КОГДА Т.Регистратор = Неопределено И Т.Период = &ДатаНачало ТОГДА Т.ЗаказНаНачалоПериода ИНАЧЕ 0 КОНЕЦ) КАК ЗаказНаНачалоПериода, | СУММА(ВЫБОР КОГДА Т.Регистратор = Неопределено И Т.Период = &ДатаКонец ТОГДА Т.ЗаказНаКонецПериода ИНАЧЕ 0 КОНЕЦ) КАК ЗаказНаКонецПериода, | СУММА(Т.Заказано), | Максимум(Т.Номенклатура), | Максимум(ЗПП.МинЗапас), | СУММА(Т.Доставлено) |ПО | Т.Подразделение, | Т.Материал";
Это был первый шаг на упрощение этого отчета. Итоги убрал, останется разобраться уже с плоскими данными и когда-нибудь формировать запрос без скопированных участков. Но уже сейчас получилось добавить нужные поля.
Не пишите никогда копированием-вставкой, уважайте труд тех, кто придет после Вас!
Среда: Нетленка Объем: 1 час.




Свежие комментарии