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

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

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

не верю!
2 hhhh
 
18.08.21
19:34
(0) а зачем это нужно? То что присылает банк, нужно только для расчетов с банком, поэтому сложить все эти суммы, это будет долг банка, и этот долг закрывать общей суммой.
3 lubitelxml
 
18.08.21
19:38
(1) я тоже
4 lubitelxml
 
18.08.21
19:39
Чем то задачу про рюкзак напоминает
5 МихаилМ
 
18.08.21
19:50
6 МихаилМ
 
18.08.21
19:52
7 МихаилМ
 
18.08.21
19:53
8 BeerHelpsMeWin
 
18.08.21
19:59
Почему нельзя закрывать просто всё подряд? У вас частичной оплаты в принципе не может быть?
9 BeerHelpsMeWin
 
18.08.21
23:41
(8) Туплю, тебе ж не это надо. Тогда да, смотри в сторону (2)
10 Злопчинский
 
18.08.21
23:47
для небольшого количества сумм прямой перебор считает быстро.
11 Franchiser
 
гуру
19.08.21
01:23
Делал такую задачу лет 20 назад на 7.7. Узнал что такое рекурсия.
12 SleepyHead
 
гуру
19.08.21
05:15
(11) Рекурсия (сущ.) - см. Рекурсия.
13 ИС-2
 
naïve
19.08.21
08:50
(1) через запрос ничего сложного - делаешь полное содение (закладка соедения пустая) между таблицами документов. Кол-во таблиц равно кол-ву комбиниаций. Правда оптимизировать  надо - чтобы дублей не было
14 ИС-2
 
naïve
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).
16 2S
 
19.08.21
09:44
(0) а почему не по фифо закрывать?
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс