Это не единственная публикация по данной тематике на Инфостарт'е, но в тех, которые мне попались, предлагают "скачай файл и сам разбирайся", какой метод используется, рабочий ли он вообще. Не самый лучший вариант, когда нужно внедрить идею в ограниченные сроки.
Цель публикации - объяснение метода на практическом примере, чтобы читатель мог его понять и самостоятельно воспроизвести. Кому этого недостаточно - реализация метода во внешней обработке в приложении к публикации.
Вводные данные:
На склад "Х" в течение месяца перемещают товары в различных количествах и имеющих разную себестоимость.
В конце месяца нужно сформировать такую выборку товаров для дальнейшего списания, в которую войдут товары со склада "Х", суммарная себестоимость которых будет максимально приближена к заданной сумме Х, но не будет её превышать.
Необходимо разработать механизм формирования такой выборки товаров.
У задачи "получить из набора слагаемых максимально приближенную к заданному числу сумму" есть несколько способов решения, её еще называют "Задача о сумме подмножеств" (см. статью на Википедии).
Рассмотрим один из способов:
N={х1, x2, x3, x4, x5...} - список слагаемых. В данном примере это себестоимость товаров.
R - Число, к которому стремится, не превышая, сумма слагаемых из списка N.
Шаги решения:
1. Создать список F, первоначально состоящий из одного элемента, равного 0.
2. Для каждого элемента x из списка N:
Записать в конец списка F элементы, полученные из списка F, путем увеличения каждого его элемента на величину x, где x - значение текущего элемента из списка N.
3. Отсортировать элементы списка F в порядке возрастания.
4. Удалить из списка F все элементы, больше X.
5. Последний элемент из списка F является решением задачи.
Пример:
Красным - отмечены добавляемые на каждом шаге в конец списка числа
n - порядковый номер элемента из списка N, в расчетах не участвует.
N= {4.1, 3.2, 5.5, 7, 6.3}; R = 13.4;
1. F= {0}
2.1 n=1; х = 4.1; F= {0, 4.1}
2.2 n=2; х = 3.2; F= {0, 4.1, 3.2, 7.3}
2.3 n=3; х = 5.5; F= {0, 4.1, 3.2, 7.3, 5.5, 9.6, 8.7, 12.8}
2.4 n=4; х = 7,0; F= {0, 4.1, 3.2, 7.3, 5.5, 9.6, 8.7, 12.8, 7, 11.1, 10.2, 14.3, 12.5, 16.6, 15.7, 19.8}
2.5 n=5; х = 6.3; F= {0, 4.1, 3.2, 7.3, 5.5, 9.6, 8.7, 12.8, 7, 11.1, 10.2, 14.3, 12.5, 16.6, 15.7, 19.8, 6.3, 10.4, 9.5, 13.6, 11.8, 15.9, 15, 19.1, 13.3, 17.4, 16.5, 20.6, 18.8, 22.9, 22, 26.1}
3. F= {0, 3.2, 4.1, 5.5, 6.3, 7, 7.3, 8.7, 9.5, 9.6, 10.2, 10.4, 11.1, 11.8, 12.5, 12.8, 13.3, 13.6, 14.3, 15, 15.7, 15.9, 16.5, 16.6, 17.4, 18.8, 19.1, 19.8, 20.6, 22, 22.9, 26.1}
4. F= {0, 3.2, 4.1, 5.5, 6.3, 7, 7.3, 8.7, 9.5, 9.6, 10.2, 10.4, 11.1, 11.8, 12.5, 12.8, 13.3}
5. 13.3
Для того, чтобы получить список слагаемых, из которых получилось результирующее число, можно для каждого элемента списка F хранить набор слагаемых. Тут возможны разные варианты, в своём примере я использовал СписокЗначений.
Пример под публикацией был написан для УТ 10.3 в режиме совместимости 8.3.6 и выше (Обычное приложение)
Как работает обработка (см. рисунок формы):
1. Заполняем "Дата", "Склад", "Сумма себестоимости"
2. По кнопке "Заполнить" заполняется табличная часть на форме, и в ней отмечаются строки с подобранными слагаемыми наиболее близко подходящие к сумме себестоимости.
3. По кнопке "Создать реализацию", соответственно создается реализация, которая заполняется из отмеченных на форме строк.
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 10.3, релизы 10.3.46.3