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

    −122

    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
    Пока Выборка1...
    ...Выборка2...
    ...
    Выборка7 = ПрименяемостьНаПрибор_ПоискВхождений(Выборка6.НомерЗаписиРСДСЕГл, НаДату).Выбрать();
    Пока Выборка7.Следующий() Цикл
    	ПрименяемостьПоВхождению = ПрименяемостьПоВхождению * Выборка7.Применяемость;
    	
    	
    	Если Выборка7.НомерЗаписиРСДСЕГл = 0 Тогда
    		// Достигнут прибор
    		Применяемость = Применяемость + ПрименяемостьПоВхождению;
    	Иначе
    		Выборка8 = ПрименяемостьНаПрибор_ПоискВхождений(Выборка7.НомерЗаписиРСДСЕГл, НаДату).Выбрать();
    		Пока Выборка8.Следующий() Цикл
    			ПрименяемостьПоВхождению = ПрименяемостьПоВхождению * Выборка8.Применяемость;
    			
    			Если Выборка8.НомерЗаписиРСДСЕГл = 0 Тогда
    				// Достигнут прибор
    				Применяемость = Применяемость + ПрименяемостьПоВхождению;
    				
    			Иначе
    				Сообщить("Превышение значения выборки... Странная ситуация, вообще не должна возникать!!!");																			
    				Сообщить("Срочно обратитесь в Отдел ВТ. Постарайтесь записать ситуацию в которой возникла эта ошибка... !!!");																			
    			КонецЕсли;
    		КонецЦикла;
    	КонецЕсли;
    КонецЦикла;
    ...
    ...

    По мотивам предыдущих постов. Все из одной конфигурации.

    Ykov89, 29 Ноября 2012

    Комментарии (12)
  2. 1C / Говнокод #12219

    −125

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    Если СтрНВрОбщ.Действия = Перечисления.Действия.Удалить Тогда
    	// Такого быть не должно... 
    	Сообщить("Это сообщение не должно появиться... Обратитесь в отдел ИТ! ");
    ИначеЕсли СтрНВрОбщ.Действия = Перечисления.Действия.Добавить Тогда
    	//Тру-ля-ля... другой говнокод
    КонецЕсли;

    При чем такого действительно "быть не должно", т.к. проверка есть и в другом модуле.

    Ykov89, 29 Ноября 2012

    Комментарии (2)
  3. 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)
  4. 1C / Говнокод #12217

    −122

    1. 1
    2. 2
    3. 3
    4. 4
    Результат = Запрос.Выполнить().Выбрать();
    Пока Результат.Следующий() > 0 Цикл
           // что-то делаем
    КонецЦикла;

    Argonavt, 29 Ноября 2012

    Комментарии (3)
  5. 1C / Говнокод #12149

    −119

    1. 1
    2. 2
    3. 3
    1С::Функторы::АппликативныйФунктор::Монад 1С::Монада::НаЭкран -> 1С::Монада::Символ,1С::Монада::СимволСлед
    | Пустота = Отчёт.Откат()
    | 1С::Буква = 1С::МонадаМир::ВводВывод::Печать 1С::Буква

    Многие интересуются, существует ли в 1С метод вывода монады на экран? Оказывается, существует!
    Данный аппликативный функтор не требует теор.ката, хотя и не без улыбки, выводит квантовое состояние функциональной монады в виде стрелок и морфизмов.
    PS Автор не я, а мой коллега, который, ковыряясь в 1С, обнаружил в нём "Функциональный режим"

    serpinski, 18 Ноября 2012

    Комментарии (14)
  6. 1C / Говнокод #12146

    −117

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    Часто проскальзывают темы, что 1С часто отказывает в монадах.
    Я вот этого вообще не понимаю, как такое может выглядеть???
    Я со своей восьмёрочкой 2 года, в любой момент, когда я захочу монад, он будет.
    Если он скажет, нет, я не хочу, я показываю ему С++, показываю что я недоволен и говорю, почему ты не хочешь монаду?
    Ты любишь кресты? Когда монады встречаются в 1С, они должны преобразовываться по первому же желанию программиста.

    serpinski, 17 Ноября 2012

    Комментарии (12)
  7. 1C / Говнокод #12144

    −125

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    МояМонада :: МойПарсерТип МойПарсер -> (МойПарсерТип -> МойПарсер МойПарсерТип2) -> МойПарсер МойПарсерТип2
    
    МойСущность МойМонад [] Где
        Возврат МойТип = [МойТип]
        МойВозвратВозврат >>= МойФункция = МойСклейка (МойВсем МойФункция МойВозвратВозврат)

    Коллега выдал - закоммитил в локальный гитхаб 1С парсер хаскелля на 1С.

    serpinski, 17 Ноября 2012

    Комментарии (27)
  8. 1C / Говнокод #12112

    −124

    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
    Function	 ms2Str(Миллисекунды) export
    	КолВоЧасов=Цел(Миллисекунды/(60*60*1000));
    	Остаток=Миллисекунды-КолВоЧасов*60*60*1000;
    	КолВоМинут=Цел(Остаток/(60*1000));
    	Остаток=Остаток-КолВоМинут*60*1000;
    	КолВоСекунд=Цел(Остаток/1000);
    	КолВоМиллисекунд=Остаток-КолВоСекунд*1000;
    	h=Формат(КолВоЧасов,"ЧЦ=3;ЧН=;ЧВН=")+":";
    	if КолВоЧасов=0 then
    		 h="";
     endif;	 
       m=Формат(КолВоМинут,"ЧЦ=2;ЧН=;ЧВН=")+":";	 
     if КолВоМинут=0 then
    	  m="";
    	endif;  
    	return h+m+Формат(КолВоСекунд,"ЧЦ=2;ЧН=;ЧВН=")+":"+Формат(КолВоМиллисекунд,"ЧЦ=3;ЧН=;ЧВН=");
    endFunction

    Перевод время в миллисекундах в строку. Автор: Жуков А.П.

    Danik, 13 Ноября 2012

    Комментарии (10)
  9. 1C / Говнокод #12110

    −125

    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
    procedure setParameters(aq)
     спДекрет= Новый СписокЗначений;
     спДекрет.Добавить(Перечисления.СостоянияРаботникаОрганизации.ОтпускПоБеременностиИРодам);
     спДекрет.Добавить(Перечисления.СостоянияРаботникаОрганизации.ОтпускПоУходуЗаРебенком);
    	
    	
    	aq.setParameter("Дат",КонецДня(НачПериода));
    	aq.setParameter("Уволен",Перечисления.ПричиныИзмененияСостояния.Увольнение);
    	aq.setParameter("Оклад",Перечисления.СпособыРасчетов.Оклад);
    	aq.setParameter("МРП",Перечисления.СпособыРасчетов.КолМРП);
    	aq.setParameter("Сумма",Перечисления.СпособыРасчетов.Сумма);
    	aq.setParameter("Оклад",Перечисления.СпособыРасчетов.ПроцентОтОклада);
    	aq.setParameter("Доход",Перечисления.СпособыРасчетов.ПроцентОтДоходов);
    	aq.setParameter("ПодразделениеОрганизации",ПодразделениеОрганизации);
    	aq.setParameter("ФизЛицо",Работник);
    	aq.setParameter("Должность",Должность);
    	aq.setParameter("ВидЗанятости",ВидЗанятости);
    	aq.setParameter("ТарифныйРазряд",ТРазряд);
    	
    	aq.setParameter("ВРЭкология",ВРЭкология);
    	
    	//Декретники
    	aq.setParameter("Декрет",спДекрет);
    	//Состояние общее
    	aq.setParameter("Состояние",Состояние);
    	aq.setParameter("Сост",Состояние1);
    endprocedure
    
    procedure setБабло(Тз)
    	Тз.Колонки.Добавить("id",new ОписаниеТипов("Строка"));
    	Тз.Колонки.Добавить("Размер",new ОписаниеТипов("Число"));
    endProcedure
    
    ...
    	q=new Query;
    	q.Текст="                                            //--------------------------------------------бабло
    |Select  
    |	ПлановыеНачисленияРаботниковОрганизацийСрезПоследнихКон.Размер,
    |	ПлановыеНачисленияРаботниковОрганизацийСрезПоследнихКон.ФизЛицо.код id
    |from
    |	РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(
    |			&Дат,
    |			ВидРасчета.ЯвляетсяОсновнымНачислением
    |				И Размер <> 0) КАК ПлановыеНачисленияРаботниковОрганизацийСрезПоследнихКон
    |";
    	
    	setParameters(q);
    	бабло=New ТаблицаЗначений;
    	setБабло(бабло);
    	rs=q.Выполнить().Выбрать();
    	while rs.next() do
    			s=бабло.Добавить();
       s.id=rs.id;
       s.Размер=rs.Размер;
    enddo;
     бабло.Индексы.Добавить("id"); 
    ...

    Форматирование текста оставил как есть. Автор: Жуков А.П.

    Danik, 13 Ноября 2012

    Комментарии (40)
  10. 1C / Говнокод #12076

    −123

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    Запрос = Новый Запрос;
     Запрос.Текст = "какой-то там текст запроса с параметрами <Вариант> и <НеВариант>"
     
     Запрос.УстановитьПараметр("Вариант", ?(Вариант = Истина, Истина, Ложь));
     Запрос.УстановитьПараметр("НеВариант", ?(Вариант = Истина, Ложь, Истина));

    Упрощается все до ...("Вариант", Вариант) и ...("НеВариант", Не Вариант) (хотя два параметра, зависящие от одной переменной уже не ок)

    Теперь по офису на вопрос: "А можно ли упростить?" сразу летит в ответ сакральное "НЕ ВАРИАНТ!!!"

    nixel, 08 Ноября 2012

    Комментарии (7)