Получаю изменения за период, из них вычисляю заказы и по ним запрашиваю изменения.
В качестве ключей использую индексы строк, т.к. для vis.js нужны числовые ключи.
Параметр value влияет на размер ребра/вершины, параметр title отображается при наведении на элемент.
Относительно просто можно сформировать граф с визуальными дополнениями по данным системы.
Благодарю за внимание.
Буду рад конструктивной критике.
&НаСервере
Функция ПолучитьДанные()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ис_СостоянияЗаказовКлиентов.Заказ КАК Ссылка
|ПОМЕСТИТЬ втЗаказы
|ИЗ
| РегистрСведений.ис_СостоянияЗаказовКлиентов КАК ис_СостоянияЗаказовКлиентов
|ГДЕ
| ис_СостоянияЗаказовКлиентов.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ис_СостоянияЗаказовКлиентов.Период КАК Период,
| ис_СостоянияЗаказовКлиентов.Заказ КАК Заказ,
| ис_СостоянияЗаказовКлиентов.Состояние КАК Состояние
|ИЗ
| РегистрСведений.ис_СостоянияЗаказовКлиентов КАК ис_СостоянияЗаказовКлиентов
|ГДЕ
| ис_СостоянияЗаказовКлиентов.Заказ В
| (ВЫБРАТЬ
| втЗаказы.Ссылка КАК Ссылка
| ИЗ
| втЗаказы КАК втЗаказы)
|
|УПОРЯДОЧИТЬ ПО
| Период
|ИТОГИ ПО
| Заказ";
Запрос.УстановитьПараметр("ДатаНачала", ПериодЗапроса.ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ПериодЗапроса.ДатаОкончания);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаЗаказ = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Заказ");
Возврат ВыборкаЗаказ;
КонецФункции
&НаСервере
Процедура СформироватьВершиныИРебра(ВыборкаЗаказ, ТЗ_СостоянияВершины, ТЗ_СостоянияРебра)
Пока ВыборкаЗаказ.Следующий() Цикл
ТекущееСостояние = Неопределено;
ТекущийПериод = Дата(1,1,1);
ВыборкаСостояния = ВыборкаЗаказ.Выбрать();
Пока ВыборкаСостояния.Следующий() Цикл
Если ТекущийПериод <> Дата(1,1,1) Тогда
РазницаПериод = (ВыборкаСостояния.Период - ТекущийПериод) / 60;
Иначе
РазницаПериод = 0;
КонецЕсли;
Если ЗначениеЗаполнено(ТекущееСостояние)
И НЕ ТекущееСостояние = ВыборкаСостояния.Состояние
Тогда
СтрР = ТЗ_СостоянияРебра.Добавить();
СтрР.СостояниеНачальное = ТекущееСостояние;
СтрР.Состояние = ВыборкаСостояния.Состояние;
СтрР.Количество = 1;
СтрВ = ТЗ_СостоянияВершины.Добавить();
СтрВ.Состояние = ТекущееСостояние;
СтрВ.Время = РазницаПериод;
//-- Добавляю конечный узел
СтрВ = ТЗ_СостоянияВершины.Добавить();
СтрВ.Состояние = ВыборкаСостояния.Состояние;
КонецЕсли;
ТекущееСостояние = ВыборкаСостояния.Состояние;
ТекущийПериод = ВыборкаСостояния.Период;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция СформироватьМассивВершин(ТЗ_СостоянияВершины)
МассивВершины = Новый Массив;
Для каждого СтрВ Из ТЗ_СостоянияВершины Цикл
СоответствиеВершины = Новый Соответствие;
СоответствиеВершины.Вставить("id", ТЗ_СостоянияВершины.Индекс(СтрВ) + 1);
СоответствиеВершины.Вставить("label", Строка(СтрВ.Состояние));
СоответствиеВершины.Вставить("value", СтрВ.Время);
СоответствиеВершины.Вставить("title", СтрВ.Время);
МассивВершины.Добавить(СоответствиеВершины);
КонецЦикла;
Возврат МассивВершины
КонецФункции
&НаСервере
Функция СформироватьмассивРебер(ТЗ_СостоянияВершины, ТЗ_СостоянияРебра)
МассивРебра = Новый Массив;
Для каждого СтрР Из ТЗ_СостоянияРебра Цикл
СоответствиеРебра = Новый Соответствие;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Состояние", СтрР.СостояниеНачальное);
нСтроки = ТЗ_СостоянияВершины.НайтиСтроки(ПараметрыОтбора);
СоответствиеРебра.Вставить("from", ТЗ_СостоянияВершины.Индекс(нСтроки[0]) + 1);
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Состояние", СтрР.Состояние);
нСтроки = ТЗ_СостоянияВершины.НайтиСтроки(ПараметрыОтбора);
СоответствиеРебра.Вставить("to", ТЗ_СостоянияВершины.Индекс(нСтроки[0]) + 1);
//--
СоответствияСтрокиПараметры = Новый Соответствие;
СоответствияСтрокиПараметры.Вставить("enabled", Истина);
СоответствияСтрокиПараметры.Вставить("type", "arrow");
СоответствияСтроки = Новый Соответствие;
СоответствияСтроки.Вставить("to", СоответствияСтрокиПараметры);
СоответствиеРебра.Вставить("value", СтрР.Количество);
СоответствиеРебра.Вставить("title", СтрР.Количество);
СоответствиеРебра.Вставить("arrows", СоответствияСтроки);
//--
МассивРебра.Добавить(СоответствиеРебра);
КонецЦикла;
Возврат МассивРебра;
КонецФункции