Имя: Пароль:
1C
1С v8
Предложите алгоритм укрупнения информации о скидках
0 Jackman
 
18.05.12
16:45
На входе имеется таблица значений, в которой указана номенклатура и процент скидки. Номенклатура может быть как в виде элементов, так и папок. Нужно укрупнить данные о скидках, например:

Имеем такой справочник номенлатуры:

Папка Фрукты
|_Подпапка Яблоки
||_Элемент Сладкие яблоки
||_Элемент Кислые яблоки  
|_Подпапка Груши
||_Элемент Спелые груши
||_Элемент Переспелые груши


Во входной ТЗ имеем такие данные о скидках:
Папка Фрукты - скидка 20%
Элемент Сладкие яблоки - скидка 23%
Подпапка Груши - скидка 20%

Результатом расчета должны получить:
Папка Фрукты - скидка 20%
Элемент Сладкие яблоки - скидка 23%

Информация о скидке на подпапку Подпапка Груши избыточна, ее можно убрать.

Еще пример, при той же структуре справочника.

Во входной ТЗ имеем такие данные о скидках:
Элемент Сладкие яблоки - скидка 23%
Элемент Кислые яблоки - скидка 23%

Результатом расчета должны получить:
Подпапка Яблоки - скидка 23%

Т.е. мы укрупнили значения скидок для элементов подпапки Яблоки до общей скидки на всю подпапку.

Предложите, пожалуйста, алгоритм, как это оптимально можно обработать, если:

- первичная таблица значений может иметь 150-200 элементов и папок;
- справочник "Номеклатура" имеет неограниченное число уровней, но как правило, одна "ветка" имеет не более 6ти уровней.
1 DrShad
 
18.05.12
16:51
запихнуть ТЗ в дерево значений, по каждому уровню просчитать среднюю скидку, потом при обходе, если по текущей строке процент равен проценту по родителю, то не писать его
2 Jackman
 
18.05.12
16:59
(1) Хорошо, но, если во втором примере во входной ТЗ указаны только элементы папки, но нет самой папки. Т.е., когда указаны все элементы папки, но не указана сама папка
3 Jackman
 
18.05.12
17:06
(1) Может быть и такой вариант, когда:

Во входной ТЗ имеем такие данные о скидках:
Подпапка Яблоки- скидка 30%
Подпапка Груши - скидка 30%

Результатом расчета должны получить:
Подпапка Фрукты - скидка 30%
4 pumbaEO
 
18.05.12
17:08
(2) тогда используй эти элементы. Искать верхний уровень дело неблагодарное.
Что будешь делать когда
| Папка1
||Подпака1 23%
|||Элемент1 23%
|||ПодПодпапка1 15%
||||Элемент 2 16%
5 Jackman
 
18.05.12
17:20
(4) Ну тут только такая оптимизация:

| Папка1  - убираем
||Подпака1 23%
|||Элемент1 23%  - убираем
|||ПодПодпапка1 15%
||||Элемент 2 16%

Я не сказал, что во входной ТЗ не может быть позиции с нулевой скидкой
6 Stim
 
18.05.12
17:21
посмотреть, как это сделано в Рознице - не предлагать?
7 DrShad
 
18.05.12
17:22
с нулевой и записывать не нужно, если она нижнего уровня
8 Ненавижу 1С
 
гуру
18.05.12
17:27
а если так:


Фрукты
|_ Яблоки
|_ Груши
|_ Сливы

Яблоки - 20%
Груши - 20%
Сливы -30%

то как упростить? до

Фрукты - 20%
Сливы -30%

или оставить как есть?
9 Jackman
 
18.05.12
17:33
(8) Тут упрощения не будет, т.к. все значения отличаются
10 Jackman
 
18.05.12
17:37
(6) Здесь не расчет скидки, а оптимизация информации о скидках.

Например, из нескольких десятков записей с группами и элементами удалось тот же набор информации сделать менее, чем 10ю записями.
11 Jackman
 
18.05.12
17:52
(8) Хотя, нет, я ошибся. Нужно упростить до:

Фрукты - 20%
Сливы -30%
12 Jackman
 
18.05.12
17:53
Т.е. это означает, что базовая скидка на фрукты 20%, а на сливы спец скидка в 30%. Извините, тупал в (9)
13 vinogradъ
 
18.05.12
17:55
Фрукты
|_ Яблоки
|_ Груши
|_ Сливы
|_ Бананы
|_ Кокосы

Яблоки - 20%
Груши - 20%
Сливы -30%
Бананы -40%
Кокосы -40%

а здесь тогда согласно (11) и (12)?
14 Jackman
 
18.05.12
18:00
(13) Вряд ли будет именно такая ситуация, но, в принципе, верны два решения:

Фрукты     20
|_ Сливы 30
|_ Бананы 40
|_ Кокосы 40

и

Фрукты   40
|_ Яблоки 20
|_ Груши  20
|_ Сливы  30
15 Jackman
 
18.05.12
18:06
+ (13) Эти решения возможны, при условии, что справочнике "Номенклатура" нет других подпапок в папке "Фрукты", которые не упоминаются во входной ТЗ, например, папка "Апельсины", которые идут без скидки
16 pumbaEO
 
18.05.12
18:20
Элемент | Уровень | Процент

Свернул по уровню с различными процентами.
Выбрал где один и тот же уровень > 1 раз встречается, определил, какие элементы удалять, какие оставить.

Как-то так...
17 Jackman
 
18.05.12
18:30
(16) Если это будет один и тот же номер уровня, но в разных "ветках" номенклатурных групп?
2 + 2 = 3.9999999999999999999999999999999...