Меняем только представление настоящего кластерного дерева: относительные границы областей, рамки, цвета, шрифты и формат шкалы.
Где и как запускать
Полный модуль своей управляемой формы в толстом клиенте Windows. Собственный кластерный расчёт, поиск настоящей диаграммы отчёта и собственное поле дендрограммы.
Подготовка
Используйте отдельную учебную базу 8.5.1.1343 и толстый управляемый клиент Windows. Создайте внешнюю обработку с пустой управляемой основной формой.
Создайте только команду Выполнить и её кнопку. Назначьте обработчик Выполнить(Команда), а событию ПриСозданииНаСервере — одноимённый обработчик из полного модуля.
Не создавайте вручную реквизит УчебноеДерево и поле ПолеУчебногоДерева: они создаются серверной процедурой. Каждый урок запускайте в своей копии формы.
Клиентский построитель отчёта анализа данных недоступен в тонком/веб-клиенте. Самостоятельное перенесение этого полного опыта на сервер тоже не подходит.
Шесть точек с собственными кодами guide-point-1…6 создаются в памяти: три около (0,0), три около (10,10). Это не координаты людей, адреса клиентов или рабочие платежи.
Алгоритм ДальняяСвязь формирует собственный кластерный отчёт. Код ищет настоящий рисунок типа Дендрограмма и проверяет его тип до обращения к связям. Отсутствие рисунка — явная ошибка подготовки, не выдуманный успех.
Рабочие документы, файлы, сеть и печать не используются. Запуск в 1С и фактический вид диаграммы не проверены: выполните контрольные шаги на собственном стенде.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Реквизиты = Новый Массив;
Реквизиты.Добавить(Новый РеквизитФормы("УчебноеДерево", Новый ОписаниеТипов("Дендрограмма")));
ЭтаФорма.ИзменитьРеквизиты(Реквизиты);
ЭтаФорма.УчебноеДерево = Новый Дендрограмма;
Поле = Элементы.Добавить("ПолеУчебногоДерева", Тип("ПолеФормы"));
Поле.Вид = ВидПоляФормы.ПолеДендрограммы;
Поле.ПутьКДанным = "УчебноеДерево";
Поле.Заголовок = "Кластеры шести собственных точек";
КонецПроцедуры
&НаКлиенте
Процедура Выполнить(Команда)
Точки = Новый ТаблицаЗначений;
Точки.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
Точки.Колонки.Добавить("X", Новый ОписаниеТипов("Число"));
Точки.Колонки.Добавить("Y", Новый ОписаниеТипов("Число"));
Координаты = Новый Массив;
Координаты.Добавить(Новый Структура("X,Y", 0, 0));
Координаты.Добавить(Новый Структура("X,Y", 0, 1));
Координаты.Добавить(Новый Структура("X,Y", 1, 0));
Координаты.Добавить(Новый Структура("X,Y", 10, 10));
Координаты.Добавить(Новый Структура("X,Y", 10, 11));
Координаты.Добавить(Новый Структура("X,Y", 11, 10));
Для Индекс = 0 По 5 Цикл
Точка = Точки.Добавить();
Точка.Код = "guide-point-" + Строка(Индекс + 1);
Точка.X = Координаты[Индекс].X;
Точка.Y = Координаты[Индекс].Y;
КонецЦикла;
Построитель = Новый ПостроительОтчетаАнализаДанных;
Построитель.ТипАнализа = Тип("АнализДанныхКластеризация");
Построитель.ИсточникДанных = Точки;
Построитель.ОтображатьСостояние = Ложь;
Построитель.ОбрабатыватьПрерываниеПользователя = Истина;
Колонки = Построитель.НастройкаКолонок;
Ключ = Колонки.Найти("Код");
X = Колонки.Найти("X");
Y = Колонки.Найти("Y");
Если Ключ = Неопределено ИЛИ X = Неопределено ИЛИ Y = Неопределено Тогда
ВызватьИсключение "Нет трёх настроек собственных колонок";
КонецЕсли;
Ключ.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Ключ;
Ключ.ВидДанных = ВидДанныхАнализа.Дискретные;
X.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Входная;
X.ВидДанных = ВидДанныхАнализа.Непрерывные;
Y.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Входная;
Y.ВидДанных = ВидДанныхАнализа.Непрерывные;
Количество = ПараметрУчебногоАнализа(Построитель.Параметры, "КоличествоКластеров", "ClusterCount");
Если НЕ Количество.ТипЗначения.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "У параметра количества ожидается числовой тип";
КонецЕсли;
Количество.Значение = 2;
Метод = ПараметрУчебногоАнализа(Построитель.Параметры, "МетодКластеризации", "ClusterizationMethod");
Метод.Значение = МетодКластеризации.ДальняяСвязь;
Заполнение = ПараметрУчебногоАнализа(Построитель.Параметры, "ТипЗаполненияТаблицы", "TableFillType");
Заполнение.Значение = ТипЗаполненияТаблицыРезультатаАнализаДанных.ВсеПоля;
Сообщить("Параметр: " + Количество.Имя + "; заголовок: " + Количество.Заголовок);
Сообщить(Количество.Значение = 2);
Сообщить(Ключ.Имя = "Код");
Сообщить("Тип дополнительных параметров X: " + Строка(ТипЗнч(X.ДополнительныеПараметры)));
Сообщить(Колонки.Количество() = 3);
Сообщить(Колонки.Получить(Колонки.Индекс(Ключ)) = Ключ);
Построитель.Выполнить();
Результат = Построитель.Результат;
Если ТипЗнч(Результат) <> Тип("РезультатАнализаДанныхКластеризация") Тогда
ВызватьИсключение "Ожидался результат кластеризации";
КонецЕсли;
Сообщить(Результат.КоличествоОбъектов = 6);
Сообщить(Результат.Кластеры.Количество() = 2);
Сообщить(Результат.ОбъектыКластеризации.Количество() = 6);
Сообщить(Результат.ТаблицаКластеризации.Количество() = 6);
ВсегоВКластерах = 0;
Для Каждого Кластер Из Результат.Кластеры Цикл
ВсегоВКластерах = ВсегоВКластерах + Кластер.КоличествоОбъектов;
Сообщить(СтрШаблон("Размер группы=%1; координат центра=%2", Кластер.КоличествоОбъектов, Кластер.ЦентрТяжести.Количество()));
Сообщить("Тип значений прогноза: " + Строка(ТипЗнч(Кластер.ЗначенияПолейПрогноза)));
КонецЦикла;
Сообщить(ВсегоВКластерах = 6);
Сообщить("Строк таблицы связей: " + Строка(Результат.ТаблицаСвязей.Количество()));
Сообщить("Строк матрицы расстояний: " + Строка(Результат.МежкластерныеРасстояния.Количество()));
Сообщить(ТипЗнч(Результат.НастройкаКолонок) = Тип("КолонкиАнализаДанных"));
Сообщить(ТипЗнч(Результат.Параметры) = Тип("ПараметрыАнализаДанных"));
Документ = Новый ТабличныйДокумент;
Построитель.Вывести(Документ);
Дерево = Неопределено;
Для Каждого Рисунок Из Документ.Рисунки Цикл
Если Рисунок.ТипРисунка = ТипРисункаТабличногоДокумента.Дендрограмма Тогда
Дерево = Рисунок.Объект;
Прервать;
КонецЕсли;
КонецЦикла;
Если Дерево = Неопределено Тогда
ВызватьИсключение "В собственном кластерном отчёте не найдена дендрограмма. Проверьте толстый клиент, метод ДальняяСвязь и автоматически формируемый макет";
КонецЕсли;
Если ТипЗнч(Дерево) <> Тип("Дендрограмма") Тогда
ВызватьИсключение "В собственном рисунке ожидалась Дендрограмма";
КонецЕсли;
Если Дерево.Элементы.Количество() < 2 Или Дерево.Связи.Количество() = 0 Тогда
ВызватьИсключение "Для опыта нужна настоящая диаграмма минимум с двумя элементами и связями";
КонецЕсли;
ДоЭлементов = Дерево.Элементы.Количество();
ДоСвязей = Дерево.Связи.Количество();
Дерево.ПрозрачныйФон = Ложь;
Дерево.ЦветФона = Новый Цвет(250, 251, 253);
Дерево.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 1);
Дерево.ЦветРамки = Новый Цвет(80, 100, 120);
Заголовок = Дерево.ОбластьЗаголовка;
Заголовок.Расположение = РасположениеОбластиЗаголовкаДиаграммы.УказываетсяРасположение;
Заголовок.Лево = 0.05;
Заголовок.Верх = 0.02;
Заголовок.Право = 0.95;
Заголовок.Низ = 0.15;
Заголовок.Текст = "Шесть собственных точек: иерархия сходства";
Заголовок.ПрозрачныйФон = Ложь;
Заголовок.ЦветФона = Новый Цвет(232, 240, 248);
Заголовок.ЦветТекста = Новый Цвет(25, 45, 70);
Заголовок.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 1);
Заголовок.ЦветРамки = Новый Цвет(80, 100, 120);
Заголовок.Шрифт = Новый Шрифт("Arial", 11, Истина);
Область = Дерево.ОбластьПостроения;
Область.Расположение = РасположениеОбластиПостроенияДиаграммы.УказываетсяРасположение;
Область.Лево = 0.10;
Область.Верх = 0.20;
Область.Право = 0.95;
Область.Низ = 0.92;
Область.ПрозрачныйФон = Ложь;
Область.ЦветФона = Новый Цвет(255, 255, 255);
Область.ЦветТекста = Новый Цвет(25, 45, 70);
Область.ЦветЛиний = Новый Цвет(35, 85, 130);
Область.ЦветШкалы = Новый Цвет(80, 100, 120);
Область.ЛинииСвязей = Новый Линия(ТипЛинииДиаграммы.Сплошная, 1);
Область.ЛинииШкалы = Новый Линия(ТипЛинииДиаграммы.Точечная, 1);
Область.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 1);
Область.ЦветРамки = Новый Цвет(150, 165, 180);
Область.Шрифт = Новый Шрифт("Arial", 10);
Область.ВертикальныеМетки = Ложь;
Область.ФорматШкалыЗначений = "ЧДЦ=2;ЧГ=0";
Сообщить(Заголовок.Лево < Заголовок.Право И Заголовок.Верх < Заголовок.Низ);
Сообщить(Область.Лево < Область.Право И Область.Верх < Область.Низ);
Сообщить(Заголовок.Низ < Область.Верх);
ЭтаФорма.УчебноеДерево = Дерево;
Сообщить(Дерево.Элементы.Количество() = ДоЭлементов);
Сообщить(Дерево.Связи.Количество() = ДоСвязей);
Документ.Показать("Отчёт по шести собственным точкам; рабочие данные не использовались");
КонецПроцедуры
&НаКлиенте
Функция ПараметрУчебногоАнализа(Параметры, Русское, Английское)
Параметр = Параметры.Найти(Русское);
Если Параметр = Неопределено Тогда
Параметр = Параметры.Найти(Английское);
КонецЕсли;
Если Параметр = Неопределено Тогда
ВызватьИсключение "Нет документированного параметра " + Русское;
КонецЕсли;
Возврат Параметр;
КонецФункцииРазбор по шагам
Получить собственное дерево из реального отчёта, а не создавать пустую картинку для проверки стиля.
ОбластьЗаголовка и ОбластьПостроения readonly как ссылки, но их собственные документированные поля настройки изменяемы. Сохранить эти объекты в переменные.
Расположение=УказываетсяРасположение включает явные границы. Координаты 0–1 относительные: это доли площади диаграммы, не пиксели и не сантиметры.
Заголовку выделить верхние 2–15%, области построения — 20–92%. Порядок Лево<Право и Верх<Низ проверяется отдельно.
Отключить прозрачность у самого дерева и обеих областей, чтобы явно заданный фон применялся. Обычная Одинарная рамка делает заданный ЦветРамки осмысленным.
Сплошная линия связи и точечная линия шкалы не меняют расстояния кластерного анализа. Формат чисел шкалы меняет подпись, не исходные данные.
Как проверить результат
Дополнительные пять проверок Истина: обе корректные области, непересечение и сохранность размеров коллекций.
Откройте своё поле в толстом клиенте и проверьте читаемость заголовка и шкалы. Свойства цвета сами по себе не доказывают фактический оттенок при иной теме или отсутствии Arial.
Ожидаемый результат
Оформлено настоящее дерево; относительная компоновка и стили не выданы за изменение результата анализа.
На что обратить внимание
При Авто платформа выбирает размещение областей; этот урок явно выбирает УказываетсяРасположение.
Если ПрозрачныйФон=Истина, соответствующий ЦветФона не используется. Для Выпуклая/Вдавленная рамки ЦветРамки тоже имеет иное поведение.
Нельзя присваивать Дерево.ОбластьЗаголовка или Дерево.ОбластьПостроения новые объекты. Меняются свойства полученных областей.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.