История рефакторинга одного отчета

В Нетленке столкнулся в отчетом, который в зависимости от условий собирался в трех ветках если. То есть было три варианта текста отчета.

И каждый из них заканчивался запросом с объединением.

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	...
ИЗ
	ОстаткиИОборотыСВидомЦен КАК ОстаткиИОборотыСВидомЦен
		ЛЕВОЕ СОЕДИНЕНИЕ СписокЦен КАК СписокЦен
		ПО ОстаткиИОборотыСВидомЦен.ВидЦен = СписокЦен.ВидЦены
			И ОстаткиИОборотыСВидомЦен.Номенклатура = СписокЦен.Номенклатура
			И ОстаткиИОборотыСВидомЦен.Категория = СписокЦен.Категория

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	...
ИЗ
	РегистрНакопления.ЗаказМатериалов.ОстаткиИОбороты(
			&ДатаНачало,
			&ДатаКонец,
			Регистратор,
			ДвиженияИГраницыПериода,
			...) КАК ЗаказМатериаловОстаткиИОбороты

УПОРЯДОЧИТЬ ПО
	ПодразделениеНаименование,
	Материал,
	ДатаДокумента
ИТОГИ
	СУММА(ВЫБОР КОГДА Регистратор = Неопределено И Период = &ДатаНачало ТОГДА КоличествоНачальныйОстаток  ИНАЧЕ 0 КОНЕЦ) КАК КоличествоНачальныйОстаток,
	СУММА(ВЫБОР КОГДА Регистратор = Неопределено И Период = &ДатаКонец ТОГДА КоличествоКонечныйОстаток  ИНАЧЕ 0 КОНЕЦ) КАК КоличествоКонечныйОстаток,
	СУММА(КоличествоПриход),
	СУММА(КоличествоРасход),
	...
ПО
	Подразделение,
	Материал

Я предпринял как-то попытку сделать рефакторинг этого отчета, но спекся, не мог понять, в чем разница между ветками. В итоге отложил это дело.

Но как-то понадобилось выводить дополнительные поля и вынужден был заняться этим отчетом вплотную.

Для начала я поместил результат каждого последнего запроса с объединением во временную таблицу ТРЕЗ и убрал итоги во всех трех ветках.

Дальше оказалось проще:

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

Это был первый шаг на упрощение этого отчета. Итоги убрал, останется разобраться уже с плоскими данными и когда-нибудь формировать запрос без скопированных участков. Но уже сейчас получилось добавить нужные поля.

Не пишите никогда копированием-вставкой, уважайте труд тех, кто придет после Вас!

Среда: Нетленка Объем: 1 час.

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *