Имя: Пароль:
1C
1С v8
Диаграмма Ганта в отчете с группировками.
0 JuixyJes
 
04.10.19
16:37
Добрый вечер, решила заняться оптимизацией своего старенького отчета. Переписала алгоритм, но вот незадача. Не красится так как надо диаграмма. https://priscree.ru/img/91bfe26ac99b2f.jpg вот так красится. А должно быть как то так https://priscree.ru/img/325940a5a7b6f9.jpg
1 JuixyJes
 
04.10.19
16:38
Не подскажете, как поправить? Тут у главной группы(точки) поидее надо цвет сменить, если нет дочерних групп(точек)
2 JuixyJes
 
04.10.19
16:39
Точнее не все дочерние точки имеют начало и конец интервала
3 sqr4
 
04.10.19
16:45
Вроде не первый раз замужем, а темы все не умеем создавать
4 JuixyJes
 
04.10.19
16:47
(3) бубубу
5 sqr4
 
04.10.19
16:49
ну очевидно же код надо показать иначе все тлен
6 JuixyJes
 
07.10.19
11:33
(5)

Функция АпартаментыЗаняты(Ссылка,ВидАпартаментов)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ ";
    Если ВидАпартаментов=1 Тогда
        Запрос.Текст = Запрос.Текст +
        "ПП_ЗагруженностьОстатки.НомерПроживания КАК НомерПроживания, ";                
    КонецЕсли;    
    Если ВидАпартаментов=2 Тогда
        Запрос.Текст = Запрос.Текст +
        "ПП_ЗагруженностьОстатки.КомнатаПроживания КАК КомнатаПроживания, ";                
    КонецЕсли;    
    Если ВидАпартаментов=3 Тогда
        Запрос.Текст = Запрос.Текст +
        "ПП_ЗагруженностьОстатки.КойкаПроживания КАК КойкаПроживания, ";                
    КонецЕсли;    
    
    Запрос.Текст = Запрос.Текст + "
    |    ПП_ЗагруженностьОстатки.День КАК День
    |ИЗ
    |    РегистрНакопления.ПП_Загруженность.Остатки(&ДТ, ) КАК ПП_ЗагруженностьОстатки
    |ГДЕ
    |    ПП_ЗагруженностьОстатки.Организация = &Организация ";    
    
    Если ВидАпартаментов=1 Тогда
        Запрос.Текст = Запрос.Текст +
        "И ПП_ЗагруженностьОстатки.НомерПроживания = &НомерПроживания ";                
    КонецЕсли;    
    Если ВидАпартаментов=2 Тогда
        Запрос.Текст = Запрос.Текст +
        "И ПП_ЗагруженностьОстатки.КомнатаПроживания = &КомнатаПроживания ";                
    КонецЕсли;    
    Если ВидАпартаментов=3 Тогда
        Запрос.Текст = Запрос.Текст +
        "И ПП_ЗагруженностьОстатки.КойкаПроживания = &КойкаПроживания ";                
    КонецЕсли;    
    
    Запрос.Текст = Запрос.Текст + "
    |    И ПП_ЗагруженностьОстатки.День МЕЖДУ &ДатаНачала И &ДатаОкончания
    |
    |УПОРЯДОЧИТЬ ПО
    |    День,
    |    НомерПроживания,
    |    КомнатаПроживания,
    |    КойкаПроживания";                
    Запрос.УстановитьПараметр("ДТ", ТекущаяДата());
    Если ВидАпартаментов=1 Тогда
        Запрос.УстановитьПараметр("НомерПроживания", Ссылка);
    ИначеЕсли ВидАпартаментов=2 Тогда
        Запрос.УстановитьПараметр("КомнатаПроживания", Ссылка);
    ИначеЕсли ВидАпартаментов=3 Тогда
        Запрос.УстановитьПараметр("КойкаПроживания", Ссылка);
    КонецЕсли;
    Запрос.УстановитьПараметр("Организация", Отчет.Организация);
    Запрос.УстановитьПараметр("ДатаНачала", Отчет.Период.ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", Отчет.Период.ДатаОкончания);
    РезультатЗапроса = Запрос.Выполнить();
    Возврат НЕ РезультатЗапроса.Пустой();
КонецФункции    

&НаСервере
Процедура ПосмотретьНаСервере(ДГ)
    ДГ.Очистить();
    Орг = Отчет.Организация;
    ДиаграммаГанта = ДГ;
    ДиаграммаГанта.ОтображатьЛегенду = Ложь;
    ДиаграммаГанта.АвтоОпределениеПолногоИнтервала = Ложь;
    ДиаграммаГанта.УстановитьПолныйИнтервал(Отчет.Период.ДатаНачала,Отчет.Период.ДатаОкончания);
    Серия = ДиаграммаГанта.УстановитьСерию("Серия");
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Койки.Владелец.Владелец КАК Номер,
    |    Койки.Владелец КАК Комната,
    |    Койки.Ссылка КАК Койка,
    |    ЗагруженностьНФ.ДатаЗаселения КАК ДатаЗаселения,
    |    ЗагруженностьНФ.ДатаВыезда КАК ДатаВыезда
    |ИЗ
    |    Справочник.Койки КАК Койки
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженностьНФ КАК ЗагруженностьНФ
    |        ПО Койки.Ссылка = ЗагруженностьНФ.КойкаПроживания
    |ГДЕ
    |    Койки.Владелец.Владелец.Организация = &Организация
    |
    |УПОРЯДОЧИТЬ ПО
    |    Комната,
    |    Койка
    |ИТОГИ ПО
    |    Номер,
    |    Комната,
    |    Койка";
    Запрос.УстановитьПараметр("Организация",Орг);
    РезультатЗапроса = Запрос.Выполнить();    
    ВыборкаНомер = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);    
    Пока ВыборкаНомер.Следующий() Цикл
        //Проверить загруженность номера
        //Если ВидОтчета <> "Все номера" Тогда
        //    Если НЕ АпартаментыЗаняты(ВыборкаНомер.Номер,1) и ВидОтчета = "Занятые номера" Тогда
        //        Продолжить;                                            
        //    ИначеЕсли АпартаментыЗаняты(ВыборкаНомер.Номер,1) и ВидОтчета = "Пустые номера" Тогда
        //        Продолжить;                                                
        //    КонецЕсли;
        //КонецЕсли;
        ТочкаНомер = ДиаграммаГанта.УстановитьТочку(ВыборкаНомер.Номер);
        ВыборкаКомната = ВыборкаНомер.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Пока ВыборкаКомната.Следующий() Цикл
            Коек = ВыборкаКомната.Комната.КоличествоКоек;
            счкоек = коек;
            Запрос = Новый Запрос;
                Запрос.Текст =
                "ВЫБРАТЬ
                |    Койки.Ссылка КАК Койка
                |ИЗ
                |    Справочник.Койки КАК Койки
                |ГДЕ
                |    Койки.Владелец.Владелец = &Владелец";
                
                Запрос.УстановитьПараметр("Владелец", ВыборкаНомер.Номер);
                
                РезультатЗапроса = Запрос.Выполнить();
                
                ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
                
                Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                    Если НЕ АпартаментыЗаняты(ВыборкаДетальныеЗаписи.Койка,3) Тогда
                        счкоек = коек - 1;
                    КонецЕсли;
                КонецЦикла;

            Если ВидОтчета <> "Все номера" Тогда
                Если НЕ АпартаментыЗаняты(ВыборкаКомната.Комната,2) и ВидОтчета = "Занятые номера" Тогда
                    Продолжить;                                            
                ИначеЕсли АпартаментыЗаняты(ВыборкаКомната.Комната,2) и ВидОтчета = "Пустые номера" Тогда
                    Продолжить;                                                
                КонецЕсли;
            КонецЕсли;
            ТочкаКомната = ТочкаНомер.Точки.Добавить();
            ТочкаКомната.Значение = ВыборкаКомната.Комната;
            ТочкаКомната.Текст = ВыборкаКомната.Комната.Наименование;
            ВыборкаКойка = ВыборкаКомната.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            Пока ВыборкаКойка.Следующий() Цикл                
                Коек = ВыборкаКойка.Комната.КоличествоКоек;
                Если ВидОтчета <> "Все номера" Тогда
                    Если НЕ АпартаментыЗаняты(ВыборкаКойка.Койка,3) и ВидОтчета = "Занятые номера" Тогда
                        Продолжить;    
                    ИначеЕсли АпартаментыЗаняты(ВыборкаКойка.Койка,3) и ВидОтчета = "Пустые номера" Тогда
                        Продолжить;        
                    КонецЕсли;
                КонецЕсли;
                //Проверить загруженность Койки
                ТочкаКойка = ТочкаКомната.Точки.Добавить();
                ТочкаКойка.Значение = ВыборкаКойка.Койка;
                ТочкаКойка.Текст = ВыборкаКойка.Койка.Наименование;
                //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
                Запрос = Новый Запрос;
                Запрос.Текст =
                "ВЫБРАТЬ
                |    ПП_ЗагруженностьОстатки.НомерПроживания КАК НомерПроживания,
                |    ПП_ЗагруженностьОстатки.КомнатаПроживания КАК КомнатаПроживания,
                |    ПП_ЗагруженностьОстатки.КойкаПроживания КАК КойкаПроживания,
                |    ПП_ЗагруженностьОстатки.День КАК День
                |ИЗ
                |    РегистрНакопления.ПП_Загруженность.Остатки(&ДТ, ) КАК ПП_ЗагруженностьОстатки
                |ГДЕ
                |    ПП_ЗагруженностьОстатки.Организация = &Организация
                |    И ПП_ЗагруженностьОстатки.НомерПроживания = &НомерПроживания
                |    И ПП_ЗагруженностьОстатки.КомнатаПроживания = &КомнатаПроживания
                |    И ПП_ЗагруженностьОстатки.КойкаПроживания = &КойкаПроживания
                |    И ПП_ЗагруженностьОстатки.День МЕЖДУ &ДатаНачала И &ДатаОкончания
                |
                |УПОРЯДОЧИТЬ ПО
                |    День,
                |    НомерПроживания,
                |    КомнатаПроживания,
                |    КойкаПроживания";                
                Запрос.УстановитьПараметр("ДТ", ТекущаяДата());
                Запрос.УстановитьПараметр("КойкаПроживания", ВыборкаКойка.Койка);
                Запрос.УстановитьПараметр("КомнатаПроживания", ВыборкаКомната.Комната);
                Запрос.УстановитьПараметр("НомерПроживания", ВыборкаНомер.Номер);
                Запрос.УстановитьПараметр("Организация", Орг);
                Запрос.УстановитьПараметр("ДатаНачала", Отчет.Период.ДатаНачала);
                Запрос.УстановитьПараметр("ДатаОкончания", Отчет.Период.ДатаОкончания);
                РезультатЗапроса = Запрос.Выполнить();
                //Если РезультатЗапроса.Пустой() Тогда
                //КонецЕсли;
                ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
                
                //Сообщить(ВыборкаДетальныеЗаписи.Количество());
                Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                    
                    Значение = ДГ.ПолучитьЗначение(ТочкаКойка, Серия);                     
                    Интервал = Значение.Добавить();
                    Интервал.Начало = ВыборкаДетальныеЗаписи.День;
                    Интервал.Конец = ВыборкаДетальныеЗаписи.День+24 * 60 * 60;
                    Интервал.Цвет = WebЦвета.ЦветМорскойВолны;
                    //Пока ТочкаКойка.Значение.Владелец.КоличествоКоек <> счкоек Цикл
                    //счкоек = счкоек + 1;
                    //КонецЦикла;
                    
                    Значение = ДГ.ПолучитьЗначение(ТочкаКомната, Серия);                     
                    Интервал = Значение.Добавить();
                    Интервал.Начало = ВыборкаДетальныеЗаписи.День;
                    Интервал.Конец = ВыборкаДетальныеЗаписи.День+24 * 60 * 60;
                    //Пока ТочкаКомната.Значение.Владелец.КоличествоКомнат <> счкомнат Цикл
                    //счкомнат = счкомнат + 1;
                    //КонецЦикла;
                    Если Коек <> счкоек Тогда
                        Интервал.Цвет = WebЦвета.Бирюзовый;
                    Иначе
                        Интервал.Цвет = WebЦвета.ЦветМорскойВолны;
                    КонецЕсли;
                    
                    Значение = ДГ.ПолучитьЗначение(ТочкаНомер, Серия);                     
                    Интервал = Значение.Добавить();
                    Интервал.Начало = ВыборкаДетальныеЗаписи.День;
                    Интервал.Конец = ВыборкаДетальныеЗаписи.День+24 * 60 * 60;
                    Если счкоек = 0 тогда
                        Интервал.Цвет = WebЦвета.БледноБирюзовый;
                    ИначеЕсли  Коек <> счкоек Тогда
                        Интервал.Цвет = WebЦвета.Бирюзовый;
                    ИначеЕсли Коек = счкоек тогда
                        Интервал.Цвет = WebЦвета.ЦветМорскойВолны;
                    КонецЕсли;
                    
                    
                КонецЦикла;
                //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА                
            КонецЦикла;
        КонецЦикла;            
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура Посмотреть(Команда)
    Если (Отчет.Период.ДатаНачала<>Дата(1,1,1) и Отчет.Период.ДатаОкончания<>Дата(1,1,1)) или (Отчет.Период.ДатаНачала > Отчет.Период.ДатаОкончания) Тогда
        ОчиститьСообщения();
        ПосмотретьНаСервере(Отчет.ДГ);
    Иначе
        Сообщить("Не корректно задан период!");    
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриОткрытииНаСервере()
    Отчет.ДГ.ОтображатьЛегенду=Ложь;
    Отчет.ДГ.Очистить();
    Элементы.ВидОтчета.СписокВыбора.Очистить();
    Элементы.ВидОтчета.СписокВыбора.Добавить("Занятые номера");
    Элементы.ВидОтчета.СписокВыбора.Добавить("Пустые номера");
    Элементы.ВидОтчета.СписокВыбора.Добавить("Все номера");
    Начисления.УстановкаОрганизацииПоУмолчанию(Отчет);
    ВидОтчета = "Все номера";
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПриОткрытииНаСервере();
КонецПроцедуры
7 hhhh
 
07.10.19
11:36
(6) то что не нужно сюда зафигачили?
8 JuixyJes
 
07.10.19
11:40
код всего отчета
9 JuixyJes
 
07.10.19
13:34
По факту, мне нужно сделать следующее:

Допустим есть номер, в нем две комнаты , в них по две койки.  И три цвета заполнения Темный, Светлый, Бледный.

Койки всегда заполняются темным цветом.
Комнаты заполняются темным цветом если все койки заняты, светлым если не все.
Номера заполняются бледным цветом если комнаты заполнены светлым, светлым если занята одна комната полностью, темным если заняты все комнаты.

Как реализовать такое, понять не могу.
10 JuixyJes
 
07.10.19
13:53
Быть может можно как то получить Таблицу значений со всеми точками диаграммы и интервалами этих точек?
11 JuixyJes
 
07.10.19
16:54
Спасибо за помощь..

Я понимаю что гантом редко пользуются и далеко не все. Но уж знать то ктото должен.
12 JuixyJes
 
08.10.19
12:28
помогите, кто нибудь.. у меня от этого отчета нервоз начинается, ахах