Friday, February 10, 2012

1с подбор номенклатуры в случайном порядке

Возникла задача подобрать из остатков товар в случайном порядке и случайном количестве. Задача реализована на 1с 8.2 для конфигурации "Бухгалтерия Для Украины". Для это создаем внешнею обработку, и вставляем эту процедуру, далее обработку вставляем в справочник дополнительных обработок.
#Если Клиент тогда
	Процедура Инициализировать(ЗнОбъект, ИмяТабличнойЧасти, ТабличноеПоле) Экспорт;
		СуммаПодбора = ЗнОбъект[ИмяТабличнойЧасти].Итог("Сумма");
		
		Если не ВвестиЧисло(СуммаПодбора, "Введите необходимую сумму",10,2) тогда
			возврат;
		КонецЕсли;
		
		ЗнОбъект[ИмяТабличнойЧасти].Очистить();
		
		
		
		//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
		// Данный фрагмент построен конструктором.
		// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
		
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
		|	ХозрасчетныйОстатки.Субконто2.БазоваяЕдиницаИзмерения КАК ЕдиницаИзмерения,
		|	ХозрасчетныйОстатки.Субконто2 КАК Партия,
		|	ВЫБОР
		|		КОГДА &ЦенаВключаетНДС
		|			ТОГДА (СУММА(ХозрасчетныйОстатки.СуммаОстаток) + 1) / СУММА(ХозрасчетныйОстатки.КоличествоОстаток) * 1.2
		|		ИНАЧЕ (СУММА(ХозрасчетныйОстатки.СуммаОстаток) + 1) / СУММА(ХозрасчетныйОстатки.КоличествоОстаток)
		|	КОНЕЦ КАК Цена,
		|	ВЫБОР
		|		КОГДА &СуммаВключаетНДС
		|			ТОГДА (СУММА(ХозрасчетныйОстатки.СуммаОстаток) + 1) * 1.2
		|		ИНАЧЕ СУММА(ХозрасчетныйОстатки.СуммаОстаток) + 1
		|	КОНЕЦ КАК Сумма,
		|	ВЫБОР
		|		КОГДА &СуммаВключаетНДС
		|			ТОГДА (СУММА(ХозрасчетныйОстатки.СуммаОстаток) + 1) * 1.2
		|		ИНАЧЕ СУММА(ХозрасчетныйОстатки.СуммаОстаток) + 1
		|	КОНЕЦ КАК СуммаБезСкидки,
		|	0 КАК СуммаСкидки,
		|	1 КАК Коэффициент,
		|	(СУММА(ХозрасчетныйОстатки.СуммаОстаток) + 1) * 0.2 КАК СуммаНДС,
		|	СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК Количество,
		|	ХозрасчетныйОстатки.Субконто1.СтавкаНДС КАК СтавкаНДС
		|ПОМЕСТИТЬ Остатки
		|ИЗ
		|	РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТоварыНаСкладе), , Организация = &Организация) КАК ХозрасчетныйОстатки
		|ГДЕ
		|	ХозрасчетныйОстатки.КоличествоОстаток > 0
		|	И ХозрасчетныйОстатки.СуммаОстаток > 0
		|
		|СГРУППИРОВАТЬ ПО
		|	ХозрасчетныйОстатки.Субконто1,
		|	ХозрасчетныйОстатки.Субконто2,
		|	ХозрасчетныйОстатки.Субконто2.БазоваяЕдиницаИзмерения,
		|	ХозрасчетныйОстатки.Субконто1.СтавкаНДС
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	Остатки.Номенклатура,
		|	Остатки.ЕдиницаИзмерения,
		|	Остатки.Партия,
		|	Остатки.Цена,
		|	Остатки.Сумма,
		|	Остатки.СуммаБезСкидки,
		|	Остатки.СуммаСкидки,
		|	Остатки.Коэффициент,
		|	Остатки.СуммаНДС,
		|	Остатки.Количество,
		|	Остатки.СтавкаНДС
		|ИЗ
		|	Остатки КАК Остатки
		|ГДЕ
		|	Остатки.Цена < &СуммаПодбора";
		
		Запрос.УстановитьПараметр("ЦенаВключаетНДС", ЗнОбъект.ТипЦен.ЦенаВключаетНДС);
		Запрос.УстановитьПараметр("СуммаВключаетНДС", ЗнОбъект.СуммаВключаетНДС);
		Запрос.УстановитьПараметр("Дата", ЗнОбъект.Дата);
		Запрос.УстановитьПараметр("Организация", ЗнОбъект.Организация);
		Запрос.УстановитьПараметр("СуммаПодбора", СуммаПодбора);
		
		
		Результат = Запрос.Выполнить();
		
		ВыборкаДетальныеЗаписи = Результат.Выбрать();
		ТблЗП = Результат.Выгрузить();
		ТблЗ = Результат.Выгрузить();
		
		
		СуммаОстатка = СуммаПодбора;	
		Поиск = Истина;
		Генер =Новый ГенераторСлучайныхЧисел();
		Пока Поиск Цикл
			
			Слч = Генер.СлучайноеЧисло(0,ТблЗ.Количество()-1);
			
			ТекСтрока = ТблЗ[Слч];
			
			Если ЗнОбъект[ИмяТабличнойЧасти].НайтиСтроки(Новый Структура("Номенклатура",ТекСтрока.Номенклатура)).Количество()>0 тогда
				продолжить;
			КонецЕсли;		
			
			Количество =  Генер.СлучайноеЧисло(1,ТекСтрока.Количество);
			СуммаТек = Количество * ТекСтрока.Цена;
			Если  СуммаТек < СуммаОстатка тогда
				СтрокаТабличнойЧасти = ЗнОбъект[ИмяТабличнойЧасти].Добавить();
				ЗаполнитьЗначенияСвойств(СтрокаТабличнойЧасти,ТекСтрока);
				СтрокаТабличнойЧасти.Количество = Количество;
				ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабЧасти(СтрокаТабличнойЧасти, ЗнОбъект);
				
				// Рассчитываем реквизиты табличной части.
				ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ЗнОбъект);
				ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ЗнОбъект);
				
				СуммаОстатка = СуммаОстатка - СтрокаТабличнойЧасти.Сумма;
			КонецЕсли;
			Запрос = Новый Запрос("ВЫБРАТЬ
			|	ТТабл.Номенклатура,
			|	ТТабл.ЕдиницаИзмерения,
			|	ТТабл.Партия,
			|	ТТабл.Цена,
			|	ТТабл.Сумма,
			|	ТТабл.СуммаБезСкидки,
			|	ТТабл.СуммаСкидки,
			|	ТТабл.Коэффициент,
			|	ТТабл.СуммаНДС,
			|	ТТабл.Количество,
			|	ТТабл.СтавкаНДС
			|ПОМЕСТИТЬ ТТабл
			|ИЗ
			|	&ТТабл КАК ТТабл
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ТТабл.Номенклатура,
			|	ТТабл.ЕдиницаИзмерения,
			|	ТТабл.Партия,
			|	ТТабл.Цена,
			|	ТТабл.Сумма,
			|	ТТабл.СуммаБезСкидки,
			|	ТТабл.СуммаСкидки,
			|	ТТабл.Коэффициент,
			|	ТТабл.СуммаНДС,
			|	ТТабл.Количество,
			|	ТТабл.СтавкаНДС
			|ИЗ
			|	ТТабл КАК ТТабл
			|ГДЕ
			|	ТТабл.Цена < &СуммаОстатка");
			Запрос.УстановитьПараметр("СуммаОстатка",СуммаОстатка);
			Запрос.УстановитьПараметр("ТТабл",ТблЗ);
			ТблЗ = Запрос.Выполнить().Выгрузить();
			
			
			Если ТблЗ.Количество() = 0 тогда
				прервать;
			КонецЕсли;
		КонецЦикла;
		
				
			
	КонецПроцедуры 
#КонецЕсли 

No comments:

Post a Comment