Посчитать регионы и отличить моду от средней суммы

Учебные задачи

У трёх вымышленных заказов регион Север, у одного Юг. Читаем частоты и доли, не выдумывая порядок строк таблицы результата.

Где и как запускать

Полный модуль управляемой формы собственной внешней обработки, только толстый клиент Windows.

Подготовка

  1. Собственная учебная база 8.5.1.1343, толстый клиент Windows. Создайте внешнюю обработку с управляемой формой, командой Выполнить и её кнопкой. Вставьте весь модуль выбранного урока.

  2. Методы построителя отчёта доступны только толстому клиенту, хотя сам тип упомянут и в других контекстах. Не переносите этот полный модуль в тонкий/веб-клиент или серверный обработчик.

  3. Для отдельного урока АнализДанных без построителя используется собственный серверный общий модуль УчебнаяСтатистика с флагом Сервер и вызов УчебнаяСтатистика.ВыполнитьПример() из серверной команды.

  4. Все значения вымышлены и создаются в памяти. Нет чтения документов/платежей, сетевых моделей, персональных данных, записи базы, сохранения файлов или печати.

  5. Это учебный расчёт на маленьком наборе. Он не даёт основания прогнозировать реальные продажи или принимать бизнес-решения без проверки качества исходных данных.

&НаКлиенте
Процедура Выполнить(Команда)
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    Таблица.Колонки.Добавить("Регион", Новый ОписаниеТипов("Строка"));
    Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
    Для Номер = 1 По 4 Цикл
        СтрокаТаблицы = Таблица.Добавить();
        СтрокаТаблицы.Код = "guide-order-" + Строка(Номер);
        СтрокаТаблицы.Регион = ?(Номер = 4, "Юг", "Север");
        СтрокаТаблицы.Сумма = Номер * 100;
    КонецЦикла;
    Построитель = Новый ПостроительОтчетаАнализаДанных;
    Построитель.ТипАнализа = Тип("АнализДанныхОбщаяСтатистика");
    Построитель.ИсточникДанных = Таблица;
    Построитель.ОтображатьСостояние = Ложь;
    Построитель.ОбрабатыватьПрерываниеПользователя = Истина;
    Анализатор = Построитель.ПолучитьАнализ();
    Если ТипЗнч(Анализатор) <> Тип("АнализДанных") Тогда
        ВызватьИсключение "Ожидался документированный анализатор построителя";
    КонецЕсли;
    Настройки = Построитель.НастройкаКолонок;
    Код = Настройки.Найти("Код");
    Регион = Настройки.Найти("Регион");
    Сумма = Настройки.Найти("Сумма");
    Если Код = Неопределено ИЛИ Регион = Неопределено ИЛИ Сумма = Неопределено Тогда
        ВызватьИсключение "Анализатор не создал ожидаемые три настройки собственных колонок";
    КонецЕсли;
    Код.ТипКолонки = ТипКолонкиАнализаДанныхОбщаяСтатистика.Неиспользуемая;
    Регион.ТипКолонки = ТипКолонкиАнализаДанныхОбщаяСтатистика.Входная;
    Регион.ВидДанных = ВидДанныхАнализа.Дискретные;
    Сумма.ТипКолонки = ТипКолонкиАнализаДанныхОбщаяСтатистика.Входная;
    Сумма.ВидДанных = ВидДанныхАнализа.Непрерывные;
    Построитель.Выполнить();
    Результат = Построитель.Результат;
    Если ТипЗнч(Результат) <> Тип("РезультатАнализаДанныхОбщаяСтатистика") Тогда
        ВызватьИсключение "Ожидался результат общей статистики";
    КонецЕсли;
    ПолеРегиона = Неопределено;
    Для Каждого Поле Из Результат.ДискретныеПоля Цикл
        Если Поле.Имя = "Регион" Тогда
            ПолеРегиона = Поле;
        КонецЕсли;
    КонецЦикла;
    Если ПолеРегиона = Неопределено Тогда
        ВызватьИсключение "Регион не попал в дискретные поля";
    КонецЕсли;
    Сообщить(ПолеРегиона.Количество = 4);
    Сообщить(ПолеРегиона.КоличествоУникальных = 2);
    Сообщить(ПолеРегиона.Мода = "Север");
    Частоты = ПолеРегиона.ТаблицаЧастот;
    Сообщить(Частоты.Количество() = 2);
    ИмяЗначения = ИмяУчебнойКолонки(Частоты, "Значение", "Value");
    ИмяЧастоты = ИмяУчебнойКолонки(Частоты, "Частота", "Frequency");
    ИмяОтносительной = ИмяУчебнойКолонки(Частоты, "ОтносительнаяЧастота", "RelativeFrequency");
    ИмяНакопленной = ИмяУчебнойКолонки(Частоты, "НакопленнаяЧастота", "CumulativeFrequency");
    ИмяНакопленнойОтносительной = ИмяУчебнойКолонки(Частоты, "НакопленнаяОтносительнаяЧастота", "CumulativeRelativeFrequency");
    СуммаЧастот = 0;
    СуммаДолей = 0;
    Для Каждого СтрокаЧастоты Из Частоты Цикл
        Категория = СтрокаЧастоты[ИмяЗначения];
        Частота = СтрокаЧастоты[ИмяЧастоты];
        Доля = СтрокаЧастоты[ИмяОтносительной];
        Если Категория = "Север" Тогда
            Сообщить(Частота = 3 И Доля = 0.75);
        ИначеЕсли Категория = "Юг" Тогда
            Сообщить(Частота = 1 И Доля = 0.25);
        Иначе
            ВызватьИсключение "Неожиданная категория собственной таблицы";
        КонецЕсли;
        СуммаЧастот = СуммаЧастот + Частота;
        СуммаДолей = СуммаДолей + Доля;
        Сообщить(СтрШаблон("%1: накоплено=%2; накопленная доля=%3", Категория, СтрокаЧастоты[ИмяНакопленной], СтрокаЧастоты[ИмяНакопленнойОтносительной]));
    КонецЦикла;
    Сообщить(СуммаЧастот = 4);
    Сообщить(СуммаДолей = 1);
