СвойствоОбъектаАнализаДанных.ВидСравнения

Свойства · ComparisonType

Тип: ВидСравнения. Содержит вид сравнения.

Полное описание, параметры и ограничения

СвойствоОбъектаАнализаДанных.ВидСравнения (DataAnalysisObjectProperty.ComparisonType)

СвойствоОбъектаАнализаДанных (DataAnalysisObjectProperty)

ВидСравнения (ComparisonType)

Доступен, начиная с версии 8.0.

Использование:
Только чтение.
Описание:
Тип: ВидСравнения.
Содержит вид сравнения.
Доступность:

Сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Разобрать ассоциации шести собственных корзин и получить настоящий прогноз для двух новых входов

Самодостаточный серверный модуль отделяет десять событий от шести транзакций, обучает поиск ассоциаций, показывает реальные частые группы и правила ЕСЛИ/ТО, выгружает их в дерево и применяет созданную модель к отдельному источнику. Ни состав рекомендаций, ни количество строк выхода заранее не подставляются.

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

Полный серверный общий модуль УчебныеСвоиАссоциации85 собственной пустой конфигурации; подготовка, разбор и модель включены. Не запускался в 1С.

Подготовка

  1. НОВАЯ отдельная пустая файловая база точно 8.5.1.1343: конфигурация УчебныеСвоиАссоциации85, совместимость Не использовать, Русский. Без прикладных объектов, расширений, подписок, заданий и рабочих данных; модули конфигурации вручную пустые. Не использовать БП/КА2/УТ/УНФ.

  2. Общие → Общие модули → УчебныеСвоиАссоциации85: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставить весь основной модуль. Будущая ручная подготовка: сохранить и обновить только свой стенд F7. Все функции подготовки и разбора включены.

  3. Создать собственную внешнюю обработку → управляемая Форма → команду/кнопку Выполнить с действием Выполнить. Весь отдельный модуль формы ниже вызывает только свой серверный общий модуль; на клиент возвращается текст, не объекты анализа.

  4. Таблица событий имеет Корзина/Товар. Четыре own-basket-1…4 содержат A+B, пятая только A, шестая только C: десять строк событий, шесть объектов, три различных вымышленных товара. Это не продажи, документы или рабочий справочник.

  5. Корзина — Объект, Товар — Элемент; обе колонки дискретные. ТипИсточникаДанных=Событийный. МинимальныйПроцентСлучаев=25 исключает одиночный C из частых сочетаний. МинимальнаяДостоверность/МинимальнаяЗначимость=0 специально не вводят дополнительный порог этих показателей в маленьком учебном опыте.

  6. ПоискПоИерархии=Ложь, ИгнорироватьНезаполненныеЗначения=Истина, ТипОтсеченияПравил=Избыточные. Числовые значения как товары не используются; настройки числовой интерпретации не придумываются. Достоверность вывода не переводится в проценты без подтвержденной единицы.

  7. Отдельный прогнозный источник создается заново: own-future-A содержит только A, own-future-C только C. Готовых следствий и вероятностей в источнике нет; для C отсутствие рекомендации допустимо.

