1. 1C / Говнокод #16365

    −171

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    Процедура ПересчитатьстоимостьПлан()
    	
    	Если 1=1 тогда //ВидКомплектации = Перечисления.ВидыКомплектации.Сборка тогда
    		Для каждого стр из комплектующие Цикл
    			Если стр.ЦенаПлан = 0 тогда // заполнимЦену
    				мНоменклатура = Новый массив;
    				//Для каждого стр из Комплектующие Цикл
    					мНоменклатура.Добавить(стр.Номенклатура);
    				//Конеццикла;
    				Запрос = новый Запрос;
    				Запрос.Текст =  "ВЫБРАТЬ
    				|	ЦеныНоменклатурыСрезПоследних.Номенклатура,
    				|	ЦеныНоменклатурыСрезПоследних.Цена
    				|ИЗ
    				|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&датаД, ) КАК ЦеныНоменклатурыСрезПоследних
    				|ГДЕ
    				|	ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен
    				|	И ЦеныНоменклатурыСрезПоследних.Номенклатура В ИЕРАРХИИ(&Номенклатура)";
    				Запрос.УстановитьПараметр("ДатаД",дата);
    				Запрос.УстановитьПараметр("типЦен",Склад.ТипЦенРозничнойТорговли);
    				Запрос.УстановитьПараметр("ссылка",ссылка);
    				Запрос.УстановитьПараметр("Номенклатура",стр.Номенклатура);
    				аа =Запрос.Выполнить().Выгрузить();
    				Если аа<> неопределено тогда
    					стр.ЦенаПлан = аа[0].цена;
    				КонецЕсли;
    				
    			Конецесли;
    			
    			стр.ЦенаПлан = стр.ЦенаПлан;
    			стр.Суммаплан = стр.Количество*стр.ЦенаПлан;
    		Конеццикла;
    		// *******************************************************888
    		
    	иначе
    		
    		Если СуммаПлан = 0 тогда
    			возврат;
    		КонецЕсли;
    		итСумма = 0;
    		Для каждого стр из Комплектующие Цикл
    			
    			//стр.Суммаплан = глОкруглить(стр.ДоляСтоимости*СуммаПлан,0.5);
    			стр.Суммаплан = Окр(стр.ДоляСтоимости*СуммаПлан,1);
    			
    			Если стр.Количество = 0 тогда
    				стр.ЦенаПлан = 0;
    			иначе
    				стр.ЦенаПлан = стр.Суммаплан/стр.Количество;
    			КонецЕсли;
    			итсумма = итСумма + стр.Суммаплан;
    			
    		КонецЦикла;
    		
    		Если итСумма<>Суммаплан тогда
    			стр.Суммаплан = стр.СуммаПлан - (СуммаПлан-итСумма);
    			Если стр.Количество = 0 тогда
    				стр.ЦенаПлан = 0;
    			иначе
    				стр.ЦенаПлан = стр.Суммаплан/стр.Количество;
    			КонецЕсли;
    			
    		Конецесли;
    	КонецЕсли;
    	
    	
    конецпроцедуры

    Запостил: Cascader, 17 Июля 2014

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

    • черт, аж кровь из ушей пошла...
      Ответить
    • > Запрос.Текст = "ВЫБРАТЬ
      С первого раза показалось 'Запрос.Текст = "ВЫЕБАТЬ'
      Ответить
      • > С первого раза показалось 'Запрос.Текст = "ВЫЕБАТЬ'
        Недоёб, однако у вас... Необходимо срочное лечение женщиной.
        Ответить
    • Это были очень тяжёлые наркотики. Я так и не смог понять, чего там добивается автор.
      А ещё парсер говнокода не поддерживает восьмёрочный синтаксис.
      Ответить
    • Зря смеётесь, "Если 1=1 тогда" - очень важная проверка, в полнолуние 1 бывает не равно 1.
      Ну а так - типичные запросы в цикле; закомменченый код; добавление накой-то хрен номенклатуры в массив итд
      Ответить
      • Тут есть две парадигмы мышления. Обычное, nosql-ное и sql-ное. Плоское императивное и с исчислением кортежей.
        В первом человек пользуется базой данных как, скажем, массивом, или "волшебной" функцией. Тут чаще всего и возникают запросы в цикле.
        Во втором случае человек знает, как эффективнее всего использовать базы данных. Он подготавливает данные, отправляет в базу, пишет чуть более сложный запрос, и получает уже готовые массивы данных.
        Задачу можно решить и так, и так. Только по эффективности второй подход гораздо более лучше.
        Ответить
        • Иногда с циклом выходит проще...
          Ответить
          • разве что если субд бедна на собственные выразительные средства
            Ответить
            • или база состоит из одной таблицы
              Ответить
              • в этом случае одним запросом можно сделать всё, что душенька пожелает
                было бы интересно обсудить, если кто-то придумает обратный пример для одной таблицы
                Ответить
                • дерево, в базе хранится ид потомка, имя потомка и ид родителя, нужно найти все иды потомков одного предка.
                  Ответить
                  • пф, как раз вопрос на выразительные средства субд

                    select t.id
                    from mytree t
                    start with t.id = :some_parent
                    connect by prior t.id = t.parent_id

                    можно даже воспользоваться connect_by_root и прочими няшностями, если надо в одном запросе сразу лес вернуть
                    Ответить
                    • я думал вопрос как раз о бедной на выразительные средства БД(ну или необходимости универсального метода). А так то конечно согласен.
                      Ответить
                • Выдвигаю в качестве кандидатов на обратный пример деревья (id, data, leftid, rightid), списки (id, data, nextid) и JSON (id, name, type, primitivevalue, firstchildid, nextsiblingid).
                  P.S. а, деревья уже выдвинули и опровергли.
                  Ответить
                  • есть ещё интересные запросы вида "а давай напротив каждой строки ещё отобразим данные соседней по некоему критерию - например, разницу от предыдущей" lag
                    Ответить
                  • Вроде кто-то умеет нативно json обрабатывать. Даже не вспомню, кто. Может, постгрес через расширение. Или снова приснилось.
                    Ответить
                    • Свежие постгресы умеют, да. Там даже индексы простенькие можно построить по json'у (по функции от жсона или по наличию в нем определенных ключей).

                      Да и ораклы всякие поди умеют.
                      Ответить
                • Ну, можно конечно придумать пример где фильтрацию нельзя сделать средствами БД. Например в базе хранятся алгоритмы, надо посчитать сколько из них завершается меньше чем за N шагов для заданных входных данных.
                  Ответить
                  • если алгоритм можно декларировать в неких атомарных шагах, а сами шаги выполнить в виде object с методом apply(), то можно и на базе
                    можно и из буханки сделать троллейбус)
                    Ответить
                    • Конечно незачем. Просто если задаться целью, то пример где без цикла не обойтись (или где цикл будет проще одиночного запроса) можно сконструировать.
                      Ответить
      • По меньше сарказма. Просто было изменение кода другим программистом, что бы весь код не перелапачивать для постоянного выполнения данного участка была применена такая конструкция
        Ответить
        • Автор в треде!
          Ответить
          • Я просто объяснил логику программиста. Данный комментарий был ответом на пост doom2good , извини видимо ошибся...
            Ответить
    • Нормальная практика внесения изменений в чужой код - минимум вмешательства
      Ответить

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