Тип: Число. Содержит высоту поля диаграммы. Задается в строках.
Полное описание, параметры и ограничения
Расширение поля формы для поля диаграммы.Высота (Form field extension for a chart field.Height)
Расширение поля формы для поля диаграммы (Form field extension for a chart field)
Высота (Height)
Доступен, начиная с версии 8.2.
Использование:
Чтение и запись.
Описание:
Тип: Число.
Содержит высоту поля диаграммы. Задается в строках.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Изменение свойства на клиенте требует обращения к серверу.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Два собственных графика: читаемые размеры полей и реальный выбор значений
Шесть вымышленных профилей X/Y показываются двумя различными механизмами: native гистограммой6x2 и actual дендрограммой иерархического анализа. Настройки размеров относятся к managed полям, не к расстояниям/самим данным. Полный опыт требует толстый управляемый Windows клиент8.5.1.1343: native построитель анализа недоступен thin/server, даже когда сами поля там доступны. Авторство и тесты статические, runtime не запускался.
Где и как запускать
Полный модуль собственной managed формы МоиПрофили85. Полный опыт только толстый управляемый Windows8.5.1.1343; клиентский native clustering guarded preprocessor, server fields/layout/readback/selection. Серверный guard supporting module самостоятельный.
Подготовка
Создайте НОВУЮ пустую CF УчебныеПрофилиИРазмеры85 платформой8.5.1.1343, совместимость НеИспользовать, основное приложение УправляемоеПриложение. Собственная File база ровно C:\1C85_OwnProfilesLab\8aa5689c-69a0-44bc-9fc4-b3c729670e5b\Base, один пользователь Профили85Ученик/одна роль УчебныеПрофилиРоль85. Запуск ТОЛЬКО толстым управляемым Windows клиентом; metadata имя и путь не являются доказательством происхождения CF, собственный source/стенд заранее проверяет владелец.
Нет каталогов/документов/регистров/планов/общих форм/отчётов/расширений/подписок/заданий. Ровно одна обработка МоиПрофили85 без object реквизитов/табличных частей/макетов; ровно одна управляемая ОсновнаяФорма, назначена основной. Ровно один общий модуль УчебныеПрофили85: Сервер=Да, ВызовСервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет; supporting guard целиком в этот модуль.
Реквизиты формы: График85 Диаграмма, Дерево85 Дендрограмма, Готово85/Ошибка85 Булево, ЭлементовДерева85/СвязейДерева85 Число(6,0), Выбор85/Состояние85 Строка неограниченная. Готово85/Ошибка85 служебные, счётчики и текстовые результаты только просмотр. ВосстанавливатьЗначенияПриОткрытии=Нет; не добавляйте одинаковые object реквизиты вместо этих form реквизитов.
Две отдельные горизонтальные группы обычного размещения managed формы: ПолеПрофилей85 Вид=ПолеДиаграммы/ПутьКДанным=График85; ПолеДерева85 Вид=ПолеДендрограммы/ПутьКДанным=Дерево85. Это самостоятельные поля, НЕ внутри таблицы формы. Не задавайте режим автосжатия группы, принудительно уменьшающий детей. Поле диаграммы растягивается по обеим сторонам; растягивание дерева переключает код. Результат Выбор85 многострочный только просмотр.
Шесть команд/кнопок: Сформировать85, ШирокоеОкно85, КомпактноеОкно85, ВыделитьДваЗначения85, ПрочитатьВыбор85, ОчиститьВыбор85. Одноимённые handlers(Команда); native ПриСозданииНаСервере(Отказ,СтандартнаяОбработка) и ПриОткрытии(Отказ) связаны с указанными процедурами. Main code целиком в модуль managed формы, не внутрь другого обработчика. Прямых event calls нет.
Собственный source6x3 содержит Код Строка40 и X/Y Число(6,0): (0,0),(0,1),(1,0),(10,10),(10,11),(11,10), marker/1…/6. Только memory. Гистограмма получает actual numeric X/Y и native selection mode ВыделениеЗначений; анализ использует Код как Ключ, X/Y как Входная/Непрерывные, 2 группы/ДальняяСвязь/ВсеПоля. Не считайте эти числа GPS/зарплатой/производством.
Дендрограмма получается только из настоящего native рисунка отчёта после client ПостроительОтчетаАнализаДанных.Выполнить/Вывести. Внутренний ТабличныйДокумент не показывается/не печатается/не пишется в файл; его native picture Объект отдаёт дерево. Отсутствие единственной native Дендрограмма честно останавливает упражнение до replacement, не подставляется Новый Дендрограмма/ручные листья/связи.
Source CF, metadata и все модули своего стенда сначала просмотрите самостоятельно. Автор НЕ создавал/запускал эту CF/форму/1С/GUI/анализ/файлы/БД/сеть/службы. Изготовлены только lesson/test исходники. Root/config sources read-only, предыдущие frozen файлы не менялись, новых backups/archives нет.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УчебныеПрофили85.ПроверитьСвойСтендПрофилей85();
Если Элементы.ПолеПрофилей85.Вид <> ВидПоляФормы.ПолеДиаграммы
Или Элементы.ПолеПрофилей85.ПутьКДанным <> "График85"
Или Элементы.ПолеДерева85.Вид <> ВидПоляФормы.ПолеДендрограммы
Или Элементы.ПолеДерева85.ПутьКДанным <> "Дерево85" Тогда
ВызватьИсключение "Нужны два настоящих собственных managed поля с точными data paths";
КонецЕсли;
Готово85 = Ложь;
Ошибка85 = Ложь;
УстановитьСвоиРазмеры85(Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Состояние85 = "Нажмите Сформировать85: шесть собственных профилей, ни одной строки из базы";
#Иначе
Отказ = Истина;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура Сформировать85(Команда)
Если Ошибка85 Тогда
ВызватьИсключение "СТОП: после ошибки исследуйте свой стенд; повтор этой формы заблокирован";
КонецЕсли;
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Попытка
ПроверитьСвойСтендНаСервере85();
Источник = СоздатьСобственнуюТаблицу85();
ДиаграммаКандидат = СоздатьСобственныйГрафик85(Источник);
ДеревоКандидат = ПолучитьСобственноеДерево85(Источник);
ПринятьСвоиГрафики85(ДиаграммаКандидат, ДеревоКандидат);
Исключение
Ошибка85 = Истина;
Состояние85 = "СТОП: расчёт/принятие отказали; продолжение заблокировано. " + ОписаниеОшибки();
КонецПопытки;
#Иначе
ВызватьИсключение "Полный опыт требует толстый управляемый Windows клиент8.5.1.1343";
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ШирокоеОкно85(Команда)
Если Ошибка85 Тогда
ВызватьИсключение "СТОП: после ошибки исследуйте свой стенд; повтор этой формы заблокирован";
КонецЕсли;
Попытка
ПрименитьПрофильРазмеров85(Ложь);
Исключение
Ошибка85 = Истина;
Состояние85 = "СТОП: операция отказала; продолжение заблокировано. " + ОписаниеОшибки();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура КомпактноеОкно85(Команда)
Если Ошибка85 Тогда
ВызватьИсключение "СТОП: после ошибки исследуйте свой стенд; повтор этой формы заблокирован";
КонецЕсли;
Попытка
ПрименитьПрофильРазмеров85(Истина);
Исключение
Ошибка85 = Истина;
Состояние85 = "СТОП: операция отказала; продолжение заблокировано. " + ОписаниеОшибки();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ВыделитьДваЗначения85(Команда)
Если Ошибка85 Тогда
ВызватьИсключение "СТОП: после ошибки исследуйте свой стенд; повтор этой формы заблокирован";
КонецЕсли;
Попытка
ВыделитьСобственныеЗначенияНаСервере85();
Исключение
Ошибка85 = Истина;
Состояние85 = "СТОП: операция отказала; продолжение заблокировано. " + ОписаниеОшибки();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПрочитатьВыбор85(Команда)
Если Ошибка85 Тогда
ВызватьИсключение "СТОП: после ошибки исследуйте свой стенд; повтор этой формы заблокирован";
КонецЕсли;
Попытка
ПрочитатьСвойВыборНаСервере85();
Исключение
Ошибка85 = Истина;
Состояние85 = "СТОП: операция отказала; продолжение заблокировано. " + ОписаниеОшибки();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьВыбор85(Команда)
Если Ошибка85 Тогда
ВызватьИсключение "СТОП: после ошибки исследуйте свой стенд; повтор этой формы заблокирован";
КонецЕсли;
Попытка
ОчиститьСвойВыборНаСервере85();
Исключение
Ошибка85 = Истина;
Состояние85 = "СТОП: операция отказала; продолжение заблокировано. " + ОписаниеОшибки();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьСвойСтендНаСервере85()
УчебныеПрофили85.ПроверитьСвойСтендПрофилей85();
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция СобственныеПрофили85()
Профили = Новый Массив;
Профили.Добавить(Новый ФиксированнаяСтруктура("Код,X,Y", "8aa5689c-69a0-44bc-9fc4-b3c729670e5b/1", 0, 0));
Профили.Добавить(Новый ФиксированнаяСтруктура("Код,X,Y", "8aa5689c-69a0-44bc-9fc4-b3c729670e5b/2", 0, 1));
Профили.Добавить(Новый ФиксированнаяСтруктура("Код,X,Y", "8aa5689c-69a0-44bc-9fc4-b3c729670e5b/3", 1, 0));
Профили.Добавить(Новый ФиксированнаяСтруктура("Код,X,Y", "8aa5689c-69a0-44bc-9fc4-b3c729670e5b/4", 10, 10));
Профили.Добавить(Новый ФиксированнаяСтруктура("Код,X,Y", "8aa5689c-69a0-44bc-9fc4-b3c729670e5b/5", 10, 11));
Профили.Добавить(Новый ФиксированнаяСтруктура("Код,X,Y", "8aa5689c-69a0-44bc-9fc4-b3c729670e5b/6", 11, 10));
Возврат Новый ФиксированныйМассив(Профили);
КонецФункции
#Если ТолстыйКлиентУправляемоеПриложение Тогда
&НаКлиенте
Функция СоздатьСобственнуюТаблицу85()
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(40)));
Таблица.Колонки.Добавить("X", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(6, 0)));
Таблица.Колонки.Добавить("Y", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(6, 0)));
Для Каждого Профиль Из СобственныеПрофили85() Цикл
СтрокаПрофиля = Таблица.Добавить();
СтрокаПрофиля.Код = Профиль.Код;
СтрокаПрофиля.X = Профиль.X;
СтрокаПрофиля.Y = Профиль.Y;
КонецЦикла;
Если Таблица.Количество() <> 6 Или Таблица.Колонки.Количество() <> 3 Тогда
ВызватьИсключение "Нужен собственный typed источник ровно6x3";
КонецЕсли;
Для Индекс = 0 По 5 Цикл
СтрокаПрофиля = Таблица.Получить(Индекс);
Профиль = СобственныеПрофили85()[Индекс];
Если ТипЗнч(СтрокаПрофиля.Код) <> Тип("Строка") Или ТипЗнч(СтрокаПрофиля.X) <> Тип("Число")
Или ТипЗнч(СтрокаПрофиля.Y) <> Тип("Число") Или СтрокаПрофиля.Код <> Профиль.Код
Или СтрокаПрофиля.X <> Профиль.X Или СтрокаПрофиля.Y <> Профиль.Y Тогда
ВызватьИсключение "Native typed таблица не совпала с собственными literals";
КонецЕсли;
КонецЦикла;
Возврат Таблица;
КонецФункции
&НаКлиенте
Функция СоздатьСобственныйГрафик85(Источник)
Диаграмма = Новый Диаграмма;
Диаграмма.Обновление = Ложь;
Диаграмма.АвтоТранспонирование = Ложь;
Диаграмма.ТипДиаграммы = ТипДиаграммы.Гистограмма;
Диаграмма.РежимВыделения = РежимВыделенияДиаграммы.ВыделениеЗначений;
Диаграмма.РежимРедактированияЗначений = РежимРедактированияЗначенийДиаграммы.НеИспользовать;
Диаграмма.ОбластьЗаголовка.Текст = "Собственные профили X/Y; не коды кластеров";
СерияX = Диаграмма.УстановитьСерию("X");
СерияX.Текст = "Параметр X";
СерияY = Диаграмма.УстановитьСерию("Y");
СерияY.Текст = "Параметр Y";
Номер = 0;
Для Каждого СтрокаПрофиля Из Источник Цикл
Номер = Номер + 1;
Точка = Диаграмма.УстановитьТочку(СтрокаПрофиля.Код);
Точка.Текст = "Профиль " + Строка(Номер);
Диаграмма.УстановитьЗначение(Точка, СерияX, СтрокаПрофиля.X);
Диаграмма.УстановитьЗначение(Точка, СерияY, СтрокаПрофиля.Y);
КонецЦикла;
Диаграмма.Обновление = Истина;
Возврат Диаграмма;
КонецФункции
&НаКлиенте
Функция ПолучитьСобственноеДерево85(Источник)
Построитель = Новый ПостроительОтчетаАнализаДанных;
Построитель.ТипАнализа = Тип("АнализДанныхКластеризация");
Построитель.ИсточникДанных = Источник;
Построитель.ОтображатьСостояние = Ложь;
Построитель.ОбрабатыватьПрерываниеПользователя = Истина;
Построитель.Макет = Неопределено;
Колонки = Построитель.НастройкаКолонок;
Ключ = Колонки.Найти("Код");
X = Колонки.Найти("X");
Y = Колонки.Найти("Y");
Если Ключ = Неопределено Или X = Неопределено Или Y = Неопределено Или Колонки.Количество() <> 3 Тогда
ВызватьИсключение "Native анализ должен иметь три настройки own source колонок";
КонецЕсли;
Ключ.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Ключ;
Ключ.ВидДанных = ВидДанныхАнализа.Дискретные;
X.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Входная;
X.ВидДанных = ВидДанныхАнализа.Непрерывные;
Y.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Входная;
Y.ВидДанных = ВидДанныхАнализа.Непрерывные;
Количество = НайтиПараметрАнализа85(Построитель.Параметры, "КоличествоКластеров", "ClusterCount");
Если Не Количество.ТипЗначения.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Native КоличествоКластеров должно принимать Число";
КонецЕсли;
Количество.Значение = 2;
Метод = НайтиПараметрАнализа85(Построитель.Параметры, "МетодКластеризации", "ClusterizationMethod");
Если Не Метод.ТипЗначения.СодержитТип(Тип("МетодКластеризации")) Тогда
ВызватьИсключение "Native метод кластеризации имеет неожиданный тип";
КонецЕсли;
Метод.Значение = МетодКластеризации.ДальняяСвязь;
Заполнение = НайтиПараметрАнализа85(Построитель.Параметры, "ТипЗаполненияТаблицы", "TableFillType");
Заполнение.Значение = ТипЗаполненияТаблицыРезультатаАнализаДанных.ВсеПоля;
Построитель.Выполнить();
Результат = Построитель.Результат;
Если ТипЗнч(Результат) <> Тип("РезультатАнализаДанныхКластеризация") Тогда
ВызватьИсключение "Нет настоящего native результата кластеризации; прежние представления сохраняются";
КонецЕсли;
Если Результат.КоличествоОбъектов <> 6 Или Результат.Кластеры.Количество() <> 2
Или Результат.ОбъектыКластеризации.Количество() <> 6 Или Результат.ТаблицаКластеризации.Количество() <> 6 Тогда
ВызватьИсключение "Actual native результат не описывает шесть собственных объектов в двух группах";
КонецЕсли;
Всего = 0;
Для Каждого Кластер Из Результат.Кластеры Цикл
Всего = Всего + Кластер.КоличествоОбъектов;
КонецЦикла;
Если Всего <> 6 Тогда
ВызватьИсключение "Native количества объектов кластеров не совпали с source";
КонецЕсли;
Документ = Новый ТабличныйДокумент;
Построитель.Вывести(Документ);
Дерево = Неопределено;
Найдено = 0;
Для Каждого Рисунок Из Документ.Рисунки Цикл
Если Рисунок.ТипРисунка = ТипРисункаТабличногоДокумента.Дендрограмма Тогда
Найдено = Найдено + 1;
Дерево = Рисунок.Объект;
КонецЕсли;
КонецЦикла;
Если Найдено <> 1 Или Дерево = Неопределено Тогда
ВызватьИсключение "В собственном native кластерном отчёте требуется ровно одна дендрограмма; пустое дерево не подставляем";
КонецЕсли;
Если ТипЗнч(Дерево) <> Тип("Дендрограмма") Тогда
ВызватьИсключение "Actual picture Объект не Дендрограмма";
КонецЕсли;
Если Дерево.Элементы.Количество() < 2 Или Дерево.Связи.Количество() < 1 Тогда
ВызватьИсключение "Actual generated tree должно иметь элементы и связи";
КонецЕсли;
Возврат Дерево;
КонецФункции
&НаКлиенте
Функция НайтиПараметрАнализа85(Параметры, Русское, Английское)
Параметр = Параметры.Найти(Русское);
Если Параметр = Неопределено Тогда
Параметр = Параметры.Найти(Английское);
КонецЕсли;
Если Параметр = Неопределено Тогда
ВызватьИсключение "Нет native параметра " + Русское;
КонецЕсли;
Возврат Параметр;
КонецФункции
#КонецЕсли
&НаСервере
Процедура ПринятьСвоиГрафики85(ДиаграммаКандидат, ДеревоКандидат)
Если Ошибка85 Тогда
ВызватьИсключение "СТОП: результат прежней операции неизвестен; автоматического повторения нет";
КонецЕсли;
УчебныеПрофили85.ПроверитьСвойСтендПрофилей85();
ПроверитьСобственнуюМатрицу85(ДиаграммаКандидат);
СнимокДерева = ПрочитатьNativeСвязи85(ДеревоКандидат);
Старое = Новый ФиксированнаяСтруктура("График,Дерево,Готово,Элементов,Связей,Выбор,Состояние", График85, Дерево85, Готово85, ЭлементовДерева85, СвязейДерева85, Выбор85, Состояние85);
Ошибка85 = Истина;
Попытка
График85 = ДиаграммаКандидат;
Дерево85 = ДеревоКандидат;
ПроверитьСобственнуюМатрицу85(График85);
ПроверитьСохранениеДерева85(Дерево85, СнимокДерева);
ЭлементовДерева85 = СнимокДерева.Элементов;
СвязейДерева85 = СнимокДерева.Связи.Количество();
Готово85 = Истина;
Элементы.ПолеПрофилей85.УстановитьВыделенныеЭлементы();
Если Элементы.ПолеПрофилей85.ПолучитьВыделенныеЭлементы().Количество() <> 0 Тогда
ВызватьИсключение "Native новый график должен начинать с явного пустого выделения";
КонецЕсли;
Исключение
ОшибкаПринятия = ОписаниеОшибки();
Попытка
График85 = Старое.График;
Дерево85 = Старое.Дерево;
Готово85 = Старое.Готово;
ЭлементовДерева85 = Старое.Элементов;
СвязейДерева85 = Старое.Связей;
Выбор85 = Старое.Выбор;
Состояние85 = Старое.Состояние;
Исключение
ВызватьИсключение "Ошибка принятия: " + ОшибкаПринятия + "; не удалось вернуть своё прежнее отображение: " + ОписаниеОшибки();
КонецПопытки;
ВызватьИсключение ОшибкаПринятия;
КонецПопытки;
Ошибка85 = Ложь;
Выбор85 = "Native выделение пусто; данные шести профилей не удалены";
Состояние85 = "Actual source6x3 → кластерный анализ6 объектов/2группы → native report tree; chart6x2, суммы X=32/Y=32. Дерево имеет собственные фактические размеры, не обещаем6листовых IDs.";
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьСобственнуюМатрицу85(Диаграмма)
Если ТипЗнч(Диаграмма) <> Тип("Диаграмма") Или Диаграмма.Точки.Количество() <> 6 Или Диаграмма.Серии.Количество() <> 2 Тогда
ВызватьИсключение "Нужна actual native матрица6x2";
КонецЕсли;
Если Диаграмма.АвтоТранспонирование Или Диаграмма.РежимВыделения <> РежимВыделенияДиаграммы.ВыделениеЗначений Тогда
ВызватьИсключение "Собственный chart должен сохранять оси и разрешать выбор значений";
КонецЕсли;
СуммаX = 0;
СуммаY = 0;
Профили = СобственныеПрофили85();
Для Индекс = 0 По 5 Цикл
Точка = Диаграмма.Точки.Получить(Индекс);
Если Точка.Значение <> Профили[Индекс].Код Тогда
ВызватьИсключение "Actual chart содержит чужой/переставленный key";
КонецЕсли;
Если Диаграмма.Серии.Получить(0).Значение <> "X" Или Диаграмма.Серии.Получить(1).Значение <> "Y" Тогда
ВызватьИсключение "Две native серии не совпали с X/Y";
КонецЕсли;
X = Диаграмма.ПолучитьЗначение(Точка, Диаграмма.Серии.Получить(0));
Y = Диаграмма.ПолучитьЗначение(Точка, Диаграмма.Серии.Получить(1));
Если ТипЗнч(X.Значение) <> Тип("Число") Или ТипЗнч(Y.Значение) <> Тип("Число")
Или X.Значение <> Профили[Индекс].X Или Y.Значение <> Профили[Индекс].Y Тогда
ВызватьИсключение "Actual numeric chart values не совпали с own literals";
КонецЕсли;
СуммаX = СуммаX + X.Значение;
СуммаY = СуммаY + Y.Значение;
КонецЦикла;
Если СуммаX <> 32 Или СуммаY <> 32 Тогда
ВызватьИсключение "Actual суммы матрицы должны быть32/32";
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПрочитатьNativeСвязи85(Дерево)
Если ТипЗнч(Дерево) <> Тип("Дендрограмма") Тогда
ВызватьИсключение "Нужен actual native generated tree";
КонецЕсли;
Если Дерево.Элементы.Количество() < 2 Или Дерево.Связи.Количество() < 1 Тогда
ВызватьИсключение "Нельзя выдавать пустую дендрограмму за результат анализа";
КонецЕсли;
Связи = Новый Массив;
Для Каждого Связь Из Дерево.Связи Цикл
Если ТипЗнч(Связь.ПервыйЭлемент) <> Тип("ЭлементДендрограммы")
Или ТипЗнч(Связь.ВторойЭлемент) <> Тип("ЭлементДендрограммы") Или ТипЗнч(Связь.Расстояние) <> Тип("Число") Тогда
ВызватьИсключение "Actual link должна дать native endpoints и числовое расстояние";
КонецЕсли;
ПервыйИндекс = Дерево.Элементы.Индекс(Связь.ПервыйЭлемент);
ВторойИндекс = Дерево.Элементы.Индекс(Связь.ВторойЭлемент);
Если ПервыйИндекс < 0 Или ВторойИндекс < 0 Тогда
ВызватьИсключение "Концы actual links должны принадлежать именно этому native tree";
КонецЕсли;
Связи.Добавить(Новый ФиксированнаяСтруктура("ПервыйИндекс,ВторойИндекс,Расстояние", ПервыйИндекс, ВторойИндекс, Связь.Расстояние));
КонецЦикла;
Возврат Новый ФиксированнаяСтруктура("Элементов,Связи", Дерево.Элементы.Количество(), Новый ФиксированныйМассив(Связи));
КонецФункции
&НаСервереБезКонтекста
Процедура ПроверитьСохранениеДерева85(Дерево, До)
После = ПрочитатьNativeСвязи85(Дерево);
Если После.Элементов <> До.Элементов Или После.Связи.Количество() <> До.Связи.Количество() Тогда
ВызватьИсключение "Own layout не должен менять native размер дерева";
КонецЕсли;
Для Индекс = 0 По До.Связи.Количество() - 1 Цикл
Если После.Связи[Индекс].ПервыйИндекс <> До.Связи[Индекс].ПервыйИндекс
Или После.Связи[Индекс].ВторойИндекс <> До.Связи[Индекс].ВторойИндекс
Или После.Связи[Индекс].Расстояние <> До.Связи[Индекс].Расстояние Тогда
ВызватьИсключение "Own layout изменил actual link/endpoints/distance";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПрименитьПрофильРазмеров85(Компактно)
Если Ошибка85 Тогда
ВызватьИсключение "СТОП: результат прежней операции неизвестен; автоматического повторения нет";
КонецЕсли;
УчебныеПрофили85.ПроверитьСвойСтендПрофилей85();
Если Не Готово85 Тогда
ВызватьИсключение "Сначала сформируйте собственные два представления";
КонецЕсли;
ПроверитьСобственнуюМатрицу85(График85);
До = ПрочитатьNativeСвязи85(Дерево85);
Ошибка85 = Истина;
УстановитьСвоиРазмеры85(Компактно);
ПроверитьСобственнуюМатрицу85(График85);
ПроверитьСохранениеДерева85(Дерево85, До);
Ошибка85 = Ложь;
Состояние85 = "Actual размеры двух native managed полей прочитаны; numeric chart и native tree links/distances сохранены. Пиксельный вид осмотрите вручную.";
КонецПроцедуры
&НаСервере
Процедура УстановитьСвоиРазмеры85(Компактно)
Если ТипЗнч(Компактно) <> Тип("Булево") Тогда
ВызватьИсключение "Профиль размеров должен быть собственным Булево";
КонецЕсли;
Если Компактно Тогда
Высота = 10;
Ширина = 46;
МаксВысота = 14;
МаксШирина = 56;
Иначе
Высота = 18;
Ширина = 72;
МаксВысота = 24;
МаксШирина = 84;
КонецЕсли;
ПолеДиаграммы = Элементы.ПолеПрофилей85;
ПолеДиаграммы.АвтоМаксимальнаяВысота = Ложь;
ПолеДиаграммы.АвтоМаксимальнаяШирина = Ложь;
ПолеДиаграммы.Высота = Высота;
ПолеДиаграммы.Ширина = Ширина;
ПолеДиаграммы.МаксимальнаяВысота = МаксВысота;
ПолеДиаграммы.МаксимальнаяШирина = МаксШирина;
ПолеДерева = Элементы.ПолеДерева85;
ПолеДерева.АвтоМаксимальнаяВысота = Ложь;
ПолеДерева.АвтоМаксимальнаяШирина = Ложь;
ПолеДерева.Высота = Высота;
ПолеДерева.Ширина = Ширина;
ПолеДерева.МаксимальнаяВысота = МаксВысота;
ПолеДерева.МаксимальнаяШирина = МаксШирина;
ПолеДерева.РастягиватьПоВертикали = Не Компактно;
ПолеДерева.РастягиватьПоГоризонтали = Не Компактно;
Если ПолеДиаграммы.АвтоМаксимальнаяВысота Или ПолеДиаграммы.АвтоМаксимальнаяШирина
Или ПолеДиаграммы.Высота <> Высота Или ПолеДиаграммы.Ширина <> Ширина
Или ПолеДиаграммы.МаксимальнаяВысота <> МаксВысота Или ПолеДиаграммы.МаксимальнаяШирина <> МаксШирина
Или ПолеДерева.АвтоМаксимальнаяВысота Или ПолеДерева.АвтоМаксимальнаяШирина
Или ПолеДерева.Высота <> Высота Или ПолеДерева.Ширина <> Ширина
Или ПолеДерева.МаксимальнаяВысота <> МаксВысота Или ПолеДерева.МаксимальнаяШирина <> МаксШирина
Или ПолеДерева.РастягиватьПоВертикали <> (Не Компактно) Или ПолеДерева.РастягиватьПоГоризонтали <> (Не Компактно) Тогда
ВызватьИсключение "Actual размеров/ограничений/stretch readback не совпал";
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВыделитьСобственныеЗначенияНаСервере85()
Если Ошибка85 Тогда
ВызватьИсключение "СТОП: результат прежней операции неизвестен; автоматического повторения нет";
КонецЕсли;
УчебныеПрофили85.ПроверитьСвойСтендПрофилей85();
Если Не Готово85 Тогда
ВызватьИсключение "Сначала native graph должен быть принят и виден";
КонецЕсли;
ПроверитьСобственнуюМатрицу85(График85);
ПолеДиаграммы = Элементы.ПолеПрофилей85;
Прежние = ПолеДиаграммы.ПолучитьВыделенныеЭлементы();
ОписатьСобственноеВыделение85(Прежние);
Первый = График85.ПолучитьЗначение(График85.Точки.Получить(1), График85.Серии.Получить(1));
Второй = График85.ПолучитьЗначение(График85.Точки.Получить(4), График85.Серии.Получить(1));
Если Первый.Значение <> 1 Или Второй.Значение <> 11 Тогда
ВызватьИсключение "Current native chart должен дать Y профилей2/5:1 и11";
КонецЕсли;
Выделение = Новый Массив;
Выделение.Добавить(Первый);
Выделение.Добавить(Второй);
Ошибка85 = Истина;
Попытка
ПолеДиаграммы.УстановитьВыделенныеЭлементы(Выделение);
Прочитанные = ПолеДиаграммы.ПолучитьВыделенныеЭлементы();
Описание = ОписатьСобственноеВыделение85(Прочитанные);
Если Прочитанные.Количество() <> 2 Или Прочитанные.Найти(Первый) = Неопределено Или Прочитанные.Найти(Второй) = Неопределено Тогда
ВызватьИсключение "Native selection readback не вернул именно2 текущих own values";
КонецЕсли;
Исключение
ОшибкаВыбора = ОписаниеОшибки();
Попытка
ПолеДиаграммы.УстановитьВыделенныеЭлементы(Прежние);
Исключение
ВызватьИсключение "Ошибка выбора: " + ОшибкаВыбора + "; ошибка восстановления своего выбора: " + ОписаниеОшибки();
КонецПопытки;
ВызватьИсключение ОшибкаВыбора;
КонецПопытки;
Ошибка85 = Ложь;
Выбор85 = Описание;
Состояние85 = "Native Set/Get выделили actual текущие значения Y2=1/Y5=11, сумма12; chart numeric data не менялись";
КонецПроцедуры
&НаСервере
Процедура ПрочитатьСвойВыборНаСервере85()
Если Ошибка85 Тогда
ВызватьИсключение "СТОП: результат прежней операции неизвестен; автоматического повторения нет";
КонецЕсли;
УчебныеПрофили85.ПроверитьСвойСтендПрофилей85();
Если Не Готово85 Тогда
ВызватьИсключение "Сначала сформируйте actual own graph";
КонецЕсли;
ПроверитьСобственнуюМатрицу85(График85);
Выбор85 = ОписатьСобственноеВыделение85(Элементы.ПолеПрофилей85.ПолучитьВыделенныеЭлементы());
КонецПроцедуры
&НаСервере
Процедура ОчиститьСвойВыборНаСервере85()
Если Ошибка85 Тогда
ВызватьИсключение "СТОП: результат прежней операции неизвестен; автоматического повторения нет";
КонецЕсли;
УчебныеПрофили85.ПроверитьСвойСтендПрофилей85();
Если Не Готово85 Тогда
ВызватьИсключение "Сначала сформируйте actual own graph";
КонецЕсли;
Ошибка85 = Истина;
Элементы.ПолеПрофилей85.УстановитьВыделенныеЭлементы();
Прочитанные = Элементы.ПолеПрофилей85.ПолучитьВыделенныеЭлементы();
Если ТипЗнч(Прочитанные) <> Тип("Массив") Или Прочитанные.Количество() <> 0 Тогда
ВызватьИсключение "Native explicit clear не прочитался пустым массивом";
КонецЕсли;
ПроверитьСобственнуюМатрицу85(График85);
Ошибка85 = Ложь;
Выбор85 = ОписатьСобственноеВыделение85(Прочитанные);
Состояние85 = "Убрано только UI выделение; все12 actual numeric values сохранены";
КонецПроцедуры
&НаСервере
Функция ОписатьСобственноеВыделение85(Выделение)
Если ТипЗнч(Выделение) <> Тип("Массив") Тогда
ВызватьИсключение "Native selecteditems должен возвращать Массив";
КонецЕсли;
Если Выделение.Количество() = 0 Тогда
Возврат "Ничего не выделено; отмена/clear не ошибка и не удаление профиля";
КонецЕсли;
Строки = Новый Массив;
Сумма = 0;
ЧислоЗначений = 0;
Для Каждого Выбранный Из Выделение Цикл
Если ТипЗнч(Выбранный) = Тип("ТочкаДиаграммы") Тогда
Если График85.Точки.Индекс(Выбранный) < 0 Тогда
ВызватьИсключение "Чужая точка не принадлежит текущему own graph";
КонецЕсли;
Строки.Добавить("Точка: " + Выбранный.Текст);
ИначеЕсли ТипЗнч(Выбранный) = Тип("СерияДиаграммы") Тогда
Если График85.Серии.Индекс(Выбранный) < 0 Тогда
ВызватьИсключение "Чужая серия не принадлежит текущему own graph";
КонецЕсли;
Строки.Добавить("Серия: " + Выбранный.Текст);
ИначеЕсли ТипЗнч(Выбранный) = Тип("ЗначениеДиаграммы") Тогда
Если График85.Точки.Индекс(Выбранный.Точка) < 0 Или График85.Серии.Индекс(Выбранный.Серия) < 0 Тогда
ВызватьИсключение "Чужие endpoints выбранного значения";
КонецЕсли;
Если График85.ПолучитьЗначение(Выбранный.Точка, Выбранный.Серия) <> Выбранный Или ТипЗнч(Выбранный.Значение) <> Тип("Число") Тогда
ВызватьИсключение "Нужно actual numeric value именно текущего own graph";
КонецЕсли;
ЧислоЗначений = ЧислоЗначений + 1;
Сумма = Сумма + Выбранный.Значение;
Строки.Добавить(Выбранный.Точка.Текст + " / " + Выбранный.Серия.Текст + " = " + Формат(Выбранный.Значение, "ЧГ=0;ЧДЦ=0"));
Иначе
ВызватьИсключение "Неожиданный тип native selected item";
КонецЕсли;
КонецЦикла;
Строки.Добавить("Сумма только явно выбранных numeric values: " + Формат(Сумма, "ЧГ=0;ЧДЦ=0") + "; таких значений: " + Строка(ЧислоЗначений));
Возврат СтрСоединить(Строки, Символы.ПС);
КонецФункцииExact собственный стенд профилей, версия, File/User и пустая CF
Своя CF УчебныеПрофилиИРазмеры85 → ОбщиеМодули → УчебныеПрофили85 → модуль целиком.
СерверДа/ВызовСервераДа/КлиентНет/ГлобальныйНет/ПривилегированныйНет. Только read-only guard; никаких actual операций автором.
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойСтендПрофилей85() Экспорт
ПроверитьСвойПустойСтенд();
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnProfilesLab\8aa5689c-69a0-44bc-9fc4-b3c729670e5b\Base"";"
Или ИмяПользователя() <> "Профили85Ученик" Тогда
ВызватьИсключение "Только собственный точный File стенд и пользователь";
КонецЕсли;
Если Метаданные.Обработки.Количество() <> 1 Или Метаданные.ОбщиеМодули.Количество() <> 1
Или Метаданные.ОбщиеФормы.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
Или Метаданные.Роли.Количество() <> 1 Тогда
ВызватьИсключение "Нужны только своя обработка, серверный guard и одна роль";
КонецЕсли;
Описание = Метаданные.Обработки.Найти("МоиПрофили85");
Если Описание = Неопределено Тогда
ВызватьИсключение "Не найдена собственная обработка";
КонецЕсли;
Если Описание.Формы.Количество() <> 1 Или Описание.Формы.Найти("ОсновнаяФорма") = Неопределено
Или Описание.Реквизиты.Количество() <> 0 Или Описание.ТабличныеЧасти.Количество() <> 0
Или Описание.Макеты.Количество() <> 0 Тогда
ВызватьИсключение "В собственной обработке нужна только одна управляемая форма";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Серверное создание проверяет exact File/User/platform/пустой CF и два actual managed field kinds/data paths. Выбирается широкий профиль: Высота18 строк, Ширина72 символа, МаксимальнаяВысота24 символа, МаксимальнаяШирина84 символа. АвтоМакс=False даёт смысл явным ограничениям; это НЕ размер bitmap в пикселях.
Сформировать85 на thick managed клиенте делает typed ТаблицаЗначений6x3 только из фиксированных literal профилей. Типы и каждое значение native таблицы сравниваются со своими literals. Этот source не возвращается из неизвестной working базы/запроса.
От native source строятся candidate гистограмма6points/2series и независимый actual cluster result. Построитель.Выполнить() заполняет readonly Результат, не возвращает его. Проверены тип результата,6объектов/2группы/6строк/сумма actual размеров групп6. Номера кластеров/leaf IDs/расстояния не угадываются.
Native Вывести(ownTabDoc) создаёт рисунки отчёта. Находится единственный ТипРисункаТабличногоДокумента.Дендрограмма, берётся readonly Рисунок.Объект. Проверяются реальный тип, непустые native элементы/связи. Table source, cluster result и generated tree — разные объекты; дерево вручную не конструируется.
Оба serializable candidate передаются своей server форме. ДО замены visible состояния native chart key/matrix/12numericvalues дают exact32/32; native tree endpoints имеют реальные типы и индексы именно своей коллекции, расстояния читаются фактическими. Missing tree/type/source отказывают до replacement.
После назначения обоих form реквизитов выполняется повторный actual matrix/tree-link readback. Если принятие сбоит, пытаемся вернуть только прежнее отображение/счётчики в памяти; ошибка восстановления не скрывается. Это НЕ DBtransaction/атомарная замена/восстановление каждого пикселя или прежнего UIselection. Первое native explicit clear задаёт пустое выделение нового graph.
ШирокоеОкно85/КомпактноеОкно85 меняют размеры целиком на сервере, потому raw native предупреждает о server обращении при клиентском изменении. Компактные Высота10/Ширина46/MaxHeight14/MaxWidth56, дерево stretchFalse; широкие18/72/24/84 и stretchTrue. Все14 свойств прочитаны обратно. Матрица и реальные native пары концов/расстояния дерева должны сохраниться.
ВыделитьДваЗначения85 берёт actual values из уже принятого График85, НЕ из сохранённого candidate или copied chart: Y профиля2=1 и Y профиля5=11. Массив этих native ЗначениеДиаграммы передаётся своему ПолеПрофилей85.УстановитьВыделенныеЭлементы, затем native ПолучитьВыделенныеЭлементы читается обратно. Требуем именно эти два текущих own значения, сумма numeric selections12.
ПрочитатьВыбор85 считывает настоящий интерактивный выбор пользователя. Native массив может содержать Point/Series/Value: принадлежность текущему actual chart проверяется индексами коллекций и native GetValue identity. Полные серии/точки не подменяются одной случайной numeric value; суммируются только явно выбранные Value. Пустое выделение — обычный результат/отмена, не ошибка.
ОчиститьВыбор85 вызывает настоящий setter без optionalArray и подтверждает getter пустым массивом; затем native матрица снова даёт32/32. Убрано только UI выделение, не данные. Дендрограмму выделение chart не фильтрует и к её неизвестным leaf IDs не привязывается.
Как проверить результат
После ручного Сформировать85 оба поля содержательны: actual histogram6x2, X/Y суммы32/32; actual native dendrogram имеет свои фактические counts. Нет требования ровно6элементов дерева/заранее известных leaf keys: internal nodes и представление могут отличаться.
Широкий/компактный профиль реально меняет оба field layouts и stretch дерева, без пересчёта кластеризации. Actual readback подтверждает свойственные размеры, unchanged12numericvalues и пары индексов/расстояния каждой native связи. Реальный вид окна/перенос/границы осмотрите вручную; static тест не измеряет pixels.
Нажмите ВыделитьДваЗначения85: native Get должен вернуть current Y2=1/Y5=11, отчёт суммы12. Это не просто массив литералов1/11: setter получает actual native Value objects текущего visible графика, getter проверяет их native identity.
Вручную выберите мышью собственные bars/series, затем ПрочитатьВыбор85. Отчёт показывает реальные типы и numeric selections; отмена/снятие даёт НичегоНеВыделено без false-success/исключения. Ничего из другой диаграммы в setter не передаётся.
ОчиститьВыбор85 подтверждает actual empty native selection, а все12 numeric values и32/32 сохранены. Чужие refs, неизвестный selected type и wrong own source при static negative tests отклоняются, не объявляются штатным выбором.
Тонкий/веб/обычный толстый клиент не является поддержанным полным сценарием: native построитель Execute/Put только thick, helpers клиентского анализа компилируются лишь при ТолстыйКлиентУправляемоеПриложение. Raw availability каждого field не даёт права обещать весь workflow в thin/mobile.
Прерывание/неожиданный result/missing generated tree не заменяют прежний вид до принятия. Последовательная UI замена не обещает DBrollback/атомарность; составная ошибка восстановления честно выдаётся. Ошибка85 выставлена до замены/размеров/выделения и снимается только после полного readback; все шесть команд и серверные маршруты блокируют повтор при оставшемся флаге. Не закрывайте форму для слепого обхода: сначала вручную исследуйте свой стенд.
Ожидаемый результат
Ожидаемый результат при ручном выполнении на собственном стенде: на шести профилях получены два настоящих представления; свойства managed field layouts используются с корректными единицами/ограничениями и readback, native selection roundtrip работает только с объектами текущего own chart, а generated dendrogram не подменён фиктивными листьями.
На что обратить внимание
Exporter apiName Расширение диаграммы/дендрограммы отличается от actual helpName Расширение поля формы для поля диаграммы/дендрограммы. Это именно managed ПолеФормы с правильным Видом, не ordinary control и не объект chart/tree сам по себе.
Height в строках, Width и MaxHeight/MaxWidth в символах согласно raw native. Max0 означает отсутствие ограничения; явный max работает при AutoMaxFalse. Это предпочтительный размер поля и layout constraint, не точный физический raster/пиксельная гарантия при любой теме и размере окна.
Сами поля доступны Thin/Web/Server/Thick; native report builder Execute/Put — только Thick. Поэтому весь урок thick managed Windows, а сервер выполняет только guards/layout/typed readback/selection; попытки вызвать builder на server/Thin не допускаются.
Native SetSelected(optionalArray) принимает Point/Series/Value; другие типы игнорирует. Пустой setter используется для explicitclear. Unknown source/foreign refs не посылаем, native игнорирование неверного типа не считается корректной собственной выборкой.
У Value.Точка/Серия и Link.ПервыйЭлемент/ВторойЭлемент readonly. Принадлежность проверяется native индексами текущих коллекций; эти поля не присваиваются и не фабрикуются raw numbers/unknown IDs. Chart Point ключ и dendrogram Element значение не считаются одним undocumented binding.
Метод/масштаб/настройки анализа влияют на generated расстояния. Они не выдаются за метры или заранее рассчитанные между guessed leaf IDs. Изменение размера поля не улучшает модель/не пересчитывает группы. Тип/наличие actual отчётного дерева обязательны.
Проверка exact CF/User/File и source review ограничивает только собственный disposable стенд; не криптографическое доказательство владения. In-memory restoration касается отображения, не DB/license/files; прежнее selection после failed graph replacement не обещано восстановленным.
Авторство и20+static проверки не равны выполненному runtime. Реальные GUI/rendering/dataanalysis вызываются только владельцем отдельного стенда по preparation. Actual1С/БД/файлы/GUI/network/services0, root/config read-only, backups0.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.