Имя: Пароль:
1C
1С v8
Попытка создания отчета с АВС-анализом
,
0 Saari
 
23.08.21
08:45
Пытаюсь сделать отчет с АВС-анализом.
Есть таблица (Таб) из 4-х колонок: Товар (1), Количество (2), Доля каждого товара в % (3), Совокупный (накопительный) вклад в % (4)
Осталось сделать последний шаг: отнести каждый товар к группам А, В или С.
Например, АВС_А - 80%, АВС_В - 15%, АВС_С - 5%.
Написал вот такой цикл:
Для Каждого ТекСтр Из Таб Цикл
                
Если ТекСтр.СовокупныйПроцент <= АВС_А Тогда //группа А
        НЗ = ТабА.Добавить();
    НЗ.Номенклатура = ТекСтр.Номенклатура;
    ТекСтр.ЗаписьОбработана = Истина;
КонецЕсли;
                
Если НЕ ТекСтр.ЗаписьОбработана Тогда
    Если (ТекСтр.СовокупныйПроцент > АВС_А) И (ТекСтр.СовокупныйПроцент <= (АВС_А + АВС_В)) Тогда //группа В
        НЗ = ТабВ.Добавить();
        НЗ.Номенклатура = ТекСтр.Номенклатура;
        ТекСтр.ЗаписьОбработана = Истина;
    КонецЕсли;
КонецЕсли;
                
Если НЕ ТекСтр.ЗаписьОбработана Тогда
    Если (ТекСтр.СовокупныйПроцент > (100 - АВС_С)) Тогда //группа С
        НЗ = ТабС.Добавить();
        НЗ.Номенклатура = ТекСтр.Номенклатура;
        ТекСтр.ЗаписьОбработана = Истина;
    КонецЕсли;
КонецЕсли;
    
КонецЦикла;

Этот цикл работает, если в таблице много строк.
Если в таблице две строки (со значениями в колонке "Совокупный вклад" 90% и 10% )или одна строка (со значением 100%), то этот алгоритм не работает.

Подскажите, пожалуйста, правильный алгоритм распределения товаров из таблицы по группам А, В и С.
1 Azverin
 
23.08.21
09:00
(0) по мне, так твои два примера внизу не соответствуют модели АВС (80%,15%,5%), т.е. выводишь пользователю сообщение: "не получилось распределить. поменяйте проценты классов"
2 Saari
 
23.08.21
09:02
(1) Хорошо. Пусть будет так: АВС_А - 70%, АВС_В - 15%, АВС_С - 5%.
3 Saari
 
23.08.21
09:16
(2) Опечатка. АВС_А - 70%, АВС_В - 25%, АВС_С - 5%.
В сумме должно быть 100%.
4 Azverin
 
23.08.21
09:34
(3) ещё раз: твои примеры не подходят под указанные проценты распределения... услышь меня.
вклад 90% не входит ни в 80%, ни в 75%.
5 Saari
 
23.08.21
09:35
(4) а как правильно?
6 Azverin
 
23.08.21
09:56
(5) Твоя Таб должна содержать записи, удовлетворяющие совокупному проценту заданным классам А, В, С.
Иначе не получится.
например, товар1=67%, товар2=65%.... товарN=14%, товарN+100=3%. Каждый товар попадёт в свой класс.
7 Saari
 
23.08.21
10:00
(6) А если проданы 3 товара, процент по каждому такой: 95, 3 и 2?
тогда 1-й товар - группа А, а второй и третий - группа С.
Но как это запрограммировать?
8 hhhh
 
23.08.21
10:09
(7) наоборот двигайтесь. Сначала группа С, потом В, а все что останутся - это группа А.
9 Базис
 
naïve
23.08.21
10:14
Фильтруй сперва такие случаи, этот код не трожь. Или выводи "Ну и что тут распределять? Продавайте больше, нечего щщитать", или вручную 2-3 строки распредели.

Отлаживать придётся на реальных объёмах данных.
10 vyaz
 
23.08.21
10:34
(0) СКД умеет делать ABC, зачем такие заморочки с кодом?
11 Azverin
 
23.08.21
10:45
(8) Да, наверное так. Я не проснулся. (0) Извини.
12 Saari
 
23.08.21
11:01
Получилось! Пока не нашел набора данных, для которых этот цикл не правильно обрабатывает:
            
                        Для Каждого ТекСтр Из Таб Цикл
                
                                Если (ТекСтр.СовокупныйПроцент <= АВС_А) Тогда //группа А
                    НЗ = ТабА.Добавить();
                    НЗ.Номенклатура = ТекСтр.Номенклатура;
                    ТекСтр.ЗаписьОбработана = Истина;
                КонецЕсли;
                
                Если НЕ ТекСтр.ЗаписьОбработана Тогда
                    Если ТабА.Количество() = 0 Тогда
                        НЗ = ТабА.Добавить();
                        НЗ.Номенклатура = ТекСтр.Номенклатура;
                        ТекСтр.ЗаписьОбработана = Истина;
                    КонецЕсли;
                КонецЕсли;
                
                Если НЕ ТекСтр.ЗаписьОбработана Тогда
                    Если (ТекСтр.СовокупныйПроцент > АВС_А) И (ТекСтр.СовокупныйПроцент <= (АВС_А + АВС_В)) Тогда //группа В
                        НЗ = ТабВ.Добавить();
                        НЗ.Номенклатура = ТекСтр.Номенклатура;
                        ТекСтр.ЗаписьОбработана = Истина;
                    КонецЕсли;
                КонецЕсли;
                
                Если НЕ ТекСтр.ЗаписьОбработана Тогда
                    Если (ТекСтр.СовокупныйПроцент > (100 - АВС_С))Тогда //группа С
                        НЗ = ТабС.Добавить();
                        НЗ.Номенклатура = ТекСтр.Номенклатура;
                        ТекСтр.ЗаписьОбработана = Истина;
                    КонецЕсли;
                КонецЕсли;
                
            КонецЦикла;
13 Ёпрст
 
23.08.21
11:25
(12) хрень какая то..
2 % - это группа А, а 99% - это группа  С ?
14 Ёпрст
 
23.08.21
11:26
ну и в группу B не попадает ничего