http://www.forum.mista.ru/topic.php?id=755632 Нашла эту статью. Похоже мне нужна Классификация АВС. Есть такая встроенная функция СКД? Не подскажите её описание? и с какого релиза платформы она появилась?
Функция ABCКлассификация(Данные) Экспорт
Перем ТаблицаЗначений;
Если Данные = Null Тогда
Возврат Null;
КонецЕсли;
Если ТипЗнч(Данные) <> Тип("ДанныеГрупповойОбработкиКомпоновкиДанных") Тогда
Сообщить(ТипЗнч(Данные));
ВызватьИсключение "В функцию ABCКлассификация() можно передавать только объект типа ДанныеГрупповойОбработкиКомпоновкиДанных";
КонецЕсли;
Если Не Данные.ВременныеДанныеОбработки.Свойство("ABCКлассификацияТаблицаЗначений", ТаблицаЗначений) Тогда
// выполним расчет классификации один раз при первом вызове
// а потом запомним выполненный расчет и дальше будем этот
// расчет использовать
ТаблицаЗначений = Данные.Данные.Скопировать();
ТаблицаЗначений.Колонки.Добавить("Номер", Новый ОписаниеТипов("Число"));
Номер = 0;
ОбщаяСумма = 0;
Для Каждого СтрокаТаблицыЗначений Из ТаблицаЗначений Цикл
СтрокаТаблицыЗначений.Номер = Номер;
Номер = Номер + 1;
Если СтрокаТаблицыЗначений[0] <> NULL Тогда
ОбщаяСумма = ОбщаяСумма + СтрокаТаблицыЗначений[0];
КонецЕсли;
КонецЦикла;
ТаблицаЗначений.Сортировать(ТаблицаЗначений.Колонки[0].Имя + " Убыв");
ТаблицаЗначений.Индексы.Добавить("Номер");
НакопленнаяСумма = 0;
ИндексКлассаA = Неопределено;
ИндексКлассаB = Неопределено;
Для Каждого СтрокаТаблицыЗначений Из ТаблицаЗначений Цикл
Если СтрокаТаблицыЗначений[0] <> NULL Тогда
НакопленнаяСумма = НакопленнаяСумма + СтрокаТаблицыЗначений[0];
КонецЕсли;
Если ОбщаяСумма = 0 Тогда
Процент = 1;
Иначе
Процент = НакопленнаяСумма / ОбщаяСумма;
КонецЕсли;
Если Процент > 0.75 Тогда
Если ИндексКлассаA = Неопределено Тогда
ИндексКлассаA = ТаблицаЗначений.Индекс(СтрокаТаблицыЗначений);
ИначеЕсли Процент > 0.90 Тогда
Если ИндексКлассаB = Неопределено Тогда
ИндексКлассаB = ТаблицаЗначений.Индекс(СтрокаТаблицыЗначений);
КонецЕсли;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Данные.ВременныеДанныеОбработки.Вставить("ABCКлассификацияТаблицаЗначений", ТаблицаЗначений);
Данные.ВременныеДанныеОбработки.Вставить("ABCКлассификацияИндексКлассаA", ИндексКлассаA);
Данные.ВременныеДанныеОбработки.Вставить("ABCКлассификацияИндексКлассаB", ИндексКлассаB);
КонецЕсли;
Если Данные.ТекущийЭлемент = Неопределено Тогда
// Итог по группировке.
Возврат Null;
Иначе
Строка = ТаблицаЗначений.Найти(Данные.Данные.Индекс(Данные.ТекущийЭлемент), "Номер");
Если Строка = Неопределено Тогда
Возврат Null;
Иначе
Индекс = ТаблицаЗначений.Индекс(Строка);
Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда
Возврат 1;
ИначеЕсли Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаB Тогда
Возврат 2;
Иначе
Возврат 3;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецФункции
В выражении компоновки для получения класса можно использовать следующее выражение (например, в ресурсе или пользовательском поле):
ABCКлассификация(ГрупповаяОбработка("Сумма(СуммаОборот)"))