Функция ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    События = СоздатьСвоиКорзины(Ложь);
    Анализатор = Новый АнализДанных;
    Анализатор.ТипАнализа = Тип("АнализДанныхПоискАссоциаций");
    Анализатор.ИсточникДанных = События;
    НастроитьСвоиРолиКорзины(Анализатор.НастройкаКолонок);
    НастроитьСвойПараметр(Анализатор.Параметры, "ТипИсточникаДанных", ТипИсточникаДанныхПоискаАссоциаций.Событийный);
    НастроитьСвойПараметр(Анализатор.Параметры, "МинимальныйПроцентСлучаев", 25);
    НастроитьСвойПараметр(Анализатор.Параметры, "МинимальнаяДостоверность", 0);
    НастроитьСвойПараметр(Анализатор.Параметры, "МинимальнаяЗначимость", 0);
    НастроитьСвойПараметр(Анализатор.Параметры, "ПоискПоИерархии", Ложь);
    НастроитьСвойПараметр(Анализатор.Параметры, "ИгнорироватьНезаполненныеЗначения", Истина);
    НастроитьСвойПараметр(Анализатор.Параметры, "ТипОтсеченияПравил", ТипОтсеченияПравилАссоциации.Избыточные);
    Результат = Анализатор.Выполнить();
    Если ТипЗнч(Результат) <> Тип("РезультатАнализаДанныхПоискАссоциаций") Или Результат.КоличествоОбъектов <> 6 Тогда
        ВызватьИсключение "Нужен настоящий результат по шести собственным корзинам, не по десяти строкам событий";
    КонецЕсли;
    НастроитьСвоиРолиКорзины(Результат.НастройкаКолонок, Истина);
    ПроверитьСвойПараметр(Результат.Параметры, "ТипИсточникаДанных", ТипИсточникаДанныхПоискаАссоциаций.Событийный);
    ПроверитьСвойПараметр(Результат.Параметры, "МинимальныйПроцентСлучаев", 25);
    ПроверитьСвойПараметр(Результат.Параметры, "МинимальнаяДостоверность", 0);
    Отчет = "СВОИ ВЫМЫШЛЕННЫЕ КОРЗИНЫ, НЕ РЕАЛЬНЫЕ РЕКОМЕНДАЦИИ" + Символы.ПС;
    Отчет = Отчет + "Строк событий=" + Строка(События.Количество()) + "; объектов-корзин=" + Строка(Результат.КоличествоОбъектов)
        + "; элементов по платформе=" + Строка(Результат.КоличествоЭлементов)
        + "; средний размер по платформе=" + Строка(Результат.СреднийРазмерОбъекта) + Символы.ПС;
    Группы = Результат.Группы;
    Если ТипЗнч(Группы) <> Тип("ФиксированныйМассив") Или Группы.Количество() > 128 Тогда
        ВызватьИсключение "Нужны настоящие небольшие группы собственного расчета";
    КонецЕсли;
    Отчет = Отчет + "Найдено групп=" + Строка(Группы.Количество()) + Символы.ПС;
    Для Каждого Группа Из Группы Цикл
        Если ТипЗнч(Группа) <> Тип("АссоциированнаяГруппа") Или Группа.КоличествоСлучаев < 0
            Или Группа.КоличествоСлучаев > 6 Или Группа.ПроцентСлучаев < 0 Или Группа.ПроцентСлучаев > 100 Тогда
            ВызватьИсключение "Некорректные случаи или процент настоящей своей группы";
        КонецЕсли;
        Отчет = Отчет + "Группа " + ОписатьСвойНаборТоваров(Группа.Элементы)
            + "; случаев=" + Строка(Группа.КоличествоСлучаев) + "; процент=" + Строка(Группа.ПроцентСлучаев) + Символы.ПС;
    КонецЦикла;
    Отчет = Отчет + ОписатьСвоиПравила(Результат.Правила);
    Дерево = Результат.ВыгрузитьПравила();
    Отчет = Отчет + ОписатьСвоеДеревоПравил(Дерево);
    Модель = Результат.СоздатьМодельПрогноза();
    Если ТипЗнч(Модель) <> Тип("МодельПрогнозаПоискАссоциаций") Тогда
        ВызватьИсключение "Не создана собственная настоящая модель ассоциаций";
    КонецЕсли;
    Отчет = Отчет + "ПРАВИЛА СОЗДАННОЙ МОДЕЛИ" + Символы.ПС + ОписатьСвоиПравила(Модель.Правила);
    НовыеКорзины = СоздатьСвоиКорзины(Истина);
    Модель.ИсточникДанных = НовыеКорзины;
    Если ТипЗнч(Модель.ИсточникДанных) <> Тип("ТаблицаЗначений") Или Модель.ИсточникДанных.Количество() <> 2 Тогда
        ВызватьИсключение "Нужен отдельный собственный источник двух новых одиночных корзин";
    КонецЕсли;
    Колонки = Модель.Колонки;
    Входы = Модель.НастройкаВходныхКолонок;
    Если ТипЗнч(Колонки) <> Тип("КолонкиМоделиПрогноза") Или ТипЗнч(Входы) <> Тип("НастройкаВходныхКолонокМоделиПрогноза")
        Или Входы.Количество() = 0 Или Входы.Количество() > 2 Тогда
        ВызватьИсключение "Нужны настоящие входные соответствия своей двухколоночной модели";
    КонецЕсли;
    Для Каждого Настройка Из Входы Цикл
        Имя = Настройка.КолонкаМоделиПрогноза.Имя;
        Если Имя <> "Корзина" И Имя <> "Товар" Тогда
            ВызватьИсключение "Модель требует непредусмотренное собственным источником поле " + Имя;
        КонецЕсли;
        СвязатьСвоюВходнуюКолонку(Входы, Колонки, Имя);
    КонецЦикла;
    Отчет = Отчет + ОписатьСвоиКолонки(Колонки);
    ИсточникКорзины = НайтиСвоюКолонку(Колонки, "Корзина", ТипКолонкиМоделиПрогноза.КолонкаИсточникаДанных);
    Следствие = НайтиСвоюКолонку(Колонки, "Следствие", ТипКолонкиМоделиПрогноза.Прогнозируемая);
    Достоверность = НайтиСвоюКолонку(Колонки, "Достоверность", ТипКолонкиМоделиПрогноза.Прогнозируемая);
    Выход = Модель.КолонкиРезультата;
    Если ТипЗнч(Выход) <> Тип("КолонкиРезультатаМоделиПрогноза") Тогда
        ВызватьИсключение "Нужна собственная реальная коллекция выхода ассоциаций";
    КонецЕсли;
    Выход.Очистить();
    КолонкаКорзины = Выход.Добавить(ИсточникКорзины);
    КолонкаКорзины.Имя = "УчебнаяКорзина";
    КолонкаСледствия = Выход.Добавить(Следствие);
    КолонкаСледствия.Имя = "УчебноеСледствие";
    КолонкаДостоверности = Выход.Добавить(Достоверность);
    КолонкаДостоверности.Имя = "УчебнаяДостоверность";
    Прогноз = Модель.Выполнить();
    Если ТипЗнч(Прогноз) <> Тип("ТаблицаЗначений") Или Прогноз.Количество() > 32 Или Прогноз.Колонки.Количество() <> 3 Тогда
        ВызватьИсключение "Нужна настоящая небольшая выходная таблица со своей схемой";
    КонецЕсли;
    Для Каждого Имя Из СтрРазделить("УчебнаяКорзина,УчебноеСледствие,УчебнаяДостоверность", ",") Цикл
        Если Прогноз.Колонки.Найти(Имя) = Неопределено Тогда
            ВызватьИсключение "Нет собственной выходной колонки " + Имя;
        КонецЕсли;
    КонецЦикла;
    Отчет = Отчет + "РЕКОМЕНДАЦИИ ПО ДВУМ НОВЫМ КОРЗИНАМ; строк=" + Строка(Прогноз.Количество()) + Символы.ПС;
    Для Каждого СтрокаПрогноза Из Прогноз Цикл
        Код = СтрокаПрогноза.УчебнаяКорзина;
        Если ТипЗнч(Код) <> Тип("Строка") Или НовыеКорзины.Найти(Код, "Корзина") = Неопределено Тогда
            ВызватьИсключение "Результат содержит чужую корзину";
        КонецЕсли;
        ЗначениеСледствия = СтрокаПрогноза.УчебноеСледствие;
        Если ТипЗнч(ЗначениеСледствия) = Тип("ОбъектАнализаДанных") Тогда
            ОписаниеСледствия = ОписатьСвойТовар(ЗначениеСледствия);
        Иначе
            ОписаниеСледствия = Строка(ЗначениеСледствия);
        КонецЕсли;
        Отчет = Отчет + Код + "; следствие=" + ОписаниеСледствия + "; тип следствия=" + Строка(ТипЗнч(ЗначениеСледствия))
            + "; достоверность как вернула платформа=" + Строка(СтрокаПрогноза.УчебнаяДостоверность)
            + "; тип достоверности=" + Строка(ТипЗнч(СтрокаПрогноза.УчебнаяДостоверность)) + Символы.ПС;
    КонецЦикла;
    Если События.Количество() <> 10 Или НовыеКорзины.Количество() <> 2 Тогда
        ВызватьИсключение "Изменились свои независимые таблицы памяти";
    КонецЕсли;
    Возврат Отчет + "Для C связь с другим товаром не заложена; отсутствие рекомендации допустимо. Не ожидается ровно две строки выхода";
КонецФункции

Функция СоздатьСвоиКорзины(ДляПрогноза)
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Корзина", Новый ОписаниеТипов("Строка"));
    Таблица.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
    Если ДляПрогноза Тогда
        ДобавитьСвойТовар(Таблица, "own-future-A", "A");
        ДобавитьСвойТовар(Таблица, "own-future-C", "C");
        Ожидается = 2;
    Иначе
        Для Номер = 1 По 4 Цикл
            Код = "own-basket-" + Строка(Номер);
            ДобавитьСвойТовар(Таблица, Код, "A");
            ДобавитьСвойТовар(Таблица, Код, "B");
        КонецЦикла;
        ДобавитьСвойТовар(Таблица, "own-basket-5", "A");
        ДобавитьСвойТовар(Таблица, "own-basket-6", "C");
        Ожидается = 10;
    КонецЕсли;
    Если Таблица.Количество() <> Ожидается Или Таблица.Колонки.Количество() <> 2 Тогда
        ВызватьИсключение "Нарушен размер собственного списка событий";
    КонецЕсли;
    Возврат Таблица;
КонецФункции

Процедура ДобавитьСвойТовар(Таблица, Код, Товар)
    СтрокаКорзины = Таблица.Добавить();
    СтрокаКорзины.Корзина = Код;
    СтрокаКорзины.Товар = Товар;
КонецПроцедуры

