Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Попытка создания отчета с АВС-анализом

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

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

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

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

                    НЗ = ТабА.Добавить();
                    НЗ.Номенклатура = ТекСтр.Номенклатура;
                    ТекСтр.ЗаписьОбработана = Истина;
                КонецЕсли;
                
                Если НЕ ТекСтр.ЗаписьОбработана Тогда
                    Если ТабА.Количество() = 0 Тогда
                        НЗ = ТабА.Добавить();
                        НЗ.Номенклатура = ТекСтр.Номенклатура;
                        ТекСтр.ЗаписьОбработана = Истина;
                    КонецЕсли;
                КонецЕсли;
                
                Если НЕ ТекСтр.ЗаписьОбработана Тогда
                    Если (ТекСтр.СовокупныйПроцент > АВС_А) И (ТекСтр.СовокупныйПроцент <= (АВС_А + АВС_В)) Тогда//группа В

                        НЗ = ТабВ.Добавить();
                        НЗ.Номенклатура = ТекСтр.Номенклатура;
                        ТекСтр.ЗаписьОбработана = Истина;
                    КонецЕсли;
                КонецЕсли;
                
                Если НЕ ТекСтр.ЗаписьОбработана Тогда
                    Если (ТекСтр.СовокупныйПроцент > (100 - АВС_С))Тогда//группа С

                        НЗ = ТабС.Добавить();
                        НЗ.Номенклатура = ТекСтр.Номенклатура;
                        ТекСтр.ЗаписьОбработана = Истина;
                    КонецЕсли;
                КонецЕсли;
                
            КонецЦикла;
   Ёпрст
 
13 - 23.08.21 - 11:25
(12) хрень какая то..
2 % - это группа А, а 99% - это группа  С ?
   Ёпрст
 
14 - 23.08.21 - 11:26
ну и в группу B не попадает ничего

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.