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

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
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
Функция РазобратьКодыНеисправностей(СтрокаКодов, ТипКода)
	СпрКодов = СоздатьОбъект("Справочник.КодыГарантийныхНеисправностей");
	ГруппаТ1 = СпрКодов.НайтиПоКоду("0",0);
	ГруппаТ2 = СпрКодов.НайтиПоКоду("00",0);
	ГруппаТ3 = СпрКодов.НайтиПоКоду("000",0);
	Если СтрокаКодов <> "" Тогда
		Разд1 = Найти(СтрокаКодов, ";");
		Разд2 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд1), ";") + Разд1;
		Разд3 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд2), ";") + Разд2;
		Разд4 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд3), ";") + Разд3;
		Разд5 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд4), ";") + Разд4;
		Разд6 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд5), ";") + Разд5;
		Разд7 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд6), ";") + Разд6;
		Разд8 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд7), ";") + Разд7;
		Разд9 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд8), ";") + Разд8;
		Разд10 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд9), ";") + Разд9;
		Разд11 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд10), ";") + Разд10;
		Если ТипКода = "Т1" Тогда
			Если Разд1 > 1 Тогда
				СпрКодов.ИспользоватьРодителя(ГруппаТ1);
				Если СпрКодов.НайтиПоКоду("0/" + Лев(СтрокаКодов,Разд1-1),2)  = 1 Тогда 
					ПолучТ1 = СпрКодов.ТекущийЭлемент();
					Возврат ПолучТ1;
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТипКода = "Т2" Тогда
			Если Разд2-Разд1 > 1 Тогда
				СпрКодов.ИспользоватьРодителя(ГруппаТ2);
				Если СпрКодов.НайтиПоКоду("00/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд1), Разд2 - Разд1 - 1), 2) = 1 Тогда
					ПолучТ2 = СпрКодов.ТекущийЭлемент();
					Возврат ПолучТ2;
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТипКода = "Т3_1" Тогда
			Если Разд3-Разд2 > 1 Тогда
				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд2), Разд3 - Разд2 - 1), 2) = 1 Тогда
					ПолучТ3_1 = СпрКодов.ТекущийЭлемент();
					Возврат ПолучТ3_1;
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТипКода = "Т3_2" Тогда
			Если Разд4-Разд3 > 1 Тогда
				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд3), Разд4 - Разд3 - 1), 2) = 1 Тогда
					ПолучТ3_2 = СпрКодов.ТекущийЭлемент();
					Возврат ПолучТ3_2;
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТипКода = "Т3_3" Тогда
			Если Разд5-Разд4 > 1 Тогда
				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд4), Разд5 - Разд4 - 1), 2) = 1 Тогда
					ПолучТ3_3 = СпрКодов.ТекущийЭлемент();
					Возврат ПолучТ3_3;
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТипКода = "Т3_4" Тогда
			Если Разд6-Разд5 > 1 Тогда
				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд5), Разд6 - Разд5 - 1), 2) = 1 Тогда
					ПолучТ3_4 = СпрКодов.ТекущийЭлемент();
					Возврат ПолучТ3_4; 
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТипКода = "Т3_5" Тогда
			Если Разд7-Разд6 > 1 Тогда
				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд6), Разд7 - Разд6 - 1), 2) = 1 Тогда
					ПолучТ3_5 = СпрКодов.ТекущийЭлемент();
					Возврат ПолучТ3_5;
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТипКода = "Т3_6" Тогда
			Если Разд8-Разд7 > 1 Тогда
				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд7), Разд8 - Разд7 - 1), 2) = 1 Тогда
					ПолучТ3_6 = СпрКодов.ТекущийЭлемент();
					Возврат ПолучТ3_6; 
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТипКода = "Т3_7" Тогда
			Если Разд9-Разд8 > 1 Тогда
				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд8), Разд9 - Разд8 - 1), 2) = 1 Тогда
					ПолучТ3_7 = СпрКодов.ТекущийЭлемент();
					Возврат ПолучТ3_7; 
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТипКода = "Т3_8" Тогда
			Если Разд10-Разд9 > 1 Тогда
				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд9), Разд10 - Разд9 - 1), 2) = 1 Тогда
					ПолучТ3_8 = СпрКодов.ТекущийЭлемент();
					Возврат ПолучТ3_8; 
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТипКода = "Т3_9" Тогда
			Если Разд11-Разд10 > 1 Тогда
				СпрКодов.ИспользоватьРодителя(ГруппаТ3);

