Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

подбор товаров на заданную сумму - работает супер!

↓ [Волшебник, 09.02.20 - 13:13]
подбор товаров на заданную сумму - работает супер!
Я
   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
чушь какая-то
   palsergeich
 
2 - 09.02.20 - 13:31
(0) С подключением.
А теперь не на пустой базе то же самое с парой миллионов позиций номенклатуры, по которой есть остатки
   zladenuw
 
3 - 09.02.20 - 13:51
Может я что то не то курю.

1. Условие не на виртуальные таблицы.
2. Есть такое понятие Имеющие.

А так да (1)
   MyNick
 
4 - 09.02.20 - 14:28
(0) классический овнокод
   MyNick
 
5 - 09.02.20 - 14:29
С.Цена*Н за такой стиль убивать надо на месте
   Ненавижу 1С
 
6 - 09.02.20 - 14:58
(0) ЧТО ЭТО БЫЛО?
   МихаилМ
 
7 - 09.02.20 - 15:05
(6)
гений1с  делится скромно

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.