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

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
Процедура ОбработкаПроведения(Отказ, РежимПроведения)	
	
	///////////////////////////////////////////////////////
	// Подготовка табличной части документа
	
	тчТовары = Товары.Выгрузить();

	Отказ = ОбщийМодуль.СформироватьТабличнуюЧастьСОстаткамиНаСкладе(тчТовары, Ссылка, РежимПроведения, Расшифровка, ВыявлятьНехваткуТоваров);

	Для Каждого СтрокаТЧТовары Из тчТовары Цикл
		Если ЗначениеЗаполнено(СтрокаТЧТовары.НовыйАдресХранения) И ЗначениеЗаполнено(СтрокаТЧТовары.АдресХраненияАВТО) Тогда
		// тут добавляются движения
....
КонецПроцедуры


Функция СформироватьТабличнуюЧастьСОстаткамиНаСкладе(ТабличнаяЧасть, ДокументСсылка, РежимПроведения, Расшифровка, ВыявлятьНехваткуТоваров=Истина) Экспорт
	
	Отказ = Ложь;
	
	Запрос = Новый Запрос;
	МВТ = Новый МенеджерВременныхТаблиц;
	Запрос.МенеджерВременныхТаблиц = МВТ;
	
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ТЧДокумента.ОбъектНоменклатуры КАК ОбъектНоменклатуры,
	|	ТЧДокумента.АдресХранения КАК АдресХранения,
	|	ТЧДокумента.НовыйАдресХранения КАК НовыйАдресХранения,
	|	ТЧДокумента.Количество КАК Количество,
	|	ТЧДокумента.КоличествоУУ КАК КоличествоУУ
	|ПОМЕСТИТЬ ТЧДокумента
	|ИЗ
	|	&ТЧ КАК ТЧДокумента";
	Запрос.УстановитьПараметр("ТЧ", ТабличнаяЧасть);
	Запрос.Выполнить();
	
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ТЧДокумента.ОбъектНоменклатуры КАК ОбъектНоменклатуры,
	|	ТЧДокумента.ОбъектНоменклатуры.Номенклатура КАК Номенклатура,
	|	ТЧДокумента.ОбъектНоменклатуры.Нарезка.Размер КАК РазмерНарезки,
	|	ТЧДокумента.АдресХранения КАК АдресХранения,
	|	ТЧДокумента.НовыйАдресХранения КАК НовыйАдресХранения,
	|	ЯССМ_ТоварыНаСкладахПоЯчейкамОстатки.АдресХранения КАК АдресХраненияАВТО,
	|	ЕСТЬNULL(ТЧДокумента.Количество, 0) КАК КоличествоТребуется,
	|	ЕСТЬNULL(ЯССМ_ТоварыНаСкладахПоЯчейкамОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
	|	ЕСТЬNULL(ТЧДокумента.КоличествоУУ, 0) КАК КоличествоУУТребуется,
	|	ЕСТЬNULL(ЯССМ_ТоварыНаСкладахПоЯчейкамОстатки.КоличествоУУОстаток, 0) КАК КоличествоУУОстаток,
	|	ЯССМ_ТоварыНаСкладахПоЯчейкамОстатки.Склад КАК Склад
	|ИЗ
	|	ТЧДокумента КАК ТЧДокумента
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЯССМ_ТоварыНаСкладахПоЯчейкам.Остатки(&МоментДокумента, ) КАК ЯССМ_ТоварыНаСкладахПоЯчейкамОстатки
	|		ПО ТЧДокумента.ОбъектНоменклатуры = ЯССМ_ТоварыНаСкладахПоЯчейкамОстатки.ОбъектНоменклатуры
	|ГДЕ
	|	ТЧДокумента.АдресХранения = ЗНАЧЕНИЕ(Справочник.ЯС_АдресаХранения.ПустаяСсылка)
	|";
	
	ТабличнаяЧасть.Очистить();
	
	Запрос.УстановитьПараметр("МоментДокумента", ДокументСсылка.МоментВремени());
	
	// !!!!! делаю это для автоматического получения колонок результирующего запроса. Это крэзи конечно, но пока оставлю так. Нет времени
	ТабличнаяЧасть = Запрос.Выполнить().Выгрузить();
	ТабличнаяЧасть.Очистить();
	 
	ВыборкаОбъект = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	Пока ВыборкаОбъект.Следующий() Цикл
		
		ВыборкаАдресХранения = ВыборкаОбъект.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
		
		Пока ВыборкаАдресХранения.Следующий() Цикл
			Если ВыявлятьНехваткуТоваров И ВыборкаАдресХранения.КоличествоТребуется>ВыборкаАдресХранения.КоличествоОстаток Тогда
				Расшифровка = Расшифровка + Символы.ПС + "Недостаточно товара (код номенкл.: "+ВыборкаАдресХранения.Номенклатура.Код+") """+ВыборкаАдресХранения.ОбъектНоменклатуры + """" +
											?(ЗначениеЗаполнено(ВыборкаАдресХранения.АдресХранения), " по адресу хранения """+ВыборкаАдресХранения.АдресХранения+"""", "")+"! "+
											"Остаток товара "+ВыборкаАдресХранения.КоличествоОстаток+", а требуется "+ВыборкаАдресХранения.КоличествоТребуется+".";
				Отказ = Истина;
			Иначе
				ВыборкаАдресХраненияАвто = ВыборкаАдресХранения.Выбрать();
				Пока ВыборкаАдресХраненияАвто.Следующий() Цикл
					
					Если ВыборкаАдресХраненияАвто.Количество()>1 Тогда
						Расшифровка = Расшифровка + Символы.ПС + "Для товара (код номенкл.: "+ВыборкаАдресХранения.Номенклатура.Код+") """+ВыборкаАдресХранения.ОбъектНоменклатуры + """" +
													" невозможно определить адрес хранения, т.к. остатки товаров расположены "+ Символы.ПС
													+ "  более чем в одном адресе хранения. Необходимо в документе явно указать адрес хранения товара!";
						Отказ = Истина;
					Иначе
						// добавляем строку в результирующую таблицу
						НоваяСтрока = ТабличнаяЧасть.Добавить();
						ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаАдресХраненияАвто);
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
		КонецЦикла; 
	КонецЦикла;
	
	Возврат Отказ;

КонецФункции //СформироватьТабличнуюЧастьСОстаткамиНаСкладе

Обработка проведения одного писателя...
Сначала берём выгружаем в ТЗ табличную часть, потом отдаём в общий модуль, там ТЗ передаём параметром в запрос, кладём в ВТ потом в другом запросе соединяем с остатками, меняем имена и состав колонок, выгружаем в ТЗ, возвращаем ТЗ в обработку проведения и уже по ней делаем движения.
Вообще, эта задача решается одним запросом. Но зачем?! Ведь если общий модуль существует, должен же кто-то его испрользовать...

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

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

    • Погуглил, оказывается, что реальный! Как они вообще пишут на этом?
      АдресХраненияАВТО, <Enter><Tab><Alt+Shift>|<Tab><Alt+Shift> ЕСТЬ<Alt+Shift>NULL(<Alt+Shift>ТЧДокумен та.Количество
      Ответить
      • Тащемта большие запросы создаются в конструкторе, поэтому их "пишут мышкой". А если ЕСТЬNULL нужно дописать руками, я обычно пишу isNull(поле, значение). Потом, открыв запрос в конструкторе, он автоматически переведет isNULL в ЕСТЬNULL
        Ответить
        • лучше бы он за ЕСТЬNULL бил бы током и переводил в isNull
          Ответить

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

Помни, guest, за тобой могут следить!

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


    8