Бухгалтерия / Говнокод #28173 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
Функция ПолучитьСеб (Номенклатура,ДатаОстатков) Экспорт
		
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	УчетПартийОстатки.Номенклатура,
		|	УчетПартийОстатки.Партия КАК Партия,
		|	УчетПартийОстатки.СуммаБезНДСОстаток / УчетПартийОстатки.КоличествоОстаток КАК бухСС
		|ИЗ
		|	РегистрНакопления.УчетПартий.Остатки(&ДатаОстатков, Номенклатура В (&Номенклатура)) КАК УчетПартийОстатки
		|		ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииНоменклатуры.Остатки(&ДатаОстатков, Номенклатура В (&Номенклатура)) КАК ПартииНоменклатурыОстатки
		|		ПО УчетПартийОстатки.Характеристика = ПартииНоменклатурыОстатки.Характеристика
		|			И УчетПартийОстатки.МестоХранения = ПартииНоменклатурыОстатки.МестоХранения
		|			И УчетПартийОстатки.Статус = ПартииНоменклатурыОстатки.Статус
		|			И УчетПартийОстатки.Номенклатура = ПартииНоменклатурыОстатки.Номенклатура
		|			И УчетПартийОстатки.Партия = ПартииНоменклатурыОстатки.Партия
		|ГДЕ
		|	УчетПартийОстатки.КоличествоОстаток > 0
		|
		|УПОРЯДОЧИТЬ ПО
		|	Партия";
		
		Запрос.УстановитьПараметр("ДатаОстатков", ДатаОстатков);
		Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
		
		РезультатЗапроса = Запрос.Выполнить();
		
		ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
		
		Если ВыборкаДетальныеЗаписи.Следующий() Тогда
			Возврат ВыборкаДетальныеЗаписи.бухсс;
		КонецЕсли;
		
	КонецФункции

Нашёл сие поделие в базе одного клиента, придраться хочется ко всему, начиная с лютого нэйминга - имя функции ПолучитьСеб(), не намного лучше чем Функция1(), имя переменной в запросе бухСС тоже так себе.
Задача функции вернуть себестоимость единицы товара, при этом число она возвращает только если в запросе что-то есть, понятно что в остальных случаях вернет Неопределено, но себестоимость это всегда число, никаких Неопределено быть не должно.
Если посмотреть текст запроса, то видно, что поля выборки на 100% беруться из одной таблицы, зачем там ещё одну прилепили, да ещё и с полным соединением - теряюсь в догадках.
Упорядочивание по полю Партия вообще смысла не имеет, если уж речь идёт о получении себестоимости, то скорей автор хотел получить её из первой партии, что косвенно подвтерждается выражением "ПЕРВЫЕ 1", но дело в том, что упорядочивание по ссылке (Партия - это элемент справочника Партии) не имеет никакой привязки к дате, т.е. нужно было писать так: "Упорядочить По Партия.ДатаПартии".
Здесь не видно, но функция вызывается только в двух местах модуля и всегда с конкретным значением номенклатуры, т.е. условие виртуальной таблицы может быть оптимизировано до "Номенклатура = &Номенклатура".
Ну и на последок - в данном случае полное соединение конечно нужно ликвидировать, но если бы оно действительно было нужно, то виртуальные таблицы не стоит связывать между собой, предварительно их нужно помещать во временные таблицы и индексировать по полям условий соединения.

Запостил: VladC VladC, (Updated )

Комментарии (1) RSS

  • Синхронизация этого говна в дискорде временно отключена.
    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8