Не так давно я столкнулся с задачей, необходимо было рассчитать максимальное количество упаковок прямоугольной формы на паллете европейского размера 1200х800 мм. Вначале задача показалась тривиальной. Взять и поделить площадь паллеты на сумму площадей упаковок. Если на какой-то итерации сумма площадей упаковок превысила площадь паллеты, то возвращаем предыдущее количество суммы упаковок.
Но при визуальном рассмотрении задачи оказалось, что не всегда это срабатывает. Либо какая-то упаковка свисает, либо остается много пустого места. Пришлось искать пути решения в интернете.
Побродив по просторам, нашел описания, которые в большинстве случаев приводили к решению "Задачи о рюкзаке". И тут наткнулся на решение в виде excel файла. Код расчета и графического отображения размещения упаковок выполнен в виде макросов. Алгоритм содержал расчет размещения не только однотипных упаковок, но и до 20 вариантов упаковок разных размеров. Огромное спасибо автору под ником Михаил Ч. (MCH).
Суть метода сводится опять же к задаче о рюкзаке. Выбирается два варианта раскладки. Сначала вертикальная, остатки укладываются горизонтально на свободное место, затем горизонтальная, остатки укладываются вертикально на свободное место. Разобрав код, убрал все лишнее, что касалось раскладки разнотипных упаковок, и вывода графики, перевел с VBA на язык 1С. Получилась обработка, которую предлагаю вашему вниманию.
Алгоритм, представленный в обработке, я использовал в форме характеристик номенклатуры УТ 11.5. Предполагалось, что при вводе длины и ширины упаковки сразу будет производиться расчет количества упаковок в слое на паллете. Но из за того, что мелкие упаковки обсчитывались долго, пришлось перенести расчет на кнопку.
При тестировании оказалось, что если раскладывать мелкие упаковки, то расчет происходит довольно долго. Эта особенность алгоритма решения "задачи о рюкзаке", кстати, описана в статьях, посвященных этой задаче.
Представленная обработка отвязана от какой-либо конкретной конфигурации, код можно модифицировать под реквизиты вашей конкретной конфигурации.
Приветствую все комментарии по оптимизации кода. Тому, кто придумает, как на форму вывести графическую раскладку упаковок на паллете, особый респект.
Тестировалось на платформе 8.3.23.1739.