![]() |
|
подбор товаров на заданную сумму - работает супер! 🠗 (Волшебник 09.02.2020 13:13) |
☑ | ||
---|---|---|---|---|
0
rtweerer
09.02.20
✎
13:11
|
НеобходимаяСумма = Число(СтрЗаменить(Стр.К4," ",""))*(1-НаценкаВПроцентах/100); // НаценкаВПроцентах
Если Было<> Истина Тогда // запрос просто меньше общей Запрос3 = Новый Запрос; Запрос3.Текст = "ВЫБРАТЬ | ПартииТоваровНаСкладахОстатки.Номенклатура, | ПартииТоваровНаСкладахОстатки.КоличествоОстаток, | ПартииТоваровНаСкладахОстатки.СтоимостьОстаток, | ВЫБОР | КОГДА ПартииТоваровНаСкладахОстатки.КоличествоОстаток = 0 | ТОГДА 0 | ИНАЧЕ ПартииТоваровНаСкладахОстатки.СтоимостьОстаток / ПартииТоваровНаСкладахОстатки.КоличествоОстаток | КОНЕЦ КАК Цена |ПОМЕСТИТЬ Ц |ИЗ | РегистрНакопления.ПартииТоваровНаСкладах.Остатки КАК ПартииТоваровНаСкладахОстатки |ГДЕ | ПартииТоваровНаСкладахОстатки.КоличествоОстаток > 0 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Ц.Номенклатура, | ISNULL(Ц.КоличествоОстаток,0) КАК КоличествоОстаток, | Ц.СтоимостьОстаток, | Ц.Цена КАК Цена |ИЗ | Ц КАК Ц |ГДЕ | Ц.Цена <= &Цена | |УПОРЯДОЧИТЬ ПО | Цена УБЫВ"; Запрос3.УстановитьПараметр("Цена", НеобходимаяСумма); Рез = Запрос3.Выполнить().Выгрузить(); // запрос меньше деленное на 4 Запрос3 = Новый Запрос; Запрос3.Текст = "ВЫБРАТЬ | ПартииТоваровНаСкладахОстатки.Номенклатура, | ПартииТоваровНаСкладахОстатки.КоличествоОстаток, | ПартииТоваровНаСкладахОстатки.СтоимостьОстаток, | ВЫБОР | КОГДА ПартииТоваровНаСкладахОстатки.КоличествоОстаток = 0 | ТОГДА 0 | ИНАЧЕ ПартииТоваровНаСкладахОстатки.СтоимостьОстаток / ПартииТоваровНаСкладахОстатки.КоличествоОстаток | КОНЕЦ КАК Цена |ПОМЕСТИТЬ Ц |ИЗ | РегистрНакопления.ПартииТоваровНаСкладах.Остатки КАК ПартииТоваровНаСкладахОстатки |ГДЕ | ПартииТоваровНаСкладахОстатки.КоличествоОстаток > 0 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Ц.Номенклатура, | ISNULL(Ц.КоличествоОстаток,0) КАК КоличествоОстаток, | Ц.СтоимостьОстаток, | Ц.Цена КАК Цена |ИЗ | Ц КАК Ц |ГДЕ | Ц.Цена <= &Цена | |УПОРЯДОЧИТЬ ПО | Цена УБЫВ"; Запрос3.УстановитьПараметр("Цена", НеобходимаяСумма/4); Рез4 = Запрос3.Выполнить().Выгрузить(); // запрос меньше деленное на 2 Запрос3 = Новый Запрос; Запрос3.Текст = "ВЫБРАТЬ | ПартииТоваровНаСкладахОстатки.Номенклатура, | ПартииТоваровНаСкладахОстатки.КоличествоОстаток, | ПартииТоваровНаСкладахОстатки.СтоимостьОстаток, | ВЫБОР | КОГДА ПартииТоваровНаСкладахОстатки.КоличествоОстаток = 0 | ТОГДА 0 | ИНАЧЕ ПартииТоваровНаСкладахОстатки.СтоимостьОстаток / ПартииТоваровНаСкладахОстатки.КоличествоОстаток | КОНЕЦ КАК Цена |ПОМЕСТИТЬ Ц |ИЗ | РегистрНакопления.ПартииТоваровНаСкладах.Остатки КАК ПартииТоваровНаСкладахОстатки |ГДЕ | ПартииТоваровНаСкладахОстатки.КоличествоОстаток > 0 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Ц.Номенклатура, | ISNULL(Ц.КоличествоОстаток,0) КАК КоличествоОстаток, | Ц.СтоимостьОстаток, | Ц.Цена КАК Цена |ИЗ | Ц КАК Ц |ГДЕ | Ц.Цена <= &Цена | |УПОРЯДОЧИТЬ ПО | Цена УБЫВ"; Запрос3.УстановитьПараметр("Цена", НеобходимаяСумма/2); Рез2 = Запрос3.Выполнить().Выгрузить(); Было =Истина; КонецЕсли; //Было Нашли = Ложь; Для Откл = 1 По 10 Цикл Если Нашли Тогда Прервать; КонецЕсли; Отклонение = Откл/100; /////////////////// БЫСТРЫЙ ПОДБОР /////////////// Для Н=1 По 20 Цикл Если Нашли Тогда Прервать; КонецЕсли; Для каждого С Из Рез Цикл Если С.КоличествоОстаток >= Н Тогда Если ((НеобходимаяСумма - С.Цена*Н)/НеобходимаяСумма)<Отклонение И ((НеобходимаяСумма - С.Цена*Н)/НеобходимаяСумма)>0 Тогда //Сообщить("Подобрали товар:" + С.Номенклатура +" по цене "+С.Цена + " в количестве "+Н + " отклонение составило "+((НеобходимаяСумма - С.Цена*Н)/НеобходимаяСумма)*100+" процентов. Нужно было "+НеобходимаяСумма); Нашли = Истина; Прервать; КонецЕсли; КонецЕсли; //хватает остатка КонецЦикла; КонецЦикла; /////////////////////////////////////////// Если Не Нашли Тогда Для Н=1 По 10 Цикл Если Нашли Тогда Прервать; КонецЕсли; Для каждого К Из Рез4 Цикл Если Нашли Тогда Прервать; КонецЕсли; Для каждого С Из Рез2 Цикл Если Нашли Тогда Прервать; КонецЕсли; Если К.КоличествоОстаток >= Н И С.КоличествоОстаток >=0 Тогда Если (НеобходимаяСумма - С.Цена-К.Цена*Н)/НеобходимаяСумма<Отклонение И (НеобходимаяСумма - С.Цена-К.Цена*Н)/НеобходимаяСумма>0 Тогда //Сообщить("!!!!!"+С.Цена+" и "+ К.Цена +" в количестве "+Н+ " необходимо "+НеобходимаяСумма); Нашли = Истина; Прервать; КонецЕсли; КонецЕсли; //хватает остатка КонецЦикла; //С КонецЦикла; //К КонецЦикла; // Н КонецЕсли; //не нашли КонецЦикла;//Отклонения |
|||
1
Волшебник
модератор
09.02.20
✎
13:14
|
чушь какая-то
|
|||
2
palsergeich
09.02.20
✎
13:31
|
(0) С подключением.
А теперь не на пустой базе то же самое с парой миллионов позиций номенклатуры, по которой есть остатки |
|||
3
zladenuw
09.02.20
✎
13:51
|
Может я что то не то курю.
1. Условие не на виртуальные таблицы. 2. Есть такое понятие Имеющие. А так да (1) |
|||
4
MyNick
09.02.20
✎
14:28
|
(0) классический овнокод
|
|||
5
MyNick
09.02.20
✎
14:29
|
С.Цена*Н за такой стиль убивать надо на месте
|
|||
6
Ненавижу 1С
гуру
09.02.20
✎
14:58
|
(0) ЧТО ЭТО БЫЛО?
|
|||
7
МихаилМ
09.02.20
✎
15:05
|
(6)
гений1с делится скромно |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |