Вход | Регистрация
 

Как подобрать комбинации сумм на нужную сумму

Как подобрать комбинации сумм на нужную сумму
Я
   ИС-2
 
18.08.21 - 19:26
Из банка пришло 100 руб.  за операции по экварингу
К данной сумме надо подобрать документы оплата картой. Например, есть документы на 20,30,50,75,25 руб, Торговую уступку пока опускаем.
Надо подобрать документы оплата картой так чтобы максимально закрыть эти 100 рублей. С высокой долей вероятности комбинация из нескольких документов оплата картой даст нужные 100 руб. Но сколько таких документов надо использовать в подборе я не знаю. Может только 1, а моджет их будет 3.

Сейчас задачу решил составлением все возможных комбинаций через запрос. Но это ресурсоемкая операция.

Есть ли более быстрые алгоритмы (а еще лучше сразу в запросе или в СКД) для подбора документов, чтобы закрыть сумму?
   Ненавижу 1С
 
1 - 18.08.21 - 19:28
>>Сейчас задачу решил составлением все возможных комбинаций через запрос

не верю!
   hhhh
 
2 - 18.08.21 - 19:34
(0) а зачем это нужно? То что присылает банк, нужно только для расчетов с банком, поэтому сложить все эти суммы, это будет долг банка, и этот долг закрывать общей суммой.
   lubitelxml
 
3 - 18.08.21 - 19:38
(1) я тоже
   lubitelxml
 
4 - 18.08.21 - 19:39
Чем то задачу про рюкзак напоминает
   МихаилМ
 
5 - 18.08.21 - 19:50
   МихаилМ
 
6 - 18.08.21 - 19:52
   МихаилМ
 
7 - 18.08.21 - 19:53
   BeerHelpsMeWin
 
8 - 18.08.21 - 19:59
Почему нельзя закрывать просто всё подряд? У вас частичной оплаты в принципе не может быть?
   BeerHelpsMeWin
 
9 - 18.08.21 - 23:41
(8) Туплю, тебе ж не это надо. Тогда да, смотри в сторону (2)
   Злопчинский
 
10 - 18.08.21 - 23:47
для небольшого количества сумм прямой перебор считает быстро.
   Franchiser
 
11 - 19.08.21 - 01:23
Делал такую задачу лет 20 назад на 7.7. Узнал что такое рекурсия.
   SleepyHead
 
12 - 19.08.21 - 05:15
(11) Рекурсия (сущ.) - см. Рекурсия.
   ИС-2
 
13 - 19.08.21 - 08:50
(1) через запрос ничего сложного - делаешь полное содение (закладка соедения пустая) между таблицами документов. Кол-во таблиц равно кол-ву комбиниаций. Правда оптимизировать  надо - чтобы дублей не было
   ИС-2
 
14 - 19.08.21 - 08:54
ВЫБРАТЬ
    ТЗ_ОплатаКартой.Ссылка КАК ОплатаКартой,
    ТЗ_ОплатаКартой.СуммаДокумента КАК СуммаОплатыКартой
ПОМЕСТИТЬ ВТ_ОплатаКартой
ИЗ
    Документ.ОплатаОтПокупателяПлатежнойКартой КАК ТЗ_ОплатаКартой
ГДЕ
    ТЗ_ОплатаКартой.Ссылка В(&МассивОплатаКартой)
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_ОплатаКартой.ОплатаКартой,
    ВТ_ОплатаКартой.СуммаОплатыКартой
ПОМЕСТИТЬ ВТ_Множества
ИЗ
    ВТ_ОплатаКартой КАК ВТ_ОплатаКартой
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_Множества_1.ОплатаКартой КАК ОплатаКартой_1,
    ВТ_Множества_1.СуммаОплатыКартой КАК СуммаОплатыКартой_1,
    ВТ_Множества_2.ОплатаКартой КАК ОплатаКартой_2,
    ВТ_Множества_2.СуммаОплатыКартой КАК СуммаОплатыКартой_2,
    0 + ВТ_Множества_1.СуммаОплатыКартой + ВТ_Множества_2.СуммаОплатыКартой КАК СуммаВсехОплат,
    ВЫБОР
        КОГДА &СуммаИзБанкаСКомиссией - (0 + ВТ_Множества_1.СуммаОплатыКартой + ВТ_Множества_2.СуммаОплатыКартой) < 0
            ТОГДА NULL
        ИНАЧЕ &СуммаИзБанкаСКомиссией - (0 + ВТ_Множества_1.СуммаОплатыКартой + ВТ_Множества_2.СуммаОплатыКартой)
    КОНЕЦ КАК Расхождение
ИЗ
    ВТ_Множества КАК ВТ_Множества_1,
    ВТ_Множества КАК ВТ_Множества_2
ГДЕ
    ИСТИНА
    И НЕ ВТ_Множества_1.ОплатаКартой = ВТ_Множества_2.ОплатаКартой

УПОРЯДОЧИТЬ ПО
    Расхождение
ИТОГИ ПО
    Расхождение
   Доминошник
 
15 - 19.08.21 - 09:42
Присоединюсь к (2)

(0) Что будем делать, подобрав из этого списка "20,30,50,75,25" такие суммы - 20, 30, 50.
А на следующий день банк присылает 50 (в списке осталось только 75 и 25).
   2S
 
16 - 19.08.21 - 09:44
(0) а почему не по фифо закрывать?

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