ещё один высер от автодилера.
1. начнём сначала, там есть строки:
...
ГруппаТ1 = СпрКодов.НайтиПоКоду("0",0);
..., обращаю внимание автора, что функция НайтиПоКоду не возвращает элемент справочника, она лишь говорит есть он или нет, для позиционирования на элементе не хватает строк типа ГруппаТ1 = СпрКодом.ТекущийЭлемент(); и т.д.
2. дальше. в функцию передаётся параметр СтрокаКодов - это строка с запятыми в качестве разделителей. я конечно понимаю, что в 1С нет встроенной функции для получения массива частей строки типа split в java, но написать свою вообще не сложно, но видимо у автора не хватило мозг..., извините, времени.
3. теперь смотрим на подобные (их несколько в функции) блоки кода типа:
СпрКодов.ИспользоватьРодителя(ГруппаТ1);
Если СпрКодов.НайтиПоКоду("0/" + Лев(СтрокаКодов,Разд1-1),2) = 1 Тогда
ПолучТ1 = СпрКодов.ТекущийЭлемент();
Возврат ПолучТ1;
КонецЕсли;
строка СпрКодов.ИспользоватьРодителя(ГруппаТ1); не имеет смысла, т.к. ГруппаТ1 содержит значение 1 (см. п.1), а не ссылку на элемент справочника, код работает только благодаря второму параметру - 2, т.к. он заставляет функцию НайтиПоКоду искать по всему справочнику, используя полный код.

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

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

  • Всё описание не осилил. Как и весь год. Обращаю внимание автора, что после куска с Т3_1, когда уже смысл и стиль понятен, можно было бы поставить //...и т.д., а не засирать несколько экранов этим поносом. 🙂
    Ответить
  • Инфернальненько. Циклы для недостаточно ленивых!! Как и множественный вызов СтрДлина(СтрокаКодов).
    Обычный вывод: проще переписать с нуля.

    Не так давно я видел генератор штрихкода EAN13 по коду товара. Хотел запостить отдельным, но не буду изменять своей традиции и занесу в комментарий, благо там поржать и не над чем особо. Комментарии мои.
    НК=Строка(Код); // Код товара
    сч=(12-2-СтрДлина(Код));
    НК2=Строка(Константа.ВнутреннийПрефикс); // Префикс кода, не должен совпадать с кодом стран, обычно - [20..29]
    Для j=1 по сч Цикл
    	НК2=НК2+"0";
    КонецЦикла;
    НК2=НК2+НК;
    НК2=СокрЛ(НК2);
    SumЧет=0;
    SumНеЧет=0;
    Для k=1 По 12 Цикл
    	Если (k/2)=Цел(k/2) Тогда
    		SumЧет=SumЧет+3*Число(Сред(НК2,k,1));
    	Иначе
    		SumНеЧет=SumНеЧет+Число(Сред(НК2,k,1));
    	КонецЕсли;
    КонецЦикла;
    Шаг4=SumЧет+SumНеЧет;
    КС=(10-((ШАГ4/10)-Цел(ШАГ4/10))*10);
    Если КС=10 Тогда
    	КС=0;
    КонецЕсли;
    НК2=НК2+Строка(Цел(КС));
    Если Константа.НеДополнятьШтрихКодНулями<>Перечисление.Булево.Да Тогда
    	КонЦ=(ДлинаШтрихКода-СтрДлина(НК2));
    	Для i=1 по КонЦ Цикл
    		НК2="0"+НК2;
    	КонецЦикла;
    КонецЕсли;

    Тем не менее, неведомый автор сделал все офигеннейшие вкусняшки: это и сложение чётной и нечётной компонент в разные переменные, которые всё равно складываются; также изобрёл дополнение нулями кода аж джва раза, строка вычисления дополнения до десяти - вообще шик, её явно писал человек, незнакомый с оператором остатка от деления %. Если я не ошибаюсь, вменяемый программист переписал чисто генераторную часть в шесть строк.
    Надо перестать давать мартышкам бананы, сделать отдел QA, и нещадно трахать без вазелина. Возможно, именно этим можно будет привнести в отрасль немного упорядоченности.
    Второй вариант - сделать независимый QA-центр, где за скромную плату специально обученные люди, которые знают всякие там алгоритмыимеют на плечах не пустое ведро, на правах аутсорсинга смогут подсказать, в какую сторону нужно копать. Бухгалтерию же на аутсорс выносят.
    Ответить
    • На счет аутсорса - поддерживаю, код ниасилил, ох уж этот 1С...
      Ответить
    • мне кажется так пишут либо случайные люди в профессии, либо те, кто начал с 1С и на ней же и остановился
      Ответить
      • Тоже как вариант вполне. Никто из наших не сознаётся, говорят, пришло издревле в какой-то конфигурации. И вот хрен их знает, может быть и так.
        Ответить
  • Это моё первое знакомство с кодом 1С .
    Я теперь понимаю почему крутые 1С кодеры так хорошо оплачиваются.

    Вероятность получения проекта с кучей говнокода стремиться к бесконечности. Да и нормальный редактор, чтобы всё это удобно было рефакторить, наверное, надо еще поискать.

    Труд здесь титанический.
    Ответить
    • ну всё не так уж плохо, редактор неплохой, особенно если использовать поделки сторонних разработчиков, облегчающие жизнь, но тем не менее даже в 8.2 до сих пор нет нормальных контекстных подсказок, таких как в Eclipse например или в VisualStudio, хотя платформа существует уже не первый год.
      Ответить
      • даже создатели смотрят на разработчиков как на говно: мол, ничего тут сложного, школьный бейсик, да еще на русском, обойдетесь.
        Ответить
      • нет нормальных контекстных подсказок
        8.3 же. не скажу, что прям ВАХ, но тоже вполне удобно. по крайней мере перестал лезть в синтаксис-помощник с мыслями "какой, блять, там это параметр по счету"
        Ответить
        • Ну не знаю, по мне так и 8.3 удобствами вообще не блещет. Если сравнить, к примеру, даже с бесплатными вещами такими как Eclipse или Netbeans, в которых возможности того же рефакторинга широчайшие, а удобство работы с кодом высочайшее и учитывая то, что 1С существует уже не одно десятилетие, то лично у меня напрашивается вывод, что в 1С просто забили на удобство рядовых разработчиков, делая минимум того, что должно быть, покупают же и ладно.
          Ответить
          • в 8.3.5 или 8.3.6 добавят инструменты рефакторинга и расширенного умного поиска по объектам метаданных. рекомендую v8.1c.ru/o7 почитать, нас ждут неплохие фишки в новых релизах.
            Ответить
            • Я такие новости уже воспринимаю без оптимизма, потому что уже давно складывается ощущение, что 1С пофигу на нас, её кроме прибыли ничего не интересует. Когда кто-то стремится сделать что-то от души, то это стремление видно из далека, в отношении 1С я пока только наблюдаю стремление стричь бабло, выпуская продукты очень посредственного качества, особенно это касается отраслевых продуктов. Многие скажут "ну есть же сеть франей, которые могут допиливать на местах", да, есть конечно, но франя может именно только допилить, развить продукт в состоянии только разработчик, автор этого продукта, хотя бывают и исключения, но это именно исключения и о них даже говорить не стоит.
              Ответить
              • раз пишете на 1с, знаете, что отраслевка и платформа пишутся разными людьми.
                Ответить
        • Кстати платность платформы, да ещё с такой плачевной производительностью тоже выглядит странновато, но им конечно виднее, процветают же.
          Ответить
          • может потому и процветают? 🙂
            после делфи часто не хватало возможности посмотреть исходники и реализации тех или иных процедур. пишешь что-то и не понять, то ли лыжи не едут, то ли я молодец.
            Ответить
            • Т.к. я работаю не только в 1С, то я не отвык от удобств других языков и IDE и всё что только можно делаю не на 1С, больше всего мне нравится связка javascript/php/java+mysql/pstgresql - очень быстро, надёжно, всё отработано, развивается и абсолютно бесплатно.
              Ответить
              • чего лично вам не хватает в конфигураторе как в ide?
                Ответить
                • Да много чего не хватает, зачем здесь распыляться и перечислять, всё равно это ничего не даст? Проще назвать удобства, но для этого тоже смысла не вижу, т.к. не хочу рекламировать продукт, который мне лично не нравится и пользуюсь им лишь под диктовку рынка.
                  Ответить
      • лололол

        вот и придумали иде, по сравнению с которых даже Eclipse обладает подсказками!
        Ответить
    • > Вероятность получения проекта с кучей говнокода стремиться к бесконечности
      К единице же. Хотя, в военное время и синусы по три-четыре бывают.

      На самом деле, очень част подход, когда к делу изначально приходят непрофессионально. Вот пример. Знакомая контора, изначально босс подходил к процессу написания не с той стороны. Под каждую задачу пилил базу из первой подходящей. В итоге, за каких-то пять-десять лет там образовался форменный зоопарк из ни с чем не совместимых версий.
      Ответить
      • Это смотря какая вероятность... полная вероятность не может быть больше единицы, а по Баесу - любое натуральное число...
        Ответить
        • Я думаю, что применительно к коду вероятность как в случае с динозавром - фифти-фифти.
          Ответить
        • В современном мире стоит таки отталкиваться от аксиоматики Колмогорова
          Ответить
      • >Хотя, в военное время и синусы по три-четыре бывают.

        π/2-2.064i
        Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8