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

    −121

    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
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    Для каждого СтрГотИзд Из ГотовыеИзделия Цикл
    	
    	СсылкаДСЕ 		= ОпределитьДСЕГотовоеИзделиеПоНаименованию(СтрГотИзд.Значение);
    	СсылкаЗаписьРС 	= НайтиПервуюЗаписьРС_ПоДСЕ(СсылкаДСЕ, ЭтотОбъект.НаДату);
    	
    	Если СсылкаЗаписьРС = Неопределено Тогда
    		Предупреждение("На эту дату данных не существует!");
    	Иначе
    		
    		
    		ФормаИндикатора.КомментарийОбработкиДанных  = "Построение отчета: " + СсылкаДСЕ.ВидПредмета + " - " + СсылкаДСЕ.Наименование + ""; 
    		
    		ОбластьДанныеДобавить(ПолеТабДок, ОбластьДанные1, 1, СсылкаДСЕ, СсылкаЗаписьРС.Применяемость, Неопределено, ФормаИндикатора);
    		Выборка2Ур = НайтиЗаписиРС_ПоКодуДСЕГл(СсылкаЗаписьРС.НомерЗаписиРСДСЕВх, НаДату).Выбрать();
    		Пока Выборка2Ур.Следующий() цикл
    			ОбластьДанныеДобавить(ПолеТабДок, ОбластьДанные2, 2, Выборка2Ур.ДСЕВходящий, Выборка2Ур.Применяемость, Выборка2Ур, ФормаИндикатора);
    			
    			Выборка3Ур = НайтиЗаписиРС_ПоКодуДСЕГл(Выборка2Ур.НомерЗаписиРСДСЕВх, НаДату).Выбрать();
    			Пока Выборка3Ур.Следующий() цикл
    				ОбластьДанныеДобавить(ПолеТабДок, ОбластьДанные3, 3, Выборка3Ур.ДСЕВходящий, Выборка3Ур.Применяемость, Выборка3Ур, ФормаИндикатора);
    				
    				Выборка4Ур = НайтиЗаписиРС_ПоКодуДСЕГл(Выборка3Ур.НомерЗаписиРСДСЕВх, НаДату).Выбрать();
    				Пока Выборка4Ур.Следующий() цикл
    					ОбластьДанныеДобавить(ПолеТабДок, ОбластьДанные4, 4, Выборка4Ур.ДСЕВходящий, Выборка4Ур.Применяемость, Выборка4Ур, ФормаИндикатора);
    					
    					Выборка5Ур = НайтиЗаписиРС_ПоКодуДСЕГл(Выборка4Ур.НомерЗаписиРСДСЕВх, НаДату).Выбрать();
    					Пока Выборка5Ур.Следующий() цикл
    						ОбластьДанныеДобавить(ПолеТабДок, ОбластьДанные5, 5, Выборка5Ур.ДСЕВходящий, Выборка5Ур.Применяемость, Выборка5Ур, ФормаИндикатора);
    						
    						Выборка6Ур = НайтиЗаписиРС_ПоКодуДСЕГл(Выборка5Ур.НомерЗаписиРСДСЕВх, НаДату).Выбрать();
    						Пока Выборка6Ур.Следующий() цикл
    							ОбластьДанныеДобавить(ПолеТабДок, ОбластьДанные6, 6, Выборка6Ур.ДСЕВходящий, Выборка6Ур.Применяемость, Выборка6Ур, ФормаИндикатора);
    							
    							Выборка7Ур = НайтиЗаписиРС_ПоКодуДСЕГл(Выборка6Ур.НомерЗаписиРСДСЕВх, НаДату).Выбрать();
    							Пока Выборка7Ур.Следующий() цикл
    								ОбластьДанныеДобавить(ПолеТабДок, ОбластьДанные7, 7, Выборка7Ур.ДСЕВходящий, Выборка7Ур.Применяемость, Выборка7Ур, ФормаИндикатора);
    								
    								Выборка8Ур = НайтиЗаписиРС_ПоКодуДСЕГл(Выборка7Ур.НомерЗаписиРСДСЕВх, НаДату).Выбрать();
    								Пока Выборка8Ур.Следующий() цикл
    									ОбластьДанныеДобавить(ПолеТабДок, ОбластьДанные8, 8, Выборка8Ур.ДСЕВходящий, Выборка8Ур.Применяемость, Выборка8Ур, ФормаИндикатора);
    									
    									Выборка9Ур = НайтиЗаписиРС_ПоКодуДСЕГл(Выборка8Ур.НомерЗаписиРСДСЕВх, НаДату).Выбрать();
    									Пока Выборка9Ур.Следующий() цикл
    										ОбластьДанныеДобавить(ПолеТабДок, ОбластьДанные9, 9, Выборка9Ур.ДСЕВходящий, Выборка9Ур.Применяемость, Выборка9Ур, ФормаИндикатора);
    									КонецЦикла;
    								КонецЦикла;
    							КонецЦикла;
    						КонецЦикла;
    					КонецЦикла;
    				КонецЦикла;
    			КонецЦикла;
    		КонецЦикла;
    	КонецЕсли;
    КонецЦикла;
    
    
    
    Функция НайтиЗаписиРС_ПоКодуДСЕГл(КодДСЕГл, НаДату, ДопустимаяЗамена = 0) Экспорт
    	Запрос = Новый Запрос;
    	Запрос.Текст = 
    	"ВЫБРАТЬ
    	|	СтруктураПриборов1СрезПоследних.ДСЕГлавный,
    	|	СтруктураПриборов1СрезПоследних.ДСЕВходящий КАК ДСЕВходящий,
    	|	СтруктураПриборов1СрезПоследних.Прибор,
    	|	СтруктураПриборов1СрезПоследних.НомерЗаписиРСДСЕВх,
    	|	СтруктураПриборов1СрезПоследних.НомерЗаписиРСДСЕГл,
    	|	СтруктураПриборов1СрезПоследних.ДопустимаяЗамена,
    	|	СтруктураПриборов1СрезПоследних.Применяемость,
    	|	СтруктураПриборов1СрезПоследних.ДСЕВходящий.Ссылка,
    	|	СтруктураПриборов1СрезПоследних.ДСЕВходящий.ВидПредмета КАК ВидПредмета,
    	|	СтруктураПриборов1СрезПоследних.ДСЕВходящий.ВидПредмета.Порядок КАК ДСЕВходящийВидПредметаПорядок,
    	|	СтруктураПриборов1СрезПоследних.ДСЕВходящий.Код КАК Код,
    	|	СтруктураПриборов1СрезПоследних.Заимствованные,
    	|	СтруктураПриборов1СрезПоследних.Период,
    	|	СтруктураПриборов1СрезПоследних.ДатаОкончанияИспользования,
    	|	СтруктураПриборов1СрезПоследних.ВводНового,
    	|	СтруктураПриборов1СрезПоследних.ИзменениеСоставаИзделия
    	|ИЗ
    	|	РегистрСведений.СтруктураПриборов1.СрезПоследних(
    	|		&НаДату,
    	|		НомерЗаписиРСДСЕГл = &КодДСЕГл
    	|		    И (ДатаОкончанияИспользования = &ПустаяДата
    	|		        ИЛИ ДатаОкончанияИспользования > &НаДату)
    	|		    И ДопустимаяЗамена = &ДопустимаяЗамена) КАК СтруктураПриборов1СрезПоследних
    	|
    	|УПОРЯДОЧИТЬ ПО
    	|	ДСЕВходящийВидПредметаПорядок,
    	|	Код";
    	Запрос.УстановитьПараметр("НаДату", 	НаДату);
    	Запрос.УстановитьПараметр("КодДСЕГл", 	КодДСЕГл);
    	Запрос.УстановитьПараметр("ПустаяДата", '00010101');
    	Запрос.УстановитьПараметр("ДопустимаяЗамена", ДопустимаяЗамена);
    	Возврат(Запрос.Выполнить());
    КонецФункции

    Прелесть! Выполняется около минуты. При чем этот код дублируется почти во всех отчетах.
    После оптимизации объем кода сократился в 3 раза, а время выполнения составило 1-2 сек.

    Запостил: Ykov89, 29 Ноября 2012

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

    • Мне одному кажется, что последняя функция красиво выглядит?
      Ответить
      • Красиво, только запрос выполняется 100500 раз в цикле
        Ответить
    • | СтруктураПриборов1СрезПоследних.ДСЕВходя щий.Ссылка,
      | СтруктураПриборов1СрезПоследних.ДСЕВходя щий.ВидПредмета КАК ВидПредмета,
      | СтруктураПриборов1СрезПоследних.ДСЕВходя щий.ВидПредмета.Порядок КАК ДСЕВходящийВидПредметаПорядок,

      О-о-о, паттерн метчинг. Любимая фича восьмёрки.
      Ответить
    • ИЗ корабкается по верёвке к ВЫБРАТЬ, снизу его пытается догнать неповоротливый УПОРЯДОЧИТЬ
      Ответить
    • Не знаю что тут, даже вчитываться не хочу, но выглядит эпично!
      Ответить
    • Я всегда думал, что алиасы у таблиц полезны для выдачи таблице короткого и логичного имени, а не для выкидывания точек из полного.
      Ответить
      • Наличие точки после имени таблицы указывает на то, что она виртуальная. у нее аж скобочки, как у процедуры.
        Алиасы вполне можно использовать как угодно. Убирание точек и огромные названия таблиц - стандартное поведение штатного конструктора запросов. но переименовать никто не мешает при желании.
        дада, я некропостер.
        Ответить

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