Имя: Пароль:
1C
1С v8
Диаграмма Ганта с группировками.
0 JuixyJes
 
31.07.19
11:30
Доброго времени суток, товаришчи программисты! Какое то время назад создавала тему об отчете с Диаграммой Ганта для отображения загруженности номеров. Она сделана, все хорошо, но встала задача. Нужны группировки! Если до этого мне нужна была загрузка исключительно номеров, то теперь нужна возможность развернуть номер и посмотреть все комнаты в нем, а так же при надобности развернуть комнаты и посмотреть все койки в них. Стоит ли отказаться от диаграммы Ганта и использовать что-то другое, или же как то в диаграмме Ганта можно реализовать то же самое?
1 wt
 
31.07.19
11:49
Это хоспис что ли?
2 palsergeich
 
31.07.19
12:13
(0) Вполне можно
3 palsergeich
 
31.07.19
13:01
https://yadi.sk/d/ir-QUWJ3_7FKGg как  пример
4 wt
 
31.07.19
13:33
(3) очень наглядно. Когда делал аренду, даже не подумал об этом. Справочник показался более функциональным, тем более, что позволял показывать планировки помещений.
5 JuixyJes
 
01.08.19
08:58
Так. Умудрилась вывести все записи номеров с группировкой по комнатам, в которых есть группировки по койкам. Но теперь вопрос, это я вывела из 3х справочников, тоесть отображения загруженности для них нет. Нужно как то добавить туда интервалы загруженности.


    отчет.ДГ.Очистить();
    ДиаграммаГанта = ДГ;
    ДиаграммаГанта.АвтоОпределениеПолногоИнтервала = Ложь;
    ДиаграммаГанта.УстановитьПолныйИнтервал(Отчет.Период.ДатаНачала,Отчет.Период.ДатаОкончания);
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Номера.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Номера КАК Номера";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        ТочкаНомер = ДиаграммаГанта.УстановитьТочку(ВыборкаДетальныеЗаписи.Ссылка);
        
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    Комнаты.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.Комнаты КАК Комнаты
        |ГДЕ
        |    Комнаты.Владелец = &Владелец";
        
        Запрос.УстановитьПараметр("Владелец", ВыборкаДетальныеЗаписи.Ссылка);
        
        РезультатЗапроса = Запрос.Выполнить();
        
        Выб = РезультатЗапроса.Выбрать();
        
        Пока Выб.Следующий() Цикл
            ТочкаКомната = ТочкаНомер.Точки.Добавить();
            ТочкаКомната.Значение = Выб.Ссылка;
            ТочкаКомната.Текст = Выб.Ссылка.Наименование;
            
            Запрос = Новый Запрос;
            Запрос.Текст =
            "ВЫБРАТЬ
            |    Койки.Ссылка КАК Ссылка
            |ИЗ
            |    Справочник.Койки КАК Койки
            |ГДЕ
            |    Койки.Владелец = &Владелец";
            
            Запрос.УстановитьПараметр("Владелец", Выб.Ссылка);
            
            РезультатЗапроса = Запрос.Выполнить();
            
            ВыбД = РезультатЗапроса.Выбрать();
            
            Пока ВыбД.Следующий() Цикл
                ТочкаКойка = ТочкаКомната.Точки.Добавить();
                ТочкаКойка.Значение = ВыбД.Ссылка;
                ТочкаКойка.Текст = ВыбД.Ссылка.Наименование;
            КонецЦикла;
            
        КонецЦикла;
    КонецЦикла;
6 JuixyJes
 
09.08.19
12:22
ДГ.Очистить();    
    ДиаграммаГанта = ДГ;
    ДиаграммаГанта.ОтображатьЛегенду = Ложь;
    ДиаграммаГанта.АвтоОпределениеПолногоИнтервала = Ложь;
    ДиаграммаГанта.УстановитьПолныйИнтервал(Отчет.Период.ДатаНачала,Отчет.Период.ДатаОкончания);
    Серия = ДиаграммаГанта.УстановитьСерию("Серия");
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Номера.Ссылка КАК Ссылка,
    |    ЗагруженностьНФ.ДатаЗаселения КАК ДатаЗаселения,
    |    ЗагруженностьНФ.ДатаВыезда КАК ДатаВыезда
    |ИЗ
    |    Справочник.Номера КАК Номера
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженностьНФ КАК ЗагруженностьНФ
    |        ПО Номера.Ссылка = ЗагруженностьНФ.НомерПроживания
    |ИТОГИ ПО
    |    Ссылка";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаСсылка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Пока ВыборкаСсылка.Следующий() Цикл
        ТочкаНомер = ДиаграммаГанта.УстановитьТочку(ВыборкаСсылка.Ссылка);
        ВыборкаДетальныеЗаписи = ВыборкаСсылка.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаНомер,Серия);
            Если ВыборкаДетальныеЗаписи.ДатаЗаселения <> NULL и ВыборкаДетальныеЗаписи.ДатаВыезда <> NULL  Тогда
                Интервал1 = Значение.Добавить();
                Интервал1.Начало = ВыборкаДетальныеЗаписи.ДатаЗаселения;
                Интервал1.Конец = ВыборкаДетальныеЗаписи.ДатаВыезда;
                Интервал1.Цвет = WebЦвета.НейтральноАквамариновый;
            КонецЕсли;
        КонецЦикла;
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    Комнаты.Ссылка КАК Ссылка,
        |    ЗагруженностьНФ.ДатаЗаселения КАК ДатаЗаселения,
        |    ЗагруженностьНФ.ДатаВыезда КАК ДатаВыезда
        |ИЗ
        |    Справочник.Комнаты КАК Комнаты
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженностьНФ КАК ЗагруженностьНФ
        |        ПО Комнаты.Ссылка = ЗагруженностьНФ.КомнатаПроживания
        |ГДЕ
        |    Комнаты.Владелец = &Владелец
        |ИТОГИ ПО
        |    Ссылка";
        
        Запрос.УстановитьПараметр("Владелец", ВыборкаСсылка.Ссылка);
        
        РезультатЗапроса = Запрос.Выполнить();
        
        ВыборкаСсылкаКомнаты = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        
        Пока ВыборкаСсылкаКомнаты.Следующий() Цикл
            ТочкаКомната = ТочкаНомер.Точки.Добавить();
            ТочкаКомната.Значение = ВыборкаСсылкаКомнаты.Ссылка;
            ТочкаКомната.Текст = ВыборкаСсылкаКомнаты.Ссылка.Наименование;
            Выб = ВыборкаСсылкаКомнаты.Выбрать();
            
            
            Пока Выб.Следующий() Цикл
                
                Если Выб.ДатаЗаселения <> NULL и Выб.ДатаВыезда <> NULL  Тогда
                    Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаКомната,Серия);
                    Интервал2 = Значение.Добавить();
                    Интервал2.Начало = Выб.ДатаЗаселения;
                    Интервал2.Конец = Выб.ДатаВыезда;
                    Интервал2.Цвет = WebЦвета.НейтральноАквамариновый;
                КонецЕсли;
            КонецЦикла;    
            Запрос = Новый Запрос;
            Запрос.Текст =
            "ВЫБРАТЬ
            |    Койки.Ссылка КАК Ссылка,
            |    ЗагруженностьНФ.ДатаЗаселения КАК ДатаЗаселения,
            |    ЗагруженностьНФ.ДатаВыезда КАК ДатаВыезда
            |ИЗ
            |    Справочник.Койки КАК Койки
            |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженностьНФ КАК ЗагруженностьНФ
            |        ПО Койки.Ссылка = ЗагруженностьНФ.КойкаПроживания
            |ГДЕ
            |    Койки.Владелец = &Комната
            |ИТОГИ ПО
            |    Ссылка";
            
            Запрос.УстановитьПараметр("Комната", ВыборкаСсылкаКомнаты.Ссылка);
            
            РезультатЗапроса = Запрос.Выполнить();
            
            ВыборкаСсылкаКойки = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            
            Пока ВыборкаСсылкаКойки.Следующий() Цикл
                
                ТочкаКойка = ТочкаКомната.Точки.Добавить();
                ТочкаКойка.Значение = ВыборкаСсылкаКойки.Ссылка;
                ТочкаКойка.Текст = ВыборкаСсылкаКойки.Ссылка.Наименование;
                
                ВыбД = ВыборкаСсылкаКойки.Выбрать();
                
                
                Пока ВыбД.Следующий() Цикл
                    
                    Если ВыбД.ДатаЗаселения <> NULL и ВыбД.ДатаВыезда <> NULL  Тогда
                        Значение = ДиаграммаГанта.ПолучитьЗначение(ТочкаКойка,Серия);
                        Интервал3 = Значение.Добавить();
                        Интервал3.Начало = ВыбД.ДатаЗаселения;
                        Интервал3.Конец = ВыбД.ДатаВыезда;
                        Интервал3.Цвет = WebЦвета.НейтральноАквамариновый;
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
        КонецЦикла;
        
    КонецЦикла;
7 JuixyJes
 
09.08.19
12:24
Пришла к такому коду, возможно не оптимально, но грузит быстро. Возник вопрос! Мне нужно разнообразие в цветах. Если номер загружен целиком, тогда цвет - Темный, если в номере загружены комнаты в отдельности - светлее, если в комнатах койки - еще светлее, как это можно реализовать?
8 НадюшаЯ
 
09.08.19
12:32
(7) Точно неоптимально, множество запросов в цикле, что при большом массиве данных, даст такую нагрузку что, мама не горюй.
Делать функцию определения загруженности номера и в зависимости от нее красить интервал. Но лучше конечно пересмотреть данный алгоритм, чтобы все данные выбирались одним запросом.
9 palsergeich
 
09.08.19
12:33
(7) разные серии в рамках строки