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

0

  1. 1
  2. 2
  3. 3
Пока ТЗРаспределения.ТаблицаРеализацийИВозвратовНеСвернутая.ТаблицаНоменклатур.ТаблицаРеализацийНеСв.ТаблицаВозвратовНеСв.ПолучитьСтроку()=1 Цикл
     СтрокаВозвратов = СтрокаВозвратов + ТЗРаспределения.ТаблицаРеализацийИВозвратовНеСвернутая.ТаблицаНоменклатур.ТаблицаРеализацийНеСв.ТаблицаВозвратовНеСв.Возврат  	+ ";" ;
КонецЦикла;

Очередной шедевр... Живем в 6(!!!)-мерном мире. У меня чуть мозг не взорвался.

jerokee jerokee, (Updated )

Комментарии (3, +3)

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

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

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

Ykov89 Ykov89, (Updated )

Комментарии (12, +12)

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

0

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

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

Ykov89 Ykov89, (Updated )

Комментарии (2, +2)

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

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
  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 Ykov89, (Updated )

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

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

0

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

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

serpinski serpinski, (Updated )

Комментарии (14, +14)

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

0

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

serpinski serpinski, (Updated )

Комментарии (12, +12)

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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
МояМонада :: МойПарсерТип МойПарсер -> (МойПарсерТип -> МойПарсер МойПарсерТип2) -> МойПарсер МойПарсерТип2

МойСущность МойМонад [] Где
    Возврат МойТип = [МойТип]
    МойВозвратВозврат >>= МойФункция = МойСклейка (МойВсем МойФункция МойВозвратВозврат)

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

serpinski serpinski, (Updated )

Комментарии (27, +27)

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

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
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 Danik, (Updated )

Комментарии (10, +10)

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

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
  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 Danik, (Updated )

Комментарии (40, +40)