КонецПроцедуры

&НаКлиенте
Функция ИмяУчебнойКолонки(Таблица, Русское, Английское)
    Колонка = Таблица.Колонки.Найти(Русское);
    Если Колонка = Неопределено Тогда
        Колонка = Таблица.Колонки.Найти(Английское);
    КонецЕсли;
    Если Колонка = Неопределено Тогда
        ВызватьИсключение "В документированной таблице частот нет колонки " + Русское;
    КонецЕсли;
    Возврат Колонка.Имя;
КонецФункции

Разбор по шагам

  1. ДискретныеПоля содержат описания категориальных колонок. Ищем Регион по имени, не по случайному индексу результата.

  2. Количество значений=4, уникальных регионов=2, мода=Север. Для этих данных максимум частоты единственный, поэтому нет неоднозначной моды.

  3. ТаблицаЧастот содержит документированные пять колонок. Вспомогательная функция допускает русское/английское имя и останавливает урок при отсутствии колонки.

  4. Север имеет частоту 3 и долю 0.75, Юг — 1 и 0.25. Сумма частот=4, сумма обычных долей=1.

  5. Накопленные частоты выводятся в фактическом порядке платформы. Их не складываем как обычные частоты и не обещаем, какой регион окажется первым.

Как проверить результат

  1. Восемь сравнений ожидаются Истина; две подписанные строки накопленных значений диагностические.

  2. В итоговом отчёте частоты 3/1, доли 75%/25%. Мода региона не является средним арифметическим сумм.

Ожидаемый результат

Показаны частота, доля, накопление, уникальные значения и единственная мода на собственных категориях.

На что обратить внимание

  1. Не складывать накопленные частоты, чтобы получить общее число строк: тогда возникает двойной счёт.

  2. При равной максимальной частоте нескольких категорий требуется отдельно проверить контракт моды; этот набор выбран без такой неоднозначности.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.