Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм вычисления возможных комбинаций цен из дерева значений
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
valleha
Добрый день. Прошу помощи, т.к. идеи уже иссякли.
Буду ёмким и кратким.

Платформа 8.3 (обычное приложение), конф-я самописная.

Есть заполненное дерево значений ДЗ_Компонентов.
1-й уровань:
  • колонка Наименование, содержит наименование товара из Каталога Номенклатуры.

2-й уровень (последний):
  • колонки:
    • 1 Наименование, содержит наименование товара из Номенклатуры (в отличии от Каталога Номенклатуры, содержит ещё и ведомости об упаковке).
    • 2 Вес в смеси, число.
    • 3 Объём в смеси, число.
    • 4 Цена в номенклатуры за 1 кг., число.
  • количество уровней: 2
  • количество строк в 1-м или 2-м уровнях неограничено


Пример дерева:
-ТОВАР1изКаталога
--[ТОВАР1 25 кг.] [Вес:100] [Объём:72] [Цена:200]
-ТОВАР2изКаталога
--[ТОВАР2 6 л.] [Вес:25] [Объём:30] [Цена:140]
--[ТОВАР2 12,5 л.] [Вес:25] [Объём:30] [Цена:130]
--[ТОВАР2 25 л.] [Вес:25] [Объём:30] [Цена:120]
-ТОВАР3изКаталога
--[ТОВАР2 12,5 л.] [Вес:40] [Объём:45] [Цена:230]

Вес в кг, объём в литрах. Для товара1 100кг=72л по цене 200 за кг.

Задача-минимум: перебрать дерево таким образом, чтобы на выходе получить Массив или таблицу значений со всеми возможными комбинациями цен за 1кг из которой можно будет вытянуть максимальное и минимальное значение цены.

Количество кг в смеси: 100+25+40=165

Пример варианотов цен из дерева:
200*100+140*25+230*40=32700 грн/за 165 кг
200*100+130*25+230*40=32450 грн/за 165 кг
200*100+120*25+230*40=32200 грн/за 165 кг


Возможные цены:
32700 /165=198,18 грн за 1 кг смеси
32450 /165=196,67 грн за 1 кг смеси
32200 /165=195,15 грн за 1 кг смеси

Мин: 195,15
Макс: 198,18
sava1
Обходим дерево по первому уровню - запоминаем Товар
минцена=0; максцена=0;
Обходим дерево по второму уровню
Вычисляем ценаЗаЕдиницу = Цена/Вес
Если ценаЗаЕдиницу>максцена тогда максцена = ценаЗаЕдиницу
Конец
Если ценаЗаЕдиницу<минцена тогда минцена = ценаЗаЕдиницу
Конец
КонецЦикла
Добавляем в ТЗ,Массив,Структуру и т.д. - Товар, минцена, максцена
valleha
Процедура Печать()
//...............
            ТЗ_Цен=Новый ТаблицаЗначений;
            ТЗ_Цен.Колонки.Добавить("СуммаКГВСмеси");
            ТЗ_Цен.Колонки.Добавить("Цена");
            РекурсияДереваКомпонентов(ДЗ_Компонентов, 0, ТЗ_Цен);
//...............
КонецПроцедуры
Процедура РекурсияДереваКомпонентов(ДЗ_Компонентов, ИндексВетки, ТЗ, СуммаЦен=0, СуммаКГ=0)
    КоличествоВеток=ДЗ_Компонентов.Строки.Количество();                             //Количество элементов верхнего уровня
    Для Каждого СтрокаВВетке Из ДЗ_Компонентов.Строки[ИндексВетки].Строки Цикл      //Перебор нижнего уровня в рамках одной ветки
        Сумма=СуммаЦен+СтрокаВВетке.Цена*СтрокаВВетке.Вес;                          //Суммируем значение цены
        КГ=СуммаКГ+СтрокаВВетке.Вес;
        Если КоличествоВеток-1=ИндексВетки Тогда                                    //Если добрались до последней ветки, тогда...
            Нов=ТЗ.Добавить();                                                      //...добавляем новую запись в таблицу значений
            Нов.Цена=Сумма;
            Нов.СуммаКГВСмеси=КГ;
        Иначе
            РекурсияДереваКомпонентов(ДЗ_Компонентов, ИндексВетки+1, ТЗ, Сумма, КГ);    //...иначе ныряем в следующую ветку с новой Суммой
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры



Всем спасибо за участие...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.