Устанавливает колонку в указанную позицию.
Синтаксис
Установить(<Колонка>, <Позиция>)Полное описание, параметры и ограничения
КолонкиРезультатаМоделиПрогноза.Установить (PredictionModelResultColumns.Set)
КолонкиРезультатаМоделиПрогноза (PredictionModelResultColumns)
Установить (Set)
Доступен, начиная с версии 8.0.
Синтаксис:
Установить(<Колонка>, <Позиция>)
Параметры:
<Колонка> (обязательный)
Тип: КолонкаРезультатаМоделиПрогноза.
Устанавливаемая колонка.
<Позиция> (обязательный)
Тип: Число.
Позиция, в которую необходимо вставить колонку.
Описание:
Устанавливает колонку в указанную позицию.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Получить прогноз для четырех своих новых кодов: входные соответствия, схема выхода и настоящий расчет
Самодостаточный серверный учебный конвейер заново обучает собственную модель, создает отдельную таблицу без готовых меток, связывает Остаток с ВходнойОстаток, редактирует реальные выходные настройки и выполняет прогноз. Полученные значения и типы разбираются без подстановки ожидаемых решений.
Где и как запускать
Полный серверный общий модуль УчебныйПрогнозДерева85 собственной пустой базы; все помощники включены, отдельная управляемая форма получает только текст. В 1С не выполнялся.
Подготовка
НОВАЯ отдельная пустая файловая база платформы точно 8.5.1.1343: имя конфигурации УчебныйПрогнозДерева85, совместимость Не использовать, Русский. Без прикладных объектов, расширений, подписок, заданий и рабочих данных; модули конфигурации вручную пустые. Не использовать БП/КА2/УТ/УНФ.
Общие → Общие модули → УчебныйПрогнозДерева85: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Основной блок ниже — весь модуль, включая подготовку собственных таблиц, проверку стенда и разбор решений; никаких отсутствующих помощников подключать не нужно. Будущая ручная подготовка: сохранить и обновить только свою базу F7.
Своя внешняя обработка УчебныеНовыеСлучаи85 → управляемая Форма → команда и кнопка Выполнить с действием Выполнить. Полный отдельный модуль формы приведен ниже. На сервер уходят только вызовы собственного общего модуля; на клиент возвращается текст, а не таблицы, модель или ее колонки.
Обучающая таблица создается в памяти: 32 случая, остатки 0/1/10/11 и две вымышленные метки Нужно/Достаточно по собственному правилу. Код не используется в обучении, Остаток — непрерывный вход, РешениеПоПравилу — дискретный прогноз. Подготовка полностью включена, предыдущий урок запускать не нужно.
Второй объект ТаблицаЗначений содержит четыре новых кода own-predict-1…4 и только Код/ВходнойОстаток. Колонки РешениеПоПравилу и готового ответа в источнике прогноза нет. Числа знакомы обучению: это новый набор объектов для проверки сопоставления, не независимая контрольная выборка качества.
Для опыта не нужны файлы данных, сеть, БСП, рабочие товары, расписание или сохраненные модели. Обучение, соответствия, вывод и временное удаление колонок происходят только в собственных объектах памяти. Код здесь не исполняется в 1С.
Функция ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Обучение = СоздатьСвоиСлучаи();
Анализатор = Новый АнализДанных;
Анализатор.ТипАнализа = Тип("АнализДанныхДеревоРешений");
Анализатор.ИсточникДанных = Обучение;
НастроитьСвоиКолонки(Анализатор.НастройкаКолонок);
НастроитьСвойПараметр(Анализатор.Параметры, "МинимальноеКоличествоСлучаев", 1);
НастроитьСвойПараметр(Анализатор.Параметры, "МаксимальнаяГлубина", 4);
НастроитьСвойПараметр(Анализатор.Параметры, "ТипУпрощения", ТипУпрощенияДереваРешений.НеУпрощать);
РезультатОбучения = Анализатор.Выполнить();
Если ТипЗнч(РезультатОбучения) <> Тип("РезультатАнализаДанныхДеревоРешений") Тогда
ВызватьИсключение "Нужен реальный результат обучения на своей таблице";
КонецЕсли;
Модель = РезультатОбучения.СоздатьМодельПрогноза();
Если ТипЗнч(Модель) <> Тип("МодельПрогнозаДеревоРешений") Тогда
ВызватьИсключение "Не создана настоящая собственная модель";
КонецЕсли;
НовыеСлучаи = СоздатьСвоиНовыеСлучаи();
Модель.ИсточникДанных = НовыеСлучаи;
Если ТипЗнч(Модель.ИсточникДанных) <> Тип("ТаблицаЗначений") Или Модель.ИсточникДанных.Количество() <> 4 Тогда
ВызватьИсключение "Источник прогноза должен быть отдельной собственной таблицей из четырех строк";
КонецЕсли;
Колонки = Модель.Колонки;
Если ТипЗнч(Колонки) <> Тип("КолонкиМоделиПрогноза") Или Колонки.Количество() = 0 Тогда
ВызватьИсключение "Модель не создала реальные описания колонок";
КонецЕсли;
Вход = НайтиСвоюКолонку(Колонки, "Остаток", ТипКолонкиМоделиПрогноза.Входная);
ИсточникОстатка = НайтиСвоюКолонку(Колонки, "ВходнойОстаток", ТипКолонкиМоделиПрогноза.КолонкаИсточникаДанных);
ИсточникКода = НайтиСвоюКолонку(Колонки, "Код", ТипКолонкиМоделиПрогноза.КолонкаИсточникаДанных);
Прогнозируемая = НайтиСвоюКолонку(Колонки, "РешениеПоПравилу", ТипКолонкиМоделиПрогноза.Прогнозируемая);
Настройки = Модель.НастройкаВходныхКолонок;
НастроитьСвойВход(Настройки, Вход, ИсточникОстатка);
Отчет = "СВОЙ ПРОГНОЗ В ПАМЯТИ, НЕ РЕШЕНИЕ О ЗАКУПКЕ" + Символы.ПС;
Отчет = Отчет + "Обучение: " + Строка(Обучение.Количество()) + "; отдельный вход прогноза: " + Строка(НовыеСлучаи.Количество()) + Символы.ПС;
Отчет = Отчет + ОписатьСвоиКолонки(Колонки);
Выход = Модель.КолонкиРезультата;
Если ТипЗнч(Выход) <> Тип("КолонкиРезультатаМоделиПрогноза") Тогда
ВызватьИсключение "Нужны настоящие настройки выходной таблицы";
КонецЕсли;
Отчет = Отчет + НастроитьСвойВыход(Выход, ИсточникКода, ИсточникОстатка, Прогнозируемая);
Прогноз = Модель.Выполнить();
Если ТипЗнч(Прогноз) <> Тип("ТаблицаЗначений") Или Прогноз.Количество() <> НовыеСлучаи.Количество() Тогда
ВызватьИсключение "Нужна настоящая выходная таблица по четырем новым объектам";
КонецЕсли;
Если Прогноз.Колонки.Количество() <> 3 Или Прогноз.Колонки.Найти("УчебныйКод") = Неопределено
Или Прогноз.Колонки.Найти("УчебныйОстаток") = Неопределено Или Прогноз.Колонки.Найти("УчебныйПрогноз") = Неопределено Тогда
ВызватьИсключение "Выход не соответствует собственной явной схеме из трех колонок";
КонецЕсли;
ВиденныеКоды = Новый Соответствие;
Для Каждого СтрокаПрогноза Из Прогноз Цикл
Код = СтрокаПрогноза.УчебныйКод;
ИсходнаяСтрока = НовыеСлучаи.Найти(Код, "Код");
Если ТипЗнч(Код) <> Тип("Строка") Или ИсходнаяСтрока = Неопределено Или ВиденныеКоды.Получить(Код) <> Неопределено Тогда
ВызватьИсключение "Неизвестный или повторный собственный код в результате";
КонецЕсли;
Если ТипЗнч(СтрокаПрогноза.УчебныйОстаток) <> Тип("Число") Или СтрокаПрогноза.УчебныйОстаток <> ИсходнаяСтрока.ВходнойОстаток Тогда
ВызватьИсключение "В результате изменился собственный входной остаток";
КонецЕсли;
ВиденныеКоды.Вставить(Код, Истина);
Отчет = Отчет + Код + "; вход=" + Строка(СтрокаПрогноза.УчебныйОстаток)
+ "; тип прогноза=" + Строка(ТипЗнч(СтрокаПрогноза.УчебныйПрогноз))
+ "; " + ОписатьСвоеРешение(СтрокаПрогноза.УчебныйПрогноз) + Символы.ПС;
КонецЦикла;
Если ВиденныеКоды.Количество() <> 4 Или Обучение.Количество() <> 32 Или НовыеСлучаи.Количество() <> 4 Тогда
ВызватьИсключение "Не сошлись свои ключи или размеры независимых таблиц памяти";
КонецЕсли;
Отчет = Отчет + "Четыре новых кода используют знакомые обучению числа; это проверка конвейера, не независимая оценка качества";
Возврат Отчет;
КонецФункции
Функция СоздатьСвоиНовыеСлучаи()
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("ВходнойОстаток", Новый ОписаниеТипов("Число"));
Остатки = Новый Массив;
Остатки.Добавить(0);
Остатки.Добавить(1);
Остатки.Добавить(10);
Остатки.Добавить(11);
Номер = 0;
Для Каждого Остаток Из Остатки Цикл
Номер = Номер + 1;
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Код = "own-predict-" + Строка(Номер);
НоваяСтрока.ВходнойОстаток = Остаток;
КонецЦикла;
Если Таблица.Количество() <> 4 Или Таблица.Колонки.Количество() <> 2 Тогда
ВызватьИсключение "Нужны четыре собственных входа без готовых меток";
КонецЕсли;
Возврат Таблица;
КонецФункции
Функция НайтиСвоюКолонку(Колонки, Имя, Вид)
Колонка = Колонки.Найти(Имя, Вид);
Если Колонка = Неопределено Или ТипЗнч(Колонка) <> Тип("КолонкаМоделиПрогноза") Тогда
ВызватьИсключение "Нет настоящей колонки модели: " + Имя + "; вид=" + Строка(Вид);
КонецЕсли;
Если Колонка.Имя <> Имя Или Колонка.ТипКолонки <> Вид Тогда
ВызватьИсключение "Найдена колонка с другим именем или ролью";
КонецЕсли;
Индекс = Колонки.Индекс(Колонка);
Если Индекс < 0 Или Индекс >= Колонки.Количество() Тогда
ВызватьИсключение "Индекс найденной колонки вне реальной коллекции";
КонецЕсли;
ПоИндексу = Колонки.Получить(Индекс);
Если ПоИндексу.Имя <> Имя Тогда
ВызватьИсключение "По индексу получено другое имя колонки";
КонецЕсли;
Возврат Колонка;
КонецФункции
Процедура НастроитьСвойВход(Настройки, Вход, ИсточникОстатка)
Если ТипЗнч(Настройки) <> Тип("НастройкаВходныхКолонокМоделиПрогноза") Или Настройки.Количество() <> 1 Тогда
ВызватьИсключение "Нужно одно реальное соответствие для собственного входа Остаток";
КонецЕсли;
Настройка = Настройки.Найти("Остаток");
Если Настройка = Неопределено Или ТипЗнч(Настройка) <> Тип("НастройкаВходнойКолонкиМоделиПрогноза") Тогда
ВызватьИсключение "Не найдена настройка собственного числового входа";
КонецЕсли;
Настройка.КолонкаМоделиПрогноза = Вход;
Настройка.КолонкаИсточникаДанных = ИсточникОстатка;
Индекс = Настройки.Индекс(Настройка);
Если Индекс < 0 Или Индекс >= Настройки.Количество() Тогда
ВызватьИсключение "Неверный индекс собственного соответствия";
КонецЕсли;
ПоИндексу = Настройки.Получить(Индекс);
ПоИмени = Настройки.Остаток;
Если ПоИндексу.КолонкаМоделиПрогноза.Имя <> "Остаток" Или ПоИмени.КолонкаМоделиПрогноза.Имя <> "Остаток"
Или Настройка.КолонкаИсточникаДанных.Имя <> "ВходнойОстаток"
Или ПоИндексу.КолонкаИсточникаДанных.ТипКолонки <> ТипКолонкиМоделиПрогноза.КолонкаИсточникаДанных Тогда
ВызватьИсключение "Соответствие Остаток ← ВходнойОстаток не сохранилось";
КонецЕсли;
КонецПроцедуры
Функция ОписатьСвоиКолонки(Колонки)
Стек = Новый Массив;
Для Каждого Колонка Из Колонки Цикл
Стек.Добавить(Новый Структура("Колонка,Уровень", Колонка, 0));
КонецЦикла;
Обработано = 0;
Отчет = "ДЕЙСТВИТЕЛЬНАЯ ИЕРАРХИЯ КОЛОНОК" + Символы.ПС;
Пока Стек.Количество() > 0 Цикл
Индекс = Стек.Количество() - 1;
Кадр = Стек[Индекс];
Стек.Удалить(Индекс);
Если Кадр.Уровень > 16 Или Обработано >= 128 Тогда
ВызватьИсключение "Своя диагностика превысила учебный предел 128 колонок или 16 уровней";
КонецЕсли;
Колонка = Кадр.Колонка;
Если ТипЗнч(Колонка) <> Тип("КолонкаМоделиПрогноза") Тогда
ВызватьИсключение "В иерархии нет настоящего описания колонки";
КонецЕсли;
Обработано = Обработано + 1;
Отчет = Отчет + "Уровень=" + Строка(Кадр.Уровень) + "; имя=" + Колонка.Имя
+ "; путь=" + Колонка.ПутьКДанным + "; роль=" + Строка(Колонка.ТипКолонки)
+ "; тип дополнительных параметров=" + Строка(ТипЗнч(Колонка.ДополнительныеПараметры)) + Символы.ПС;
Дети = Колонка.Колонки;
Если ТипЗнч(Дети) <> Тип("ФиксированныйМассив") Тогда
ВызватьИсключение "Вложенные описания должны быть настоящим фиксированным массивом";
КонецЕсли;
Для Каждого Дочерняя Из Дети Цикл
Стек.Добавить(Новый Структура("Колонка,Уровень", Дочерняя, Кадр.Уровень + 1));
КонецЦикла;
КонецЦикла;
Возврат Отчет;
КонецФункции
Функция НастроитьСвойВыход(Выход, ИсточникКода, ИсточникОстатка, Прогнозируемая)
Выход.Очистить();
Диагностика = Выход.Добавить(ИсточникКода);
Диагностика.Имя = "УчебнаяДиагностика";
Диагностика.Колонка = ИсточникОстатка;
Решение = Выход.Добавить(Прогнозируемая);
Решение.Имя = "УчебноеРешение";
Если Диагностика.Колонка.Имя <> "ВходнойОстаток" Или Диагностика.Имя <> "УчебнаяДиагностика" Тогда
ВызватьИсключение "Не изменено назначение собственной диагностической колонки";
КонецЕсли;
Отчет = "ДИАГНОСТИЧЕСКАЯ СХЕМА ДО УСТАНОВИТЬ" + Символы.ПС + ОписатьСвойВыход(Выход);
Позиция = Выход.Индекс(Диагностика);
Если Позиция < 0 Или Позиция >= Выход.Количество() Тогда
ВызватьИсключение "Не найдена позиция заменяемой собственной колонки";
КонецЕсли;
Выход.Установить(Решение, Позиция);
Отчет = Отчет + "ФАКТИЧЕСКАЯ СХЕМА ПОСЛЕ УСТАНОВИТЬ" + Символы.ПС + ОписатьСвойВыход(Выход);
Выход.Очистить();
Если Выход.Количество() <> 0 Тогда
ВызватьИсключение "Собственные временные настройки не очищены";
КонецЕсли;
Остаток = Выход.Добавить(ИсточникОстатка);
Остаток.Имя = "УчебныйОстаток";
Прогноз = Выход.Добавить(Прогнозируемая);
Прогноз.Имя = "УчебныйПрогноз";
Код = Выход.Вставить(ИсточникКода, 0);
Код.Имя = "УчебныйКод";
Если Выход.Количество() <> 3 Или Выход.Индекс(Код) <> 0 Или Выход.Индекс(Прогноз) <> 2 Тогда
ВызватьИсключение "Не подготовлен свой начальный порядок Код, Остаток, Прогноз";
КонецЕсли;
Выход.Сдвинуть(Прогноз, -1);
Если Выход.Индекс(Прогноз) <> 1 Тогда
ВызватьИсключение "Собственный прогноз не сдвинут на одну позицию влево";
КонецЕсли;
Выход.Удалить(Остаток);
Если Выход.Количество() <> 2 Или Выход.Индекс(Остаток) <> -1 Тогда
ВызватьИсключение "Собственная временная колонка остатка не удалена из настроек";
КонецЕсли;
Остаток = Выход.Вставить(ИсточникОстатка, 1);
Остаток.Имя = "УчебныйОстаток";
Если Выход.Количество() <> 3 Или Выход.Индекс(Код) <> 0 Или Выход.Индекс(Остаток) <> 1 Или Выход.Индекс(Прогноз) <> 2 Тогда
ВызватьИсключение "Не восстановлен окончательный собственный порядок вывода";
КонецЕсли;
Возврат Отчет + "ОКОНЧАТЕЛЬНЫЙ ВЫХОД ДЛЯ РАСЧЕТА" + Символы.ПС + ОписатьСвойВыход(Выход);
КонецФункции
Функция ОписатьСвойВыход(Выход)
Количество = Выход.Количество();
Если Количество > 32 Тогда
ВызватьИсключение "Слишком много колонок для своей небольшой диагностики";
КонецЕсли;
Отчет = "Колонок выхода: " + Строка(Количество) + Символы.ПС;
Для Номер = 0 По Количество - 1 Цикл
ПоИндексу = Выход.Получить(Номер);
Отчет = Отчет + "Индекс=" + Строка(Номер) + "; имя=" + ПоИндексу.Имя
+ "; фактический тип Получить=" + Строка(ТипЗнч(ПоИндексу)) + Символы.ПС;
КонецЦикла;
Для Каждого Настройка Из Выход Цикл
Если ТипЗнч(Настройка) <> Тип("КолонкаРезультатаМоделиПрогноза") Тогда
ВызватьИсключение "Обход должен дать реальные настройки результата модели";
КонецЕсли;
Отчет = Отчет + Настройка.Имя + " ← " + Настройка.Колонка.ПутьКДанным + Символы.ПС;
КонецЦикла;
Возврат Отчет;
КонецФункции
Функция СоздатьСвоиСлучаи()
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("РешениеПоПравилу", Новый ОписаниеТипов("Строка"));
Остатки = Новый Массив;
Остатки.Добавить(0);
Остатки.Добавить(1);
Остатки.Добавить(10);
Остатки.Добавить(11);
Для Повтор = 1 По 8 Цикл
Для Каждого Остаток Из Остатки Цикл
СтрокаСлучая = Таблица.Добавить();
СтрокаСлучая.Код = "own-case-" + Строка(Повтор) + "-" + Строка(Остаток);
СтрокаСлучая.Остаток = Остаток;
СтрокаСлучая.РешениеПоПравилу = ?(Остаток < 5, "Нужно", "Достаточно");
КонецЦикла;
КонецЦикла;
Если Таблица.Количество() <> 32 Тогда
ВызватьИсключение "Нужны ровно32 собственных учебных случая";
КонецЕсли;
Возврат Таблица;
КонецФункции
Процедура НастроитьСвоиКолонки(Настройки)
Код = Настройки.Найти("Код");
Остаток = Настройки.Найти("Остаток");
КолонкаРешения = Настройки.Найти("РешениеПоПравилу");
Если Код = Неопределено Или Остаток = Неопределено Или КолонкаРешения = Неопределено Или Настройки.Количество() <> 3 Тогда
ВызватьИсключение "Анализатор должен создать настройки трех собственных колонок";
КонецЕсли;
Код.ТипКолонки = ТипКолонкиАнализаДанныхДеревоРешений.НеИспользуемая;
Остаток.ТипКолонки = ТипКолонкиАнализаДанныхДеревоРешений.Входная;
Остаток.ВидДанных = ВидДанныхАнализа.Непрерывные;
КолонкаРешения.ТипКолонки = ТипКолонкиАнализаДанныхДеревоРешений.Прогнозируемая;
КолонкаРешения.ВидДанных = ВидДанныхАнализа.Дискретные;
ПроверитьСвоиКолонкиРезультата(Настройки);
КонецПроцедуры
Процедура ПроверитьСвоиКолонкиРезультата(Настройки)
Если ТипЗнч(Настройки) <> Тип("КолонкиАнализаДанных") Или Настройки.Количество() <> 3 Тогда
ВызватьИсключение "Нужны настоящие три настройки колонок анализа";
КонецЕсли;
Код = Настройки.Найти("Код");
Остаток = Настройки.Найти("Остаток");
КолонкаРешения = Настройки.Найти("РешениеПоПравилу");
Если Код = Неопределено Или Остаток = Неопределено Или КолонкаРешения = Неопределено Тогда
ВызватьИсключение "Исчезла собственная колонка";
КонецЕсли;
Если Код.ТипКолонки <> ТипКолонкиАнализаДанныхДеревоРешений.НеИспользуемая
Или Остаток.ТипКолонки <> ТипКолонкиАнализаДанныхДеревоРешений.Входная
Или Остаток.ВидДанных <> ВидДанныхАнализа.Непрерывные
Или КолонкаРешения.ТипКолонки <> ТипКолонкиАнализаДанныхДеревоРешений.Прогнозируемая
Или КолонкаРешения.ВидДанных <> ВидДанныхАнализа.Дискретные Тогда
ВызватьИсключение "Перепутаны ключ, числовой вход или собственная метка класса";
КонецЕсли;
КонецПроцедуры
Функция НайтиСвойПараметр(Параметры, Имя)
Параметр = Параметры.Найти(Имя);
Если Параметр = Неопределено Или ТипЗнч(Параметр) <> Тип("ПараметрАнализаДанных") Тогда
ВызватьИсключение "Не найден собственный параметр алгоритма " + Имя;
КонецЕсли;
Индекс = Параметры.Индекс(Параметр);
Если Индекс < 0 Или Индекс >= Параметры.Количество() Тогда
ВызватьИсключение "Индекс настоящего параметра выходит за границы";
КонецЕсли;
ПоИндексу = Параметры.Получить(Индекс);
Если ПоИндексу.Имя <> Параметр.Имя Или ПоИндексу.Имя <> Имя Тогда
ВызватьИсключение "Найти и Получить не вернули один собственный параметр";
КонецЕсли;
Возврат Параметр;
КонецФункции
Процедура НастроитьСвойПараметр(Параметры, Имя, Значение)
Параметр = НайтиСвойПараметр(Параметры, Имя);
Если Не Параметр.ТипЗначения.СодержитТип(ТипЗнч(Значение)) Тогда
ВызватьИсключение "Тип значения не разрешен реальным параметром " + Имя;
КонецЕсли;
Параметр.Значение = Значение;
ПроверитьСвойПараметр(Параметры, Имя, Значение);
КонецПроцедуры
Процедура ПроверитьСвойПараметр(Параметры, Имя, Эталон)
Параметр = НайтиСвойПараметр(Параметры, Имя);
Если ТипЗнч(Параметр.Значение) <> ТипЗнч(Эталон) Или Параметр.Значение <> Эталон Тогда
ВызватьИсключение "Не совпал собственный параметр результата " + Имя;
КонецЕсли;
КонецПроцедуры
Функция ОписатьСвоеСвойство(Описание)
Если ТипЗнч(Описание) <> Тип("СвойствоОбъектаАнализаДанных") Тогда
ВызватьИсключение "Нужно реальное описание значения или условия собственного анализа";
КонецЕсли;
Возврат Описание.Имя + "; сравнение=" + Строка(Описание.ВидСравнения)
+ "; значение=" + Строка(Описание.Значение) + "; с=" + Строка(Описание.ЗначениеС) + "; по=" + Строка(Описание.ЗначениеПо);
КонецФункции
Функция ОписатьСвойКласс(Класс)
Если ТипЗнч(Класс) <> Тип("ОбъектАнализаДанных") Тогда
ВызватьИсключение "Нужен реальный объект факта, прогноза или решения";
КонецЕсли;
Свойства = Новый Структура("РешениеПоПравилу", Неопределено);
ЗаполнитьЗначенияСвойств(Свойства, Класс);
Описание = Свойства.РешениеПоПравилу;
Если Описание = Неопределено Тогда
ВызватьИсключение "У собственного класса отсутствует единственная прогнозируемая колонка";
КонецЕсли;
Если ТипЗнч(Описание) <> Тип("СвойствоОбъектаАнализаДанных") Или Описание.Имя <> "РешениеПоПравилу"
Или Описание.ВидСравнения <> ВидСравнения.Равно
Или ТипЗнч(Описание.Значение) <> Тип("Строка")
Или (Описание.Значение <> "Нужно" И Описание.Значение <> "Достаточно") Тогда
ВызватьИсключение "Факт или прогноз не описывает собственную метку класса";
КонецЕсли;
Возврат ОписатьСвоеСвойство(Описание);
КонецФункции
Функция ОписатьСвоеРешение(Решение)
Если ТипЗнч(Решение) <> Тип("РешениеАнализаДанных") Или Решение.КоличествоСлучаев < 0 Тогда
ВызватьИсключение "Нужно настоящее решение собственного прогноза";
КонецЕсли;
Возврат ОписатьСвойКласс(Решение.Решение) + "; правильных случаев=" + Строка(Решение.КоличествоСлучаев)
+ "; вероятность как вернула платформа=" + Строка(Решение.Вероятность);
КонецФункции
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыУчебныеНовыеСлучаи85.Форма
Собственная внешняя обработка → управляемая Форма → Модуль
Полный клиент-серверный модуль формы; на клиент возвращается только текст собственного серверного расчета.
&НаКлиенте
Процедура Выполнить(Команда)
Отчет = ВыполнитьНаСервере();
Сообщить(Отчет);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
Возврат УчебныйПрогнозДерева85.ВыполнитьПример();
КонецФункцииРазбор по шагам
Защита проверяет собственную пустую конфигурацию, отсутствие объектов, расширений и активной транзакции. Реальное АнализДанных обучается по встроенным 32 строкам; модель берется только через СоздатьМодельПрогноза настоящего результата.
ИсточникДанных модели назначается отдельной таблице НовыеСлучаи. Колонки модели, настройки входа и настройки результата получают именно из созданной модели. Не создаются поддельные Структура с похожими именами или неизвестный ИсходныйОбъект.
НайтиСвоюКолонку вызывает Найти с двумя обязательными аргументами: именем и ТипКолонкиМоделиПрогноза. Остаток ищется как Входная, Код/ВходнойОстаток как КолонкаИсточникаДанных, РешениеПоПравилу как Прогнозируемая. Имя и роль проверяются; перед Получить проверяется индекс.
Настройка входа содержит два объекта КолонкаМоделиПрогноза. В КолонкаИсточникаДанных нельзя передавать КолонкаТаблицыЗначений. Явная связь Остаток ← ВходнойОстаток показывает, что одинаковые имена таблиц не обязательны. Сохраненная связь перечитывается через Найти, Индекс, Получить и реальное динамическое свойство Остаток.
ОписатьСвоиКолонки обходит настоящую иерархию без рекурсии и показывает Имя, ПутьКДанным, ТипКолонки, вложенные Колонки и тип ДополнительныеПараметры. Ограничения 128 описаний/16 уровней — учебная защита. Не придумывается строковый путь к вложенному значению; выводится фактический.
У дерева верхняя прогнозируемая колонка содержит РешениеАнализаДанных; справка описывает вложенные Прогноз/Значение и Вероятность. Для результата выбирается настоящий верхний объект, найденный по собственному имени поля. Поэтому УчебныйПрогноз разбирается как решение с отдельным объектом класса, а не автоматически как Строка.
КолонкиРезультата — readonly-свойство модели, но сама возвращенная коллекция и ее элементы редактируемы. Диагностическая колонка действительно меняет Колонка с кода на остаток, получает собственное Имя, затем Установить помещает имеющийся дескриптор решения на выбранную позицию. Отчет показывает схему до/после, не выдумывает сохранение числа колонок или поведение дубликатов.
После диагностического опыта Очистить заново готовит окончательную схему. Добавить создает Остаток/Прогноз, Вставить(ИсточникКода, 0) добавляет код спереди. Сдвинуть(Прогноз, -1) меняет порядок; Удалить получает реальный объект настройки Остаток, не индекс. Вставить(ИсточникОстатка, 1) восстанавливает конечный порядок Код, Остаток, Прогноз; индексы и количество проверяются.
У двух Получить установленная справка противоречива: КолонкиМоделиПрогноза объявляет КолонкаАнализаДанных, а КолонкиРезультатаМоделиПрогноза — КолонкаРезультатаЗапроса, хотя коллекции описывают другие элементы. Код использует у их возвратов только общее Имя и выводит фактический тип, не подменяет native-текст и не выдает гипотезу за runtime-проверку.
Модель.Выполнить действительно присутствует после настройки и возвращает ТаблицаЗначений. Проверяются четыре строки, три собственных имени колонок, уникальные известные коды и сохранение входного остатка. Сопоставление с источником идет по коду, а не по предполагаемому порядку строк.
Каждый полученный прогноз проверяется как РешениеАнализаДанных. Его вероятность, количество случаев и класс берутся из результата, не подставляются вручную. Динамическая метка класса проверяется через СвойствоОбъектаАнализаДанных; вывод не обещает точность 100% или конкретное числовое значение вероятности.
Как проверить результат
Будущий положительный опыт в своей базе: один полный запуск должен создать 32 обучающих и четыре прогнозных объекта, показать связь разных имен входных колонок, действительную иерархию, три состояния схемы выхода и четыре результата с собственными кодами. Окончательная таблица содержит УчебныйКод, УчебныйОстаток, УчебныйПрогноз.
Будущий отрицательный контроль имени: только в поиске источника остатка заменить ВходнойОстаток на ЧужоеПоле. НайтиСвоюКолонку должен остановиться до настройки/прогноза. Вернуть исходное имя после опыта.
Будущий отрицательный контроль роли: только у поиска Остаток заменить Входная на Прогнозируемая. Колонка не должна приниматься как правильный вход; проверка должна остановиться до Модель.Выполнить. Затем вернуть исходную роль.
Будущий отрицательный контроль схемы: удалить только последнюю Вставить(ИсточникОстатка, 1) и присваивание имени после нее. Проверка трех окончательных колонок должна остановиться до расчета. Вернуть полный код; проверяющую процедуру не ослаблять.
Будущий отрицательный контроль результата: сразу после Прогноз = Модель.Выполнить() временно присвоить Прогноз = Неопределено. Типовая проверка должна остановиться до чтения строк/колонок. Затем вернуть код.
runtimeVerifiedScenarios=0: BSL, обучение, модель, Установить, форма и база здесь не запускались. Статические тесты подтверждают текстовые контракты, привязки и наличие защит, а не фактические прогнозы. Будущие ручные проверки выполняются только на собственном отдельном стенде.
Ожидаемый результат
Полный конвейер содержит отдельный источник без готовых ответов, реальные описания/соответствия колонок, осмысленное редактирование собственной схемы вывода и настоящий вызов прогноза; результаты и вероятности не сфабрикованы.
На что обратить внимание
Четыре новых идентификатора с повторенными обучающими числами проверяют транспорт и соответствия. Это не оценка обобщения, коммерческое правило или доказательство качества алгоритма. Для реальных данных нужны отдельная контрольная выборка и предметная проверка.
Установить проверяется диагностически на реальных собственных элементах до очистки, а не фиктивным вызовом на той же позиции. Справка не уточняет поведение повторного дескриптора: урок печатает действительный эффект и затем строит чистую конечную схему. Это место требует будущего ручного подтверждения.
Имя результата и ПутьКДанным модели — разные значения. УчебныйПрогноз — собственное имя выходной колонки, РешениеПоПравилу — имя обучающего поля; вложенный native-путь не придумывается конкатенацией.
ДополнительныеПараметры зависят от алгоритма и могут быть Неопределено. Никакие параметры кластеризации не создаются и не присваиваются дереву ради демонстрации свойства.
Объект решения не равен строковой метке, вероятность решения не тождественна процентной ошибке обучения. Вероятность выводится без неподтвержденного умножения на 100 и без обещания точного диапазона.
Получить использует только общий member Имя из реально описанных native-типов; прямое чтение других полей его результата не выводится из противоречивой справки. Для остальных операций используются настоящие объекты Найти, Добавить, Вставить или обхода коллекции.
Очистить и Удалить затрагивают только выходные настройки собственного объекта модели в памяти, не строки базы и не пользовательские файлы. Нет Записать, транзакций, запросов к рабочей конфигурации или внешних действий.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.