Имя: Пароль:
1C
1С v8
подбор товаров на заданную сумму - работает супер!
🠗 (Волшебник 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с  делится скромно