Процедура НастроитьСвоиРолиКорзины(Настройки, ТолькоПроверка = Ложь)
    Если ТипЗнч(Настройки) <> Тип("КолонкиАнализаДанных") Или Настройки.Количество() <> 2 Тогда
        ВызватьИсключение "Нужны две настоящие настройки Корзина и Товар";
    КонецЕсли;
    Корзина = Настройки.Найти("Корзина");
    Товар = Настройки.Найти("Товар");
    Если Корзина = Неопределено Или Товар = Неопределено Тогда
        ВызватьИсключение "Нет собственных настроек объект/элемент";
    КонецЕсли;
    Если Не ТолькоПроверка Тогда
        Корзина.ТипКолонки = ТипКолонкиАнализаДанныхПоискАссоциаций.Объект;
        Корзина.ВидДанных = ВидДанныхАнализа.Дискретные;
        Товар.ТипКолонки = ТипКолонкиАнализаДанныхПоискАссоциаций.Элемент;
        Товар.ВидДанных = ВидДанныхАнализа.Дискретные;
    КонецЕсли;
    Если Корзина.ТипКолонки <> ТипКолонкиАнализаДанныхПоискАссоциаций.Объект Или Товар.ТипКолонки <> ТипКолонкиАнализаДанныхПоискАссоциаций.Элемент
        Или Корзина.ВидДанных <> ВидДанныхАнализа.Дискретные Или Товар.ВидДанных <> ВидДанныхАнализа.Дискретные Тогда
        ВызватьИсключение "Перепутаны собственная корзина и товар события";
    КонецЕсли;
КонецПроцедуры

Функция ОписатьСвойТовар(Объект)
    Если ТипЗнч(Объект) <> Тип("ОбъектАнализаДанных") Тогда
        ВызватьИсключение "Нужен настоящий объект элемента группы или правила";
    КонецЕсли;
    Свойства = Новый Структура("Товар", Неопределено);
    ЗаполнитьЗначенияСвойств(Свойства, Объект);
    Описание = Свойства.Товар;
    Если ТипЗнч(Описание) <> Тип("СвойствоОбъектаАнализаДанных") Или Описание.Имя <> "Товар"
        Или Описание.ВидСравнения <> ВидСравнения.Равно Или ТипЗнч(Описание.Значение) <> Тип("Строка")
        Или (Описание.Значение <> "A" И Описание.Значение <> "B" И Описание.Значение <> "C") Тогда
        ВызватьИсключение "Элемент не описывает один из трех собственных товаров";
    КонецЕсли;
    Возврат Описание.Значение;
КонецФункции

Функция ОписатьСвойНаборТоваров(Элементы)
    Если ТипЗнч(Элементы) <> Тип("ФиксированныйМассив") Или Элементы.Количество() > 3 Тогда
        ВызватьИсключение "Нужен настоящий небольшой набор своих объектов анализа";
    КонецЕсли;
    Имена = Новый Массив;
    Для Каждого Элемент Из Элементы Цикл
        Имена.Добавить(ОписатьСвойТовар(Элемент));
    КонецЦикла;
    Возврат "[" + СтрСоединить(Имена, ", ") + "]";
КонецФункции

Функция ОписатьСвоиПравила(Правила)
    Если ТипЗнч(Правила) <> Тип("ФиксированныйМассив") Или Правила.Количество() > 128 Тогда
        ВызватьИсключение "Нужен настоящий небольшой набор своих правил";
    КонецЕсли;
    Отчет = "Найдено правил=" + Строка(Правила.Количество()) + Символы.ПС;
    Для Каждого Правило Из Правила Цикл
        Если ТипЗнч(Правило) <> Тип("ПравилоАссоциации") Или Правило.КоличествоСлучаев < 0 Или Правило.КоличествоСлучаев > 6
            Или Правило.ПроцентСлучаев < 0 Или Правило.ПроцентСлучаев > 100 Тогда
            ВызватьИсключение "Нужны настоящие правила по своим шести корзинам";
        КонецЕсли;
        Отчет = Отчет + "ЕСЛИ " + ОписатьСвойНаборТоваров(Правило.Предпосылка) + " ТО " + ОписатьСвойНаборТоваров(Правило.Следствие)
            + "; случаев=" + Строка(Правило.КоличествоСлучаев) + "; процент=" + Строка(Правило.ПроцентСлучаев)
            + "; достоверность=" + Строка(Правило.Достоверность) + "; значимость=" + Строка(Правило.Значимость) + Символы.ПС;
    КонецЦикла;
    Возврат Отчет;
КонецФункции

Функция ОписатьСвоеДеревоПравил(Дерево)
    Если ТипЗнч(Дерево) <> Тип("ДеревоЗначений") Или Дерево.Строки.Количество() > 128 Или Дерево.Колонки.Количество() > 32 Тогда
        ВызватьИсключение "Нужна настоящая небольшая выгрузка правил в дерево";
    КонецЕсли;
    Отчет = "ВЫГРУЗКА ПРАВИЛ: корневых строк=" + Строка(Дерево.Строки.Количество()) + Символы.ПС;
    Для Каждого Колонка Из Дерево.Колонки Цикл
        Отчет = Отчет + "Колонка выгрузки=" + Колонка.Имя + Символы.ПС;
    КонецЦикла;
    Для Каждого СтрокаДерева Из Дерево.Строки Цикл
        Для Каждого Колонка Из Дерево.Колонки Цикл
            Отчет = Отчет + Колонка.Имя + "=" + Строка(СтрокаДерева[Колонка.Имя]) + "; ";
        КонецЦикла;
        Отчет = Отчет + "дочерних строк=" + Строка(СтрокаДерева.Строки.Количество()) + Символы.ПС;
    КонецЦикла;
    Возврат Отчет;
КонецФункции

Функция НайтиСвойПараметр(Параметры, Имя)
    Параметр = Параметры.Найти(Имя);
    Если Параметр = Неопределено Или ТипЗнч(Параметр) <> Тип("ПараметрАнализаДанных") Тогда
        ВызватьИсключение "Не найден собственный параметр алгоритма " + Имя;
    КонецЕсли;
    Индекс = Параметры.Индекс(Параметр);
    Если Индекс < 0 Или Индекс >= Параметры.Количество() Тогда
        ВызватьИсключение "Индекс настоящего параметра выходит за границы";
    КонецЕсли;
    ПоИндексу = Параметры.Получить(Индекс);
    Если ПоИндексу.Имя <> Параметр.Имя Или ПоИндексу.Имя <> Имя Тогда
        ВызватьИсключение "Найти и Получить не вернули один собственный параметр";
    КонецЕсли;
    Возврат Параметр;
КонецФункции

Процедура НастроитьСвойПараметр(Параметры, Имя, Значение)
    Параметр = НайтиСвойПараметр(Параметры, Имя);
    Если Не Параметр.ТипЗначения.СодержитТип(ТипЗнч(Значение)) Тогда
        ВызватьИсключение "Тип значения не разрешен реальным параметром " + Имя;
    КонецЕсли;
    Параметр.Значение = Значение;
    ПроверитьСвойПараметр(Параметры, Имя, Значение);
КонецПроцедуры

Процедура ПроверитьСвойПараметр(Параметры, Имя, Эталон)
    Параметр = НайтиСвойПараметр(Параметры, Имя);
    Если ТипЗнч(Параметр.Значение) <> ТипЗнч(Эталон) Или Параметр.Значение <> Эталон Тогда
        ВызватьИсключение "Не совпал собственный параметр результата " + Имя;
    КонецЕсли;
КонецПроцедуры

Функция НайтиСвоюКолонку(Колонки, Имя, Вид)
    Колонка = Колонки.Найти(Имя, Вид);
    Если Колонка = Неопределено Или ТипЗнч(Колонка) <> Тип("КолонкаМоделиПрогноза") Тогда
        ВызватьИсключение "Нет настоящей колонки модели: " + Имя + "; вид=" + Строка(Вид);
    КонецЕсли;
    Если Колонка.Имя <> Имя Или Колонка.ТипКолонки <> Вид Тогда
        ВызватьИсключение "Найдена колонка с другим именем или ролью";
    КонецЕсли;
    Индекс = Колонки.Индекс(Колонка);
    Если Индекс < 0 Или Индекс >= Колонки.Количество() Тогда
        ВызватьИсключение "Индекс найденной колонки вне реальной коллекции";
    КонецЕсли;
    ПоИндексу = Колонки.Получить(Индекс);
    Если ПоИндексу.Имя <> Имя Тогда
        ВызватьИсключение "По индексу получено другое имя колонки";
    КонецЕсли;
    Возврат Колонка;
КонецФункции

Функция ОписатьСвоиКолонки(Колонки)
    Стек = Новый Массив;
    Для Каждого Колонка Из Колонки Цикл
        Стек.Добавить(Новый Структура("Колонка,Уровень", Колонка, 0));
    КонецЦикла;
    Обработано = 0;
    Отчет = "ДЕЙСТВИТЕЛЬНАЯ ИЕРАРХИЯ КОЛОНОК" + Символы.ПС;
    Пока Стек.Количество() > 0 Цикл
        Индекс = Стек.Количество() - 1;
        Кадр = Стек[Индекс];
        Стек.Удалить(Индекс);
        Если Кадр.Уровень > 16 Или Обработано >= 128 Тогда
            ВызватьИсключение "Своя диагностика превысила учебный предел 128 колонок или 16 уровней";
        КонецЕсли;
        Колонка = Кадр.Колонка;
        Если ТипЗнч(Колонка) <> Тип("КолонкаМоделиПрогноза") Тогда
            ВызватьИсключение "В иерархии нет настоящего описания колонки";
        КонецЕсли;
        Обработано = Обработано + 1;
        Отчет = Отчет + "Уровень=" + Строка(Кадр.Уровень) + "; имя=" + Колонка.Имя
            + "; путь=" + Колонка.ПутьКДанным + "; роль=" + Строка(Колонка.ТипКолонки)
            + "; тип дополнительных параметров=" + Строка(ТипЗнч(Колонка.ДополнительныеПараметры)) + Символы.ПС;
        Дети = Колонка.Колонки;
        Если ТипЗнч(Дети) <> Тип("ФиксированныйМассив") Тогда
            ВызватьИсключение "Вложенные описания должны быть настоящим фиксированным массивом";
        КонецЕсли;
        Для Каждого Дочерняя Из Дети Цикл
            Стек.Добавить(Новый Структура("Колонка,Уровень", Дочерняя, Кадр.Уровень + 1));
        КонецЦикла;
    КонецЦикла;
    Возврат Отчет;
КонецФункции

Процедура СвязатьСвоюВходнуюКолонку(Настройки, Колонки, Имя)
    Настройка = Настройки.Найти(Имя);
    Если Настройка = Неопределено Или ТипЗнч(Настройка) <> Тип("НастройкаВходнойКолонкиМоделиПрогноза") Тогда
        ВызватьИсключение "Не найдена настоящая настройка собственного входа " + Имя;
    КонецЕсли;
    Вход = НайтиСвоюКолонку(Колонки, Имя, ТипКолонкиМоделиПрогноза.Входная);
    Источник = НайтиСвоюКолонку(Колонки, Имя, ТипКолонкиМоделиПрогноза.КолонкаИсточникаДанных);
    Настройка.КолонкаМоделиПрогноза = Вход;
    Настройка.КолонкаИсточникаДанных = Источник;
    Если Настройка.КолонкаМоделиПрогноза.Имя <> Имя Или Настройка.КолонкаИсточникаДанных.Имя <> Имя Тогда
        ВызватьИсключение "Свое соответствие не сохранилось " + Имя;
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры
УчебныеСвоиАссоциации85.Обработка.Форма

Собственная внешняя обработка → управляемая Форма → Модуль

Полный клиент-серверный модуль своей формы; клиент получает только текст серверного расчета.

&НаКлиенте
Процедура Выполнить(Команда)
    Отчет = ВыполнитьНаСервере();
    Сообщить(Отчет);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
    Возврат УчебныеСвоиАссоциации85.ВыполнитьПример();
КонецФункции

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

  1. Собственный guard проверяет пустую конфигурацию до алгоритма. СоздатьСвоиКорзины строит типизированные таблицы только в памяти. Один объект-корзина состоит из нескольких событий: десять строк не означают десять транзакций.

  2. АнализДанных.ТипАнализа получает настоящий Тип("АнализДанныхПоискАссоциаций"). Роли Объект/Элемент и виды данных задаются реальным настройкам колонок. Параметры ищутся по установленным native-именам, тип значения проверяется до присваивания; ключевые настройки результата перечитываются.

  3. КоличествоОбъектов сопоставляется с шестью своими корзинами, КоличествоЭлементов и СреднийРазмерОбъекта выводятся фактически. В исходной таблице различны количество событий 10 и число товаров 3; неоднозначное слово «элементы» в короткой справке не заменяет проверку реального результата.

  4. Группы содержат настоящие АссоциированнаяГруппа. КоличествоСлучаев — число корзин, где группа встречается, а ПроцентСлучаев — процент. Элементы — фиксированный массив ОбъектАнализаДанных, не список готовых строк товара.

  5. ОписатьСвойТовар копирует пересечение имен в свою структуру и разбирает настоящее динамическое свойство Товар как СвойствоОбъектаАнализаДанных. Проверяются имя, сравнение Равно, строка и один из A/B/C. Объект источника readonly и не меняется.

  6. ПравилоАссоциации разделяет Предпосылка (ЕСЛИ) и Следствие (ТО); обе части — массивы объектов анализа. КоличествоСлучаев/ПроцентСлучаев показывают поддержку, Достоверность — условную вероятность, Значимость — отдельную native-характеристику. Последние два числа выводятся как вернула платформа, не объявляются автоматически процентами.

  7. ВыгрузитьПравила возвращает реальное ДеревоЗначений. Урок показывает действительные имена его колонок, значения корневых строк и количество детей, не угадывает схему выгрузки. Это текстовая диагностика дерева, не показ GUI и не запись файла.

  8. СоздатьМодельПрогноза вызывается у настоящего своего результата. Модель.Правила также разбирается тем же полным помощником; источник прогноза — отдельные новые корзины, не обучающая таблица.

  9. Существующие входные соответствия модели обходятся фактически. Допустимы только собственные Корзина/Товар; каждое реальное имя связывается с настоящими колонками Входная/КолонкаИсточникаДанных. Не создаем произвольную настройку или ожидаем безусловно два входа.

  10. Native-модель описывает прогнозируемые колонки Следствие и Достоверность. Их реальные дескрипторы и колонка источника Корзина добавляются в собственный выход: УчебнаяКорзина, УчебноеСледствие, УчебнаяДостоверность. Иерархия и пути выводятся фактически.

  11. Модель.Выполнить вызывается после настройки. Таблица выхода может иметь ноль, одну или несколько строк на собственную корзину: по правилам рекомендации отсутствуют или множественны. Не требуем одну строку на событие и не запрещаем повторный код корзины. Проверяем принадлежность каждого кода своему входу и свою схему колонок.

  12. Следствие разбирается как ОбъектАнализаДанных только при фактическом таком типе; иначе выводится значение и его реальный тип. Короткая модельная справка не объявляет точный тип ячейки. Достоверность также выводится с типом и без выдуманного коэффициента 100. Никаких заранее назначенных B или чисел вероятности нет.

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

  1. Будущий положительный опыт: отчет должен подтвердить шесть объектов и десять событий, реальные роли/параметры, найденные группы/правила, actual-дерево и actual-прогноз по двум новым кодам. Количество правил, порядок и строки рекомендаций не фиксируются статическими тестами.

  2. Ручной эталон собственной таблицы, не результат 1С: A встречается в 5 из 6 корзин, B в 4 из 6, C в 1 из 6, пара A+B в 4 из 6. Для направления A→B условная доля 4/5, для B→A 4/4. Это разные знаменатели; отсечение может убрать часть правил из конечного вывода.

  3. Будущий отрицательный контроль ролей: только присваивание Корзина.ТипКолонки заменить с Объект на Элемент. Независимая проверка ролей должна остановиться до анализа. Вернуть Объект.

  4. Будущий отрицательный контроль событий: только границу заполнения четырех корзин заменить с 4 на 3. Проверка собственной таблицы должна отвергнуть восемь вместо десяти событий до алгоритма. Вернуть 4.

  5. Будущий отрицательный контроль прогноза: сразу после Прогноз = Модель.Выполнить() временно присвоить Прогноз = Неопределено. Проверка типа должна остановиться до строк; затем вернуть полный исходник.

  6. runtimeVerifiedScenarios=0: 1С, BSL, алгоритм, модель, форма, база и прогноз здесь не запускались. Статические проверки не доказывают состав найденных правил и успешное выполнение native-модели. Все будущие ручные проверки — только собственный отдельный стенд.

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

Разобраны события/транзакции, реальные группы, обе части правил и показатели, собственное дерево и отдельный прогнозный источник. Модель действительно вызывается в полном коде; рекомендации и их количество не сфабрикованы.

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

  1. Ассоциация — наблюдаемая связь вымышленных товаров, а не причинность и не разрешение навязывать реальные покупки. Качество рекомендаций на реальных данных этим опытом не установлено.

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

  3. Нет обещания конкретного числа правил: пороги, отсечение и алгоритм влияют на результат. Пустой прогноз для корзины C допустим; результат не обязан повторять количество строк источника.

  4. У НастройкаВходныхКолонок проверяются реальные полученные имена. Если installed-модель потребует иное имя или роль, урок остановится с диагностикой до прогноза; это место требует будущей ручной проверки, а не заполнения неизвестных параметров.

  5. В native-описании модели не указан точный тип ячейки Следствие. Поэтому он не придумывается: факт типа проверяется, object-ветка разбирает descriptor, остальная ветка показывает значение/тип. Достоверность не масштабируется автоматически.

  6. Readonly свойства результатов, групп, правил и модели не присваиваются. Меняются только разрешенные настройки созданных объектов; источник, дерево и нормализованные карты не выдаются за рабочие данные.

  7. У КолонкиМоделиПрогноза.Получить противоречивый declared-тип; помощник использует только общее Имя возврата. Остальные свойства читаются у настоящего объекта Найти. Нет исправления native-справки на основании догадки.

  8. Нет запросов к конфигурациям пользователя, записей базы, файлов, сети, почты, печати и GUI расчетов. Собственная внешняя форма лишь получает текст своего сервера.

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

Обучить свое дерево на32 случаях и разобрать реальные классы, узлы и созданную модель

Полный серверный модуль создает собственную размеченную таблицу, назначает тип алгоритма и реальные параметры, получает результат и диагностирует все его свойства. Взвешенные классификации отделены от строк источника, дерево обходится без рекурсии, модель создается из результата без неизвестных объектов.

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

Полный серверный общий модуль УчебноеДеревоРешений85 собственной пустой конфигурации; отдельная управляемая форма получает только текст. В1С не выполнялся.

Подготовка

  1. НОВАЯ отдельная пустая файловая база точно8.5.1.1343. Имя конфигурации УчебноеДеревоРешений85, совместимость Не использовать, Русский. Нет прикладных объектов, общих реквизитов, расширений, подписок, заданий или рабочих данных; модули конфигурации вручную пустые. Не использовать БП/КА2/УТ/УНФ.

  2. Общие → Общие модули → УчебноеДеревоРешений85. Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставить весь основной модуль, включая функции подготовки, проверки, обхода и защиты стенда. Будущая ручная подготовка: сохранить и обновить только собственную базу F7.

  3. Собственная внешняя обработка УчебныйРасчетДерева85 → управляемая Форма → команда/кнопка Выполнить, действие Выполнить. Полный отдельный модуль формы ниже вызывает только собственный серверный общий модуль и получает текст отчета. Таблицы, алгоритм, узлы и модель на клиент не передаются.

  4. Код в памяти создает32 строки: восемь повторений остатков0,1,10,11 с уникальными own-case-кодами. РешениеПоПравилу=Нужно для остатка<5, иначе Достаточно. Это вымышленные метки, иллюстрирующие уже заданное учебное правило, а не данные реальных продаж/заказов.

  5. Код — НеИспользуемая колонка, Остаток — Входная с видом Непрерывные, РешениеПоПравилу — Прогнозируемая с видом Дискретные. МинимальноеКоличествоСлучаев1, МаксимальнаяГлубина4, ТипУпрощенияНеУпрощать. Имена параметров сверены с installed-справкой; их реально ищет созданный анализатор.

  6. Никакие строки1С, модели в базе, файлы, печатные документы или сетевые сервисы не подготавливать. Нет рабочего источника, обучения нейросети, отправки данных наружу или автоматической закупки. Вывод основан только на текущем маленьком объекте памяти.

Функция ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Таблица = СоздатьСвоиСлучаи();
    Анализатор = Новый АнализДанных;
    Анализатор.ТипАнализа = Тип("АнализДанныхДеревоРешений");
    Анализатор.ИсточникДанных = Таблица;
    НастроитьСвоиКолонки(Анализатор.НастройкаКолонок);
    НастроитьСвойПараметр(Анализатор.Параметры, "МинимальноеКоличествоСлучаев", 1);
    НастроитьСвойПараметр(Анализатор.Параметры, "МаксимальнаяГлубина", 4);
    НастроитьСвойПараметр(Анализатор.Параметры, "ТипУпрощения", ТипУпрощенияДереваРешений.НеУпрощать);
    Результат = Анализатор.Выполнить();
    Если ТипЗнч(Результат) <> Тип("РезультатАнализаДанныхДеревоРешений") Тогда
        ВызватьИсключение "Не получен настоящий результат своего дерева решений";
    КонецЕсли;
    Если Результат.КоличествоОбъектов <> Таблица.Количество() Или Результат.КоличествоКлассов <> 2
        Или Результат.КоличествоЛистьев < 1 Или Результат.КоличествоУзлов < Результат.КоличествоЛистьев
        Или Результат.Глубина < 0 Или Результат.Ошибка < 0 Или Результат.Ошибка > 100 Тогда
        ВызватьИсключение "Результат не согласован с собственными32 случаями и двумя метками";
    КонецЕсли;
    ПроверитьСвоиКолонкиРезультата(Результат.НастройкаКолонок);
    ПроверитьСвойПараметр(Результат.Параметры, "МинимальноеКоличествоСлучаев", 1);
    ПроверитьСвойПараметр(Результат.Параметры, "МаксимальнаяГлубина", 4);
    ПроверитьСвойПараметр(Результат.Параметры, "ТипУпрощения", ТипУпрощенияДереваРешений.НеУпрощать);
    Отчет = "СВОЙ УЧЕБНЫЙ РАСЧЕТ, НЕ ПРОГНОЗ РЕАЛЬНЫХ ЗАКУПОК" + Символы.ПС;
    Отчет = Отчет + "Объектов: " + Строка(Результат.КоличествоОбъектов) + "; классов: " + Строка(Результат.КоличествоКлассов) + Символы.ПС;
    Отчет = Отчет + "Узлов: " + Строка(Результат.КоличествоУзлов) + "; листьев: " + Строка(Результат.КоличествоЛистьев) + Символы.ПС;
    Отчет = Отчет + "Глубина по платформе: " + Строка(Результат.Глубина) + "; ошибка дерева в процентах: " + Строка(Результат.Ошибка) + Символы.ПС;
    Классификации = Результат.Классификации;
    Если ТипЗнч(Классификации) <> Тип("ФиксированныйМассив") Или Классификации.Количество() = 0 Тогда
        ВызватьИсключение "Нужен реальный непустой массив сгруппированных классификаций";
    КонецЕсли;
    ВсегоСлучаев = 0;
    Для Каждого Классификация Из Классификации Цикл
        Если ТипЗнч(Классификация) <> Тип("КлассификацияОбъектаАнализаДанных") Или Классификация.Количество < 0 Тогда
            ВызватьИсключение "Не получена настоящая классификация собственных случаев";
        КонецЕсли;
        Факт = ОписатьСвойКласс(Классификация.Факт);
        Прогноз = ОписатьСвойКласс(Классификация.Прогноз);
        ВсегоСлучаев = ВсегоСлучаев + Классификация.Количество;
        Отчет = Отчет + "Случаев: " + Строка(Классификация.Количество) + "; факт: " + Факт + "; прогноз: " + Прогноз + Символы.ПС;
    КонецЦикла;
    Если ВсегоСлучаев <> Таблица.Количество() Тогда
        ВызватьИсключение "Сумма количества случаев классификаций не равна32";
    КонецЕсли;
    Корни = Результат.КорневыеУзлы;
    СтатистикаУзлов = ОбойтиСвоиУзлы(Корни);
    Если СтатистикаУзлов.Узлов <> Результат.КоличествоУзлов Или СтатистикаУзлов.Листьев <> Результат.КоличествоЛистьев Тогда
        ВызватьИсключение "Независимый обход не совпал с числами узлов и листьев результата";
    КонецЕсли;
    Отчет = Отчет + СтатистикаУзлов.Отчет + Символы.ПС;
    Модель = Результат.СоздатьМодельПрогноза();
    Если ТипЗнч(Модель) <> Тип("МодельПрогнозаДеревоРешений") Тогда
        ВызватьИсключение "Результат не создал настоящий объект модели прогноза";
    КонецЕсли;
    КорниМодели = Модель.КорневыеУзлы;
    СтатистикаМодели = ОбойтиСвоиУзлы(КорниМодели);
    Если СтатистикаМодели.Узлов <> СтатистикаУзлов.Узлов Или СтатистикаМодели.Листьев <> СтатистикаУзлов.Листьев Тогда
        ВызватьИсключение "Модель и результат не согласованы по своей структуре дерева";
    КонецЕсли;
    Отчет = Отчет + "Модель действительно создана из собственного результата; ее корни обходятся. Прогноз на новых данных в этом уроке не выполнялся";
    Возврат Отчет;
КонецФункции

Функция СоздатьСвоиСлучаи()
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    Таблица.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число"));
    Таблица.Колонки.Добавить("РешениеПоПравилу", Новый ОписаниеТипов("Строка"));
    Остатки = Новый Массив;
    Остатки.Добавить(0);
    Остатки.Добавить(1);
    Остатки.Добавить(10);
    Остатки.Добавить(11);
    Для Повтор = 1 По 8 Цикл
        Для Каждого Остаток Из Остатки Цикл
            СтрокаСлучая = Таблица.Добавить();
            СтрокаСлучая.Код = "own-case-" + Строка(Повтор) + "-" + Строка(Остаток);
            СтрокаСлучая.Остаток = Остаток;
            СтрокаСлучая.РешениеПоПравилу = ?(Остаток < 5, "Нужно", "Достаточно");
        КонецЦикла;
    КонецЦикла;
    Если Таблица.Количество() <> 32 Тогда
        ВызватьИсключение "Нужны ровно32 собственных учебных случая";
    КонецЕсли;
    Возврат Таблица;
КонецФункции

Процедура НастроитьСвоиКолонки(Настройки)
    Код = Настройки.Найти("Код");
    Остаток = Настройки.Найти("Остаток");
    КолонкаРешения = Настройки.Найти("РешениеПоПравилу");
    Если Код = Неопределено Или Остаток = Неопределено Или КолонкаРешения = Неопределено Или Настройки.Количество() <> 3 Тогда
        ВызватьИсключение "Анализатор должен создать настройки трех собственных колонок";
    КонецЕсли;
    Код.ТипКолонки = ТипКолонкиАнализаДанныхДеревоРешений.НеИспользуемая;
    Остаток.ТипКолонки = ТипКолонкиАнализаДанныхДеревоРешений.Входная;
    Остаток.ВидДанных = ВидДанныхАнализа.Непрерывные;
    КолонкаРешения.ТипКолонки = ТипКолонкиАнализаДанныхДеревоРешений.Прогнозируемая;
    КолонкаРешения.ВидДанных = ВидДанныхАнализа.Дискретные;
    ПроверитьСвоиКолонкиРезультата(Настройки);
КонецПроцедуры

Процедура ПроверитьСвоиКолонкиРезультата(Настройки)
    Если ТипЗнч(Настройки) <> Тип("КолонкиАнализаДанных") Или Настройки.Количество() <> 3 Тогда
        ВызватьИсключение "Нужны настоящие три настройки колонок анализа";
    КонецЕсли;
    Код = Настройки.Найти("Код");
    Остаток = Настройки.Найти("Остаток");
    КолонкаРешения = Настройки.Найти("РешениеПоПравилу");
    Если Код = Неопределено Или Остаток = Неопределено Или КолонкаРешения = Неопределено Тогда
        ВызватьИсключение "Исчезла собственная колонка";
    КонецЕсли;
    Если Код.ТипКолонки <> ТипКолонкиАнализаДанныхДеревоРешений.НеИспользуемая
        Или Остаток.ТипКолонки <> ТипКолонкиАнализаДанныхДеревоРешений.Входная
        Или Остаток.ВидДанных <> ВидДанныхАнализа.Непрерывные
        Или КолонкаРешения.ТипКолонки <> ТипКолонкиАнализаДанныхДеревоРешений.Прогнозируемая
        Или КолонкаРешения.ВидДанных <> ВидДанныхАнализа.Дискретные Тогда
        ВызватьИсключение "Перепутаны ключ, числовой вход или собственная метка класса";
    КонецЕсли;
КонецПроцедуры

Функция НайтиСвойПараметр(Параметры, Имя)
    Параметр = Параметры.Найти(Имя);
    Если Параметр = Неопределено Или ТипЗнч(Параметр) <> Тип("ПараметрАнализаДанных") Тогда
        ВызватьИсключение "Не найден собственный параметр алгоритма " + Имя;
    КонецЕсли;
    Индекс = Параметры.Индекс(Параметр);
    Если Индекс < 0 Или Индекс >= Параметры.Количество() Тогда
        ВызватьИсключение "Индекс настоящего параметра выходит за границы";
    КонецЕсли;
    ПоИндексу = Параметры.Получить(Индекс);
    Если ПоИндексу.Имя <> Параметр.Имя Или ПоИндексу.Имя <> Имя Тогда
        ВызватьИсключение "Найти и Получить не вернули один собственный параметр";
    КонецЕсли;
    Возврат Параметр;
КонецФункции

Процедура НастроитьСвойПараметр(Параметры, Имя, Значение)
    Параметр = НайтиСвойПараметр(Параметры, Имя);
    Если Не Параметр.ТипЗначения.СодержитТип(ТипЗнч(Значение)) Тогда
        ВызватьИсключение "Тип значения не разрешен реальным параметром " + Имя;
    КонецЕсли;
    Параметр.Значение = Значение;
    ПроверитьСвойПараметр(Параметры, Имя, Значение);
КонецПроцедуры

Процедура ПроверитьСвойПараметр(Параметры, Имя, Эталон)
    Параметр = НайтиСвойПараметр(Параметры, Имя);
    Если ТипЗнч(Параметр.Значение) <> ТипЗнч(Эталон) Или Параметр.Значение <> Эталон Тогда
        ВызватьИсключение "Не совпал собственный параметр результата " + Имя;
    КонецЕсли;
КонецПроцедуры

Функция ОписатьСвоеСвойство(Описание)
    Если ТипЗнч(Описание) <> Тип("СвойствоОбъектаАнализаДанных") Тогда
        ВызватьИсключение "Нужно реальное описание значения или условия собственного анализа";
    КонецЕсли;
    Возврат Описание.Имя + "; сравнение=" + Строка(Описание.ВидСравнения)
        + "; значение=" + Строка(Описание.Значение) + "; с=" + Строка(Описание.ЗначениеС) + "; по=" + Строка(Описание.ЗначениеПо);
КонецФункции

Функция ОписатьСвойКласс(Класс)
    Если ТипЗнч(Класс) <> Тип("ОбъектАнализаДанных") Тогда
        ВызватьИсключение "Нужен реальный объект факта, прогноза или решения";
    КонецЕсли;
    Свойства = Новый Структура("РешениеПоПравилу", Неопределено);
    ЗаполнитьЗначенияСвойств(Свойства, Класс);
    Описание = Свойства.РешениеПоПравилу;
    Если Описание = Неопределено Тогда
        ВызватьИсключение "У собственного класса отсутствует единственная прогнозируемая колонка";
    КонецЕсли;
    Если ТипЗнч(Описание) <> Тип("СвойствоОбъектаАнализаДанных") Или Описание.Имя <> "РешениеПоПравилу"
        Или Описание.ВидСравнения <> ВидСравнения.Равно
        Или ТипЗнч(Описание.Значение) <> Тип("Строка")
        Или (Описание.Значение <> "Нужно" И Описание.Значение <> "Достаточно") Тогда
        ВызватьИсключение "Факт или прогноз не описывает собственную метку класса";
    КонецЕсли;
    Возврат ОписатьСвоеСвойство(Описание);
КонецФункции

Функция ОписатьСвоеРешение(Решение)
    Если ТипЗнч(Решение) <> Тип("РешениеАнализаДанных") Или Решение.КоличествоСлучаев < 0 Тогда
        ВызватьИсключение "Нужно настоящее возможное решение собственного узла";
    КонецЕсли;
    Возврат ОписатьСвойКласс(Решение.Решение) + "; правильных случаев=" + Строка(Решение.КоличествоСлучаев)
        + "; вероятность как вернула платформа=" + Строка(Решение.Вероятность);
КонецФункции

Функция ОбойтиСвоиУзлы(Корни)
    Если ТипЗнч(Корни) <> Тип("ФиксированныйМассив") Или Корни.Количество() = 0 Тогда
        ВызватьИсключение "Нужны настоящие непустые корни собственного результата или модели";
    КонецЕсли;
    Стек = Новый Массив;
    Для Каждого Корень Из Корни Цикл
        Стек.Добавить(Новый Структура("Узел,Уровень", Корень, 0));
    КонецЦикла;
    КоличествоУзлов = 0;
    КоличествоЛистьев = 0;
    Отчет = "ОБХОД СОБСТВЕННЫХ УЗЛОВ" + Символы.ПС;
    Пока Стек.Количество() > 0 Цикл
        Индекс = Стек.Количество() - 1;
        Кадр = Стек[Индекс];
        Стек.Удалить(Индекс);
        Узел = Кадр.Узел;
        Если ТипЗнч(Узел) <> Тип("УзелДереваРешений") Или Кадр.Уровень > 64 Или КоличествоУзлов >= 128 Тогда
            ВызватьИсключение "Свой маленький обход вышел за допустимые учебные границы";
        КонецЕсли;
        КоличествоУзлов = КоличествоУзлов + 1;
        Отчет = Отчет + "Узел=" + Строка(КоличествоУзлов) + "; уровень обхода=" + Строка(Кадр.Уровень)
            + "; попало случаев=" + Строка(Узел.КоличествоСлучаев) + Символы.ПС;
        Условие = Узел.Условие;
        Если Условие <> Неопределено Тогда
            Если ТипЗнч(Условие) <> Тип("ОбъектАнализаДанных") Тогда
                ВызватьИсключение "Узел не вернул документированный объект условия";
            КонецЕсли;
            Свойства = Новый Структура("Остаток", Неопределено);
            ЗаполнитьЗначенияСвойств(Свойства, Условие);
            Если Свойства.Остаток <> Неопределено Тогда
                Отчет = Отчет + "Условие своего числового входа: " + ОписатьСвоеСвойство(Свойства.Остаток) + Символы.ПС;
            Иначе
                Отчет = Отчет + "У этого узла нет описания условия по Остаток; выдуманная граница не подставлялась" + Символы.ПС;
            КонецЕсли;
        КонецЕсли;
        Отчет = Отчет + "Лучшее решение: " + ОписатьСвоеРешение(Узел.Решение) + Символы.ПС;
        ВсеРешения = Узел.ВсеРешения;
        Если ТипЗнч(ВсеРешения) <> Тип("ФиксированныйМассив") Тогда
            ВызватьИсключение "Нужен настоящий массив возможных решений узла";
        КонецЕсли;
        Для Каждого Возможное Из ВсеРешения Цикл
            Отчет = Отчет + "Возможное решение: " + ОписатьСвоеРешение(Возможное) + Символы.ПС;
        КонецЦикла;
        Дети = Узел.Узлы;
        Если ТипЗнч(Дети) <> Тип("ФиксированныйМассив") Тогда
            ВызватьИсключение "Нужен настоящий массив вложенных узлов";
        КонецЕсли;
        Если Дети.Количество() = 0 Тогда
            КоличествоЛистьев = КоличествоЛистьев + 1;
        Иначе
            Для Каждого Дочерний Из Дети Цикл
                Стек.Добавить(Новый Структура("Узел,Уровень", Дочерний, Кадр.Уровень + 1));
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    Возврат Новый Структура("Узлов,Листьев,Отчет", КоличествоУзлов, КоличествоЛистьев, Отчет);
КонецФункции

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры
УчебныйРасчетДерева85.Форма

Собственная внешняя обработка → управляемая Форма → Модуль

Полный клиент-серверный модуль формы, не клиентский расчет анализа данных.

&НаКлиенте
Процедура Выполнить(Команда)
    Отчет = ВыполнитьНаСервере();
    Сообщить(Отчет);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
    Возврат УчебноеДеревоРешений85.ВыполнитьПример();
КонецФункции

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

  1. Серверный guard проверяет отсутствие прикладных объектов, расширений и активной транзакции. СоздатьСвоиСлучаи возвращает реальную ТаблицаЗначений с32 явно размеченными строками, а не неизвестный Источник.

  2. ТипАнализа — значение Тип("АнализДанныхДеревоРешений"), не строка или выдуманное перечисление. После назначения источника появляются реальные настройки колонок. Каждое Найти проверяется, три роли и два вида данных задаются и перечитываются.

  3. Параметры создаются самим алгоритмом. НайтиСвойПараметр подтверждает настоящий ПараметрАнализаДанных, получает Индекс, проверяет границы и перечитывает его через Получить. ТипЗначения.СодержитТип проверяется до присваивания Значение; после расчета те же значения и типы сверяются через Результат.Параметры.

  4. Выполнить возвращает настоящий РезультатАнализаДанныхДеревоРешений. КоличествоОбъектов сопоставляется с32 строками, КоличествоКлассов с двумя собственными метками; глубина, узлы, листья и ошибка выводятся фактически. Не обещается конкретная граница разделения, размер дерева или нулевая ошибка.

  5. Классификации — ФиксированныйМассив сгруппированных пар Факт/Прогноз. Количество каждого элемента — вес случаев этой классификации. Складываем веса и сверяем с32, а не требуем32 элементов массива. Факт и Прогноз имеют тип ОбъектАнализаДанных, их динамическое свойство РешениеПоПравилу содержит отдельное СвойствоОбъектаАнализаДанных, не голую строку.

  6. В собственную Структура копируется только совпадающее имя свойства без явного СписокСвойств. Поэтому у корневого условия без Остаток структура остается с Неопределено, а отсутствие не скрывается универсальным Попытка. Классовая метка обязательна; имя, сравнениеРавно, строковый тип и два допустимых значения проверяются.

  7. ОписатьСвоеСвойство показывает настоящее Имя, ВидСравнения, Значение, ЗначениеС и ЗначениеПо. У равенства границы не выдаются за смысл сравнения; у числового условия диагностируются фактические значения интервала без выдуманного правила включения/исключения концов.

  8. КорневыеУзлы обходятся собственным стеком Массив, без рекурсивного роста стека вызовов. Для каждого настоящего УзелДереваРешений используются количество случаев, условие, лучшее и все решения, дочерние узлы. Лист определяется отсутствием детей. Учебные ограничения128 узлов/64 уровня предотвращают неограниченный диагностический обход.

  9. РешениеАнализаДанных содержит число верных случаев, вероятность и отдельный ОбъектАнализаДанных класса. Вероятность выводится как вернула платформа: без неподтвержденного умножения на100. Только Результат.Ошибка прямо объявлена в справке процентами.

  10. Числа узлов и листьев вычисляются независимо обходом и сверяются с результатом. Уровень собственного обхода начинается с0; его нельзя автоматически приравнивать к Глубина по платформе без знания соглашения о нумерации.

  11. СоздатьМодельПрогноза вызывается именно у собственного результата. Реальная МодельПрогнозаДеревоРешений используется: ее КорневыеУзлы также обходятся и сопоставляются с результатом. Это создание и проверка структуры, не уже выполненный прогноз на новых данных.

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

  1. Будущий результат:32 объектов и2 класса, действительные параметры1/4/НеУпрощать, отчет по сгруппированным факт/прогноз и реальным узлам. Сумма весов классификаций32; независимые числа узлов/листьев совпадают с результатом и созданной моделью. Значения глубины, ошибки и вероятностей не подставляются вручную.

  2. Будущий отрицательный контроль данных: в СоздатьСвоиСлучаи заменить число повторений8 на7. Проверка собственного источника должна отклонить28 вместо32 до выполнения алгоритма. Вернуть8 после опыта.

  3. Будущий отрицательный контроль ролей: только в НастроитьСвоиКолонки заменить роль Остаток сВходная наНеИспользуемая. ПроверитьСвоиКолонкиРезультата должен отвергнуть схему до расчета. Эталон проверяющей процедуры не изменять, затем вернуть исходную роль.

  4. Будущий отрицательный контроль результата: только сразу после Результат = Анализатор.Выполнить() присвоить Результат = Неопределено. Проверка точного native-типа должна остановиться до readonly-чтений. Затем вернуть полный исходный код.

  5. runtimeVerifiedScenarios=0: алгоритм, модель, BSL, форма и база1С здесь не запускались. Статические проверки не являются доказательством построенного дерева, качества прогноза или успешного обучения. Описан будущий опыт только собственной пустой базы.

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

Собственный полный учебный конвейер связывает реальные данные памяти, параметры, результат, группировки, граф дерева и созданную модель; все диагностические числа берутся из полученных объектов.

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

  1. У результатов, классификаций, узлов, решений и описаний свойств нет используемых здесь конструкторов. Они получены из настоящего анализа; readonly-свойствам ничего не присваивается. Не подменять их фиктивными Структура с похожими именами.

  2. Учебные метки построены известным правилом по тому же Остаток. Разбор классификаций на обучающем источнике не доказывает обобщение на новых данных и не заменяет отдельную контрольную выборку. Для реальной закупки требуются реальные правила, данные и разрешение.

  3. Количество элементов Классификации не равно автоматически КоличествоОбъектов. У одного элемента может быть несколько случаев; код проверяет сумму именно весов.

  4. Корень может не иметь свойства условия по Остаток; это не разрешение придумать границу. ЗаполнитьЗначенияСвойств без явного списка копирует пересечение имен только в собственную структуру памяти. readonly-объект источника не меняется.

  5. ЗначениеС/ЗначениеПо относятся к описанию интервала; не использовать их как готовое число класса и не угадывать включенность концов. Вероятность решения и процентная Ошибка результата — разные показатели; формат не меняет их математический смысл.

  6. МаксимальнаяГлубина4 — настройка алгоритма, Уровень0 собственного обхода — счетчик программы. Точная структура дерева и соглашение о глубине требуют будущего реального исполнения, не обещаются по статическим тестам.

  7. В этом уроке модель не получает новый ИсточникДанных и не выполняет прогноз. Ее тип и КорневыеУзлы привязаны к реальному созданию/обходу; остальные API модели должны изучаться отдельным полным прогнозным сценарием, а не чужими формальными target-привязками.

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

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

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

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

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