Имя: Пароль:
1C
1С v8
Создание ТЗ из другой ТЗ используя данные из первой.
0 JuixyJes
 
08.10.19
16:25
Добрый вечер! Замучалась с Гантом, решила проблему весьма просто, выгрузить все в ТЗ, и сформировать отчет уже используя ТЗ.

Проблема новая заключается вот в чем:
https://priscree.ru/img/cb8f605774db38.jpg
Имеется вот такая ТЗ, и в ней даты занятости койки с номером и комнатой, подскажите, как для каждой койки сформировать собственную запись с началом и окончанием периода? И так же возможна ситуация, когда койка занята с 1 по 4 и потом с 5 по 12 (к примеру),то тогда должно быть две строки в новой ТЗ с периодами по данной койке.
Отталкиваясь от скрина задам вопрос. Как завести в новую тз с тем же адресом, но:

Номер/Комната/Койка/ДатаНачала/ДатаОкончания
1-1/Комната 1/Спальное место 1/01.10.19/31.10.19
1 1Сергей
 
08.10.19
16:27
Самое простое - перебором
2 JuixyJes
 
08.10.19
16:31
Я понимаю что перебором, только вот как?
3 dezss
 
08.10.19
16:36
(2) Ну так сортируешь ТЗ по
Номер/Комната/Койка/День

Потом идешь по ней, запоминаешь день начальный для этой койки. Потом идешь пока не будет перерыва или койка не изменится. Как только такое случилось, прошлая запись будет конечной. В этот момент пишешь во вторую ТЗ данные и продолжаешь поиск с уже другой койкой или другой датой начальной.

Все.
4 1Сергей
 
08.10.19
16:36
(2) как что?
Конкретный вопрос задай. Проблема создать новую ТЗ? Проблема перебрать старую? Проблема добавить запись?
5 JuixyJes
 
08.10.19
16:36
ТЗ2 = Новый ТаблицаЗначений;
    ТЗ2.Колонки.Добавить("Номер");
    ТЗ2.Колонки.Добавить("Комната");
    ТЗ2.Колонки.Добавить("Койка");
    ТЗ2.Колонки.Добавить("ДатаНачала");
    ТЗ2.Колонки.Добавить("ДатаОкончания");
    дата = Отчет.Период.ДатаНачала;
    Номер = "";
    Комната = "";
    Койка = "";
    Для каждого стр из ТЗ цикл
        Если Стр.Номер <> Номер или Стр.Комната <> Комната или Стр.Койка <> Койка Тогда
            Номер = Стр.Номер;
            Комната = Стр.Комната;
            Койка = Стр.Койка;
            НСТР = ТЗ2.Добавить();
            НСТР.Номер = Номер;
            НСТР.Комната = Комната;
            НСТР.Койка = Койка;
        КонецЕсли;
    КонецЦикла;
6 JuixyJes
 
08.10.19
16:37
Вот я добавила в новую тз разные номера комнаты и койки
7 JuixyJes
 
08.10.19
16:38
(4) Проблема перебрать старую
8 2S
 
08.10.19
16:39
запросом же
9 dezss
 
08.10.19
16:43
(5)
После этого
        Если Стр.Номер <> Номер или Стр.Комната <> Комната или Стр.Койка <> Койка Тогда
            НСТР.ДатаОкончания = ПрошлаяСтрока.День;

            Номер = Стр.Номер;
            Комната = Стр.Комната;
            Койка = Стр.Койка;
            НСТР.Номер = Номер;
            НСТР.Комната = Комната;
            НСТР.Койка = Койка;
            НСТР.ДатаНачала = Стр.День;
        КонецЕсли;
        ПрошлаяСтрока = Стр;
10 hhhh
 
08.10.19
16:44
(7) ты уже перебираешь

    Для каждого стр из ТЗ цикл

вот же. у тебя есть
11 VladZ
 
08.10.19
16:46
(0) Вот тебе план:
1. Пихаешь ТЗ в Запрос.
2. Получаешь мин для Номер/Комната/Койка
3. Получаешь макс для Номер/Комната/Койка.
4. Собираешь в кучу 2 и 3.

В чем сложность?
12 JuixyJes
 
08.10.19
16:48
(11) я просто не использовала ТЗ в запросах никогда)
13 VladZ
 
08.10.19
16:49
14 hhhh
 
08.10.19
16:51
(11) не получится у нее мин и макс. Могут например койки заняты 1-3, 5-10, 15-18. Какой тут мин макс?
15 pechkin
 
08.10.19
16:51
Вот примерный код, по сворачиванию среийных номеров в диапазоны

    Для каждого Строка Из ТаблицаСерийНомеров Цикл
        
        НомерМарки = Число(Строка.НомерМарки);
        
        Если Строка.Разряд <> ПредРазряд
            ИЛИ НомерМарки <> ПредНомер + 1
            Тогда
            
            СтрокаДиапазона = ТаблицаДиапазонов.Добавить();
            СтрокаДиапазона.Разряд   = Строка.Разряд;
            СтрокаДиапазона.ТипМарки = Строка.ТипМарки;
            СтрокаДиапазона.НачальныйНомерДиапазона = НомерМарки;
            СтрокаДиапазона.ДлинаНомера = СтрДлина(СокрЛП(Строка.НомерМарки));
            
        КонецЕсли;    
        
        СтрокаДиапазона.КонечныйНомерДиапазона = НомерМарки;
        
        ПредРазряд = Строка.Разряд;
        ПредНомер  = НомерМарки;
            
    КонецЦикла;
16 pechkin
 
08.10.19
16:53
(11) если с разрывами будет, то запрос будет неккоректный
17 hhhh
 
08.10.19
17:01
(16) у нее если без разрывов то же самое "И так же возможна ситуация, когда койка занята с 1 по 4 и потом с 5 по 12 (к примеру),то тогда должно быть две строки в новой ТЗ с периодами по данной койке. "
18 JuixyJes
 
08.10.19
17:17
ТЗ2 = Новый ТаблицаЗначений;
    ТЗ2.Колонки.Добавить("Номер");
    ТЗ2.Колонки.Добавить("Комната");
    ТЗ2.Колонки.Добавить("Койка");
    ТЗ2.Колонки.Добавить("ДатаНачала");
    ТЗ2.Колонки.Добавить("ДатаОкончания");
    Номер = "";
    Комната = "";
    Койка = "";
    ПредыдущаяДата = Неопределено;
    Для каждого стр из ТЗ цикл
        
        Если Стр.Номер <> Номер или Стр.Комната <> Комната или Стр.Койка <> Койка Тогда
            Номер = Стр.Номер;
            Комната = Стр.Комната;
            Койка = Стр.Койка;
            НСТР = ТЗ2.Добавить();
            НСТР.Номер = Номер;
            НСТР.Комната = Комната;
            НСТР.Койка = Койка;
            НСТР.ДатаНачала = Стр.День;
            НСТР.ДатаОкончания = ПредыдущаяДата;
        КонецЕсли;
        ПредыдущаяДата = Стр.День;
    КонецЦикла;
19 JuixyJes
 
08.10.19
17:18
А что дальше, как перерыв учитывать или окончание периода?
20 D_E_S_131
 
08.10.19
17:26
Алгорим (мой вариант):
1. Сортируем ТЗ1 по "Комната, Койка, День".
2. Обходим строки ТЗ1.
3. Ищем строки в ТЗ2 по отбору "Комната+Койка".
4. Если таких строк нет, то добавляем новую в ТЗ2, в которой ДатаНач = День и ДатаКон = День.
5. Если строки есть, то получаем среди них последнюю.
6. Вычисляем интервал между НачДня(День) и НачДня(ДатаКон).
7. Если интервал больше 86400, то делаем п.4. Иначе ДатаКон = День.
21 dezss
 
08.10.19
17:30
(18) Не так, а вот так:
       Если Стр.Номер <> Номер или Стр.Комната <> Комната или Стр.Койка <> Койка Тогда
            Номер = Стр.Номер;
            Комната = Стр.Комната;
            Койка = Стр.Койка;
            НСТР = ТЗ2.Добавить();
            НСТР.Номер = Номер;
            НСТР.Комната = Комната;
            НСТР.Койка = Койка;
            НСТР.ДатаНачала = Стр.День;
        КонецЕсли;
        НСТР.ДатаОкончания = ПредыдущаяДата;
22 JuixyJes
 
08.10.19
17:31
(21) а где тут предыдущая дата задается?
23 dezss
 
08.10.19
17:32
(21) ТЬфу.
        НСТР.ДатаОкончания = Стр.День;
24 dezss
 
08.10.19
17:33
(19) Его надо учитывать в твоем же условии
        Если Стр.Номер <> Номер или Стр.Комната <> Комната или Стр.Койка <> Койка Тогда

ПредыдущаяДата надо все же оставить, только там должна быть именно дата.

Т.е. надо сюда добавить проверку на перерыв. Типа такого: (Стр.День-ПредыдущаяДата) > 86400
25 JuixyJes
 
08.10.19
17:34
(24) Т.е

Если Стр.Номер <> Номер или Стр.Комната <> Комната или Стр.Койка <> Койка или  (Стр.День-ПредыдущаяДата) > 86400 Тогда
26 JuixyJes
 
08.10.19
17:34
Так?
27 dezss
 
08.10.19
17:34
(25) Да.
Ну или другое условие. Я ж не знаю, как именно у тебя должен определяться перерыв.
28 D_E_S_131
 
08.10.19
17:35
(25) Зачем вам вообще все эти "<>...<>...<>", когда есть прекрасный метод у ТЗ НайтиСтроки(Новый Структура("..."))?
29 3achem
 
08.10.19
17:36
(0) Учиться когда начнёшь? Синтаксис помощник хотя бы открывать?

Те кто пытаются помочь, вы ещё хуже, чем она
30 hhhh
 
08.10.19
17:38
(24) не надо проверку на перерыв

"И так же возможна ситуация, когда койка занята с 1 по 4 и потом с 5 по 12 (к примеру),то тогда должно быть две строки в новой ТЗ с периодами по данной койке."
31 JuixyJes
 
08.10.19
17:41
ТЗ2 = Новый ТаблицаЗначений;
    ТЗ2.Колонки.Добавить("Номер");
    ТЗ2.Колонки.Добавить("Комната");
    ТЗ2.Колонки.Добавить("Койка");
    ТЗ2.Колонки.Добавить("ДатаНачала");
    ТЗ2.Колонки.Добавить("ДатаОкончания");
    Номер = Неопределено;
    Комната = Неопределено;
    Койка = Неопределено;
    ПредыдущаяДата = Неопределено;
    Для каждого стр из ТЗ цикл
        Если Стр.Номер <> Номер или Стр.Комната <> Комната или Стр.Койка <> Койка или (ПредыдущаяДата-Стр.День)> 86400 Тогда
            Номер = Стр.Номер;
            Комната = Стр.Комната;
            Койка = Стр.Койка;
            НСТР = ТЗ2.Добавить();
            НСТР.Номер = Номер;
            НСТР.Комната = Комната;
            НСТР.Койка = Койка;
            НСТР.ДатаНачала = Стр.День;
        КонецЕсли;
        НСТР.ДатаОкончания = Стр.День;
        ПредыдущаяДата = Стр.День;
    КонецЦикла;
32 JuixyJes
 
08.10.19
17:41
Вот так все работает, спасибо!
33 JuixyJes
 
08.10.19
17:44
ох, только нет так промежутка
34 xenos
 
08.10.19
17:47
(0) Как то так

ВЫБРАТЬ
    АвансовыйОтчетТовары.Номенклатура КАК Койка,
    АвансовыйОтчетТовары.Ссылка.Дата КАК ДатаЗанята
ПОМЕСТИТЬ втДанные
ИЗ
    Документ.АвансовыйОтчет.Товары КАК АвансовыйОтчетТовары

СГРУППИРОВАТЬ ПО
    АвансовыйОтчетТовары.Номенклатура,
    АвансовыйОтчетТовары.Ссылка.Дата
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взДатыПоНомерам.Койка КАК Койка,
    взДатыПоНомерам.ДатаЗанята КАК ДатаЗанята,
    взДатыПоНомерам.НПП КАК НПП
ПОМЕСТИТЬ втДатыПоНомерам
ИЗ
    (ВЫБРАТЬ
        втДанные.Койка КАК Койка,
        втДанные.ДатаЗанята КАК ДатаЗанята,
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ втДанные1.ДатаЗанята) КАК НПП
    ИЗ
        втДанные КАК втДанные
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДанные КАК втДанные1
            ПО втДанные.Койка = втДанные1.ДатаЗанята
                И втДанные.ДатаЗанята >= втДанные1.ДатаЗанята
    
    СГРУППИРОВАТЬ ПО
        втДанные.Койка,
        втДанные.ДатаЗанята) КАК взДатыПоНомерам
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взДлительности.Койка КАК Койка,
    взДлительности.ДатаНачала КАК ДатаНачала,
    взДлительности.ДатаОкончания КАК ДатаОкончания,
    взДлительности.НППНачала КАК НППНачала,
    взДлительности.НППОкончания КАК НППОкончания,
    взДлительности.НППОкончания - взДлительности.НППНачала КАК Длительность
ПОМЕСТИТЬ втДлительности
ИЗ
    (ВЫБРАТЬ
        втДатыПоНомерам.Койка КАК Койка,
        втДатыПоНомерам.ДатаЗанята КАК ДатаНачала,
        втДатыПоНомерам1.ДатаЗанята КАК ДатаОкончания,
        втДатыПоНомерам.НПП КАК НППНачала,
        втДатыПоНомерам1.НПП КАК НППОкончания
    ИЗ
        втДатыПоНомерам КАК втДатыПоНомерам
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДатыПоНомерам КАК втДатыПоНомерам1
            ПО втДатыПоНомерам.Койка = втДатыПоНомерам1.Койка
                И втДатыПоНомерам.ДатаЗанята <= втДатыПоНомерам1.ДатаЗанята) КАК взДлительности
ГДЕ
    РАЗНОСТЬДАТ(взДлительности.ДатаНачала, взДлительности.ДатаОкончания, ДЕНЬ) = взДлительности.НППОкончания - взДлительности.НППНачала
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втДлительности.Койка КАК Койка,
    втДлительности.ДатаНачала КАК ДатаНачала,
    втДлительности.ДатаОкончания КАК ДатаОкончания,
    втДлительности.НППНачала КАК НППНачала,
    втДлительности.НППОкончания КАК НППОкончания,
    втДлительности.Длительность КАК Длительность
ИЗ
    (ВЫБРАТЬ
        втДлительности.ДатаОкончания КАК ДатаОкончания,
        втДлительности.Койка КАК Койка,
        МАКСИМУМ(втДлительности.Длительность) КАК МаксДлительность
    ИЗ
        втДлительности КАК втДлительности
    
    СГРУППИРОВАТЬ ПО
        втДлительности.ДатаОкончания,
        втДлительности.Койка) КАК взМаксДлительность
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДлительности КАК втДлительности
        ПО взМаксДлительность.Койка = втДлительности.Койка
            И взМаксДлительность.ДатаОкончания = втДлительности.ДатаОкончания
            И взМаксДлительность.МаксДлительность = втДлительности.Длительность
35 JuixyJes
 
09.10.19
08:57
(34) конечно спасибо большое, но в (31) на 90% правильно работает и мне бы в том коде что-то добавить.
36 JuixyJes
 
09.10.19
09:18
Решила проблему гениально, добавила умножение на -1

ТЗ2 = Новый ТаблицаЗначений;
    ТЗ2.Колонки.Добавить("Номер");
    ТЗ2.Колонки.Добавить("Комната");
    ТЗ2.Колонки.Добавить("Койка");
    ТЗ2.Колонки.Добавить("ДатаНачала");
    ТЗ2.Колонки.Добавить("ДатаОкончания");
    Номер = Неопределено;
    Комната = Неопределено;
    Койка = Неопределено;
    ПредыдущаяДата = Неопределено;
    Для каждого стр из ТЗ цикл
        Если Стр.Номер <> Номер или Стр.Комната <> Комната или Стр.Койка <> Койка или ((ПредыдущаяДата-Стр.День)*(-1))> 86400 Тогда
            Номер = Стр.Номер;
            Комната = Стр.Комната;
            Койка = Стр.Койка;
            НСТР = ТЗ2.Добавить();
            НСТР.Номер = Номер;
            НСТР.Комната = Комната;
            НСТР.Койка = Койка;
            НСТР.ДатаНачала = Стр.День;
        КонецЕсли;
        НСТР.ДатаОкончания = Стр.День;
        ПредыдущаяДата = Стр.День;
    КонецЦикла;
37 dezss
 
09.10.19
09:34
(36) Э...можно было бы просто поменять порядок. Когда писал, ошибся немного.
Надо было так)))
Стр.День-ПредыдущаяДата
38 JuixyJes
 
09.10.19
10:01
(37) и так сойдет:D
39 JuixyJes
 
09.10.19
10:02
Мне теперь как то надо на основании это таблицы заполнить диаграмму ганта, создать точки
40 JuixyJes
 
09.10.19
10:24
https://priscree.ru/img/1f32d8707e946b.jpg

Имею вот такую ТЗ по итогу. На ее основании нужно как то заполнить ганта
41 hhhh
 
09.10.19
10:58
(40) ну, эту тз подсунуть в ваш первоначальный отчет. Вы же в (0) сказали, что уже решили эту проблему. "решила проблему весьма просто"
42 JuixyJes
 
09.10.19
12:07
ДГ.Очистить();
    Орг = Отчет.Организация;
    ДиаграммаГанта = ДГ;
    ДиаграммаГанта.ОтображатьЛегенду = Ложь;
    ДиаграммаГанта.ОтображениеИнтервала=ОтображениеИнтервалаДиаграммыГанта.Плоский;
    ДиаграммаГанта.АвтоОпределениеПолногоИнтервала = Ложь;
    ДиаграммаГанта.УстановитьПолныйИнтервал(Отчет.Период.ДатаНачала,Отчет.Период.ДатаОкончания);
    Серия = ДиаграммаГанта.УстановитьСерию("Серия");
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номер");
    ТЗ.Колонки.Добавить("Комната");
    ТЗ.Колонки.Добавить("Койка");
    ТЗ.Колонки.Добавить("День");
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ПП_Загруженность.НомерПроживания КАК Номер,
    |    ПП_Загруженность.КомнатаПроживания КАК Комната,
    |    ПП_Загруженность.КойкаПроживания КАК Койка,
    |    ПП_Загруженность.День КАК День
    |ИЗ
    |    РегистрНакопления.ПП_Загруженность КАК ПП_Загруженность
    |ГДЕ
    |    ПП_Загруженность.Организация = &Организация
    |    И ПП_Загруженность.День МЕЖДУ &ДатаНачала И &ДатаОкончания
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номер,
    |    Койка,
    |    Комната,
    |    День";                
    Запрос.УстановитьПараметр("Организация", Орг);
    Запрос.УстановитьПараметр("ДатаНачала", Отчет.Период.ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", Отчет.Период.ДатаОкончания);
    РезультатЗапроса = Запрос.Выполнить();
    //Если РезультатЗапроса.Пустой() Тогда
    //КонецЕсли;
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        НСТР = ТЗ.Добавить();
        НСТР.Номер = ВыборкаДетальныеЗаписи.Номер;
        НСТР.Комната = ВыборкаДетальныеЗаписи.Комната;
        НСТР.Койка = ВыборкаДетальныеЗаписи.Койка;
        НСТР.День = ВыборкаДетальныеЗаписи.День;
    КонецЦикла;
    
    ТЗ2 = Новый ТаблицаЗначений;
    ТЗ2.Колонки.Добавить("Номер");
    ТЗ2.Колонки.Добавить("Комната");
    ТЗ2.Колонки.Добавить("Койка");
    ТЗ2.Колонки.Добавить("ДатаНачала");
    ТЗ2.Колонки.Добавить("ДатаОкончания");
    Номер = Неопределено;
    Комната = Неопределено;
    Койка = Неопределено;
    ПредыдущаяДата = Неопределено;
    Для каждого стр из ТЗ цикл
        Если Стр.Номер <> Номер или Стр.Комната <> Комната или Стр.Койка <> Койка или ((ПредыдущаяДата-Стр.День)*(-1))> 86400 Тогда
            Номер = Стр.Номер;
            Комната = Стр.Комната;
            Койка = Стр.Койка;
            НСТР = ТЗ2.Добавить();
            НСТР.Номер = Номер;
            НСТР.Комната = Комната;
            НСТР.Койка = Койка;
            НСТР.ДатаНачала = Стр.День;
        КонецЕсли;
        НСТР.ДатаОкончания = Стр.День;
        ПредыдущаяДата = Стр.День;
    КонецЦикла;
    ТЗ2.ВыбратьСтроку("ЧЕКЗИС");
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Койки.Владелец.Владелец КАК Номер,
    |    Койки.Владелец КАК Комната,
    |    Койки.Ссылка КАК Койка,
    |    ЗагруженностьНФ.ДатаЗаселения КАК ДатаЗаселения,
    |    ЗагруженностьНФ.ДатаВыезда КАК ДатаВыезда
    |ИЗ
    |    Справочник.Койки КАК Койки
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженностьНФ КАК ЗагруженностьНФ
    |        ПО Койки.Ссылка = ЗагруженностьНФ.КойкаПроживания
    |ГДЕ
    |    Койки.Владелец.Владелец.Организация = &Организация
    |
    |УПОРЯДОЧИТЬ ПО
    |    Комната,
    |    Койка
    |ИТОГИ ПО
    |    Номер,
    |    Комната,
    |    Койка";
    Запрос.УстановитьПараметр("Организация",Орг);
    РезультатЗапроса = Запрос.Выполнить();    
    ВыборкаНомер = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);    
    Пока ВыборкаНомер.Следующий() Цикл
        ТочкаНомер = ДиаграммаГанта.УстановитьТочку(ВыборкаНомер.Номер);
        ВыборкаКомната = ВыборкаНомер.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        ЗанятаяКомната = 0;
        Пока ВыборкаКомната.Следующий() Цикл        
            Если ВидОтчета <> "Все номера" Тогда
                Если НЕ АпартаментыЗаняты(ВыборкаКомната.Комната,2) и ВидОтчета = "Занятые номера" Тогда
                    Продолжить;                                            
                ИначеЕсли АпартаментыЗаняты(ВыборкаКомната.Комната,2) и ВидОтчета = "Пустые номера" Тогда
                    Продолжить;                                                
                КонецЕсли;
            КонецЕсли;
            ТочкаКомната = ТочкаНомер.Точки.Добавить();
            ТочкаКомната.Значение = ВыборкаКомната.Комната;
            ТочкаКомната.Текст = ВыборкаКомната.Комната.Наименование;
            ЗанятаяКойка = 0;
            ВыборкаКойка = ВыборкаКомната.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            Пока ВыборкаКойка.Следующий() Цикл                
                Если ВидОтчета <> "Все номера" Тогда
                    Если НЕ АпартаментыЗаняты(ВыборкаКойка.Койка,3) и ВидОтчета = "Занятые номера" Тогда
                        Продолжить;    
                    ИначеЕсли АпартаментыЗаняты(ВыборкаКойка.Койка,3) и ВидОтчета = "Пустые номера" Тогда
                        Продолжить;        
                    КонецЕсли;
                КонецЕсли;
                ТочкаКойка = ТочкаКомната.Точки.Добавить();
                ТочкаКойка.Значение = ВыборкаКойка.Койка;
                ТочкаКойка.Текст = ВыборкаКойка.Койка.Наименование;
                ПредыдущаяКомната = Неопределено;

                ПредыдущаяКойка = Неопределено;
                Для каждого СТР из ТЗ2 Цикл
                    Если стр.Койка = ТочкаКойка.Значение Тогда
                        Значение1 = ДГ.ПолучитьЗначение(ТочкаКойка, Серия);                     
                        Интервал1 = Значение1.Добавить();
                        Интервал1.Начало = стр.ДатаНачала;
                        Интервал1.Конец = стр.ДатаОкончания+86400;
                        Интервал1.Цвет = WebЦвета.ЦветМорскойВолны;
                        Значение1.ДополнительныйЦвет  = WebЦвета.ЦветМорскойВолны;
                        Если ПредыдущаяКойка <> Стр.Койка Тогда
                            ПредыдущаяКойка = Стр.Койка;
                            ЗанятаяКойка = ЗанятаяКойка + 1;
                        КонецЕсли;
                        Если Стр.Комната = ТочкаКойка.Значение.Владелец Тогда
                            Значение1 = ДГ.ПолучитьЗначение(ТочкаКомната, Серия);                     
                            Интервал1 = Значение1.Добавить();
                            Интервал1.Начало = стр.ДатаНачала;
                            Интервал1.Конец = стр.ДатаОкончания+86400;
                            Если ПредыдущаяКомната <> Стр.Комната и стр.Комната.КоличествоКоек = ЗанятаяКойка Тогда
                                ПредыдущаяКомната = стр.Комната;
                                ЗанятаяКомната = ЗанятаяКомната + 1;
                            КонецЕсли;
                            Если ЗанятаяКойка = стр.Комната.КоличествоКоек Тогда
                                Интервал1.Цвет = WebЦвета.ЦветМорскойВолны;
                                Значение1.ДополнительныйЦвет  = WebЦвета.ЦветМорскойВолны;
                            Иначе
                                Интервал1.Цвет = WebЦвета.Бирюзовый;
                                Значение1.ДополнительныйЦвет  = WebЦвета.Бирюзовый;
                            КонецЕсли;
                        КонецЕсли;
                        Если стр.Номер = ТочкаКойка.Значение.Владелец.Владелец Тогда
                            Значение1 = ДГ.ПолучитьЗначение(ТочкаНомер, Серия);                     
                            Интервал1 = Значение1.Добавить();
                            Интервал1.Начало = стр.ДатаНачала;
                            Интервал1.Конец = стр.ДатаОкончания+86400;
                            Если ЗанятаяКомната = стр.Номер.КоличествоКомнат  Тогда
                                Интервал1.Цвет = WebЦвета.ЦветМорскойВолны;
                                Значение1.ДополнительныйЦвет  = WebЦвета.ЦветМорскойВолны;
                            ИначеЕсли ЗанятаяКомната = 0 Тогда
                                Интервал1.Цвет = WebЦвета.БледноБирюзовый;
                                Значение1.ДополнительныйЦвет  = WebЦвета.БледноБирюзовый;
                            ИначеЕсли ЗанятаяКомната>0 и ЗанятаяКомната< стр.Номер.КоличествоКомнат Тогда
                                Интервал1.Цвет = WebЦвета.Бирюзовый;
                                Значение1.ДополнительныйЦвет  = WebЦвета.Бирюзовый;
                            КонецЕсли;
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
43 JuixyJes
 
09.10.19
12:08
вот код заполнения отчета
44 JuixyJes
 
09.10.19
12:09
45 JuixyJes
 
09.10.19
12:10
а вот заполение, как то нужно поправить то, что если первая комната полностью забита и номер был полностью забит как на картинке, некоторое время, заполняло цветом правильно.
46 JuixyJes
 
09.10.19
12:10
а как реализовать - вот вопрос.
47 JuixyJes
 
09.10.19
12:10
можно как то обратиться к интервалу?
48 JuixyJes
 
09.10.19
12:12
Они есть у меня в ТЗ, но оперировать ими не понимаю как
49 JuixyJes
 
09.10.19
12:26
Есть тут живые?
50 xenos
 
09.10.19
13:00
Где хранятся данные о том какие койки есть в номере?
51 xenos
 
09.10.19
13:07
Результат: даты когда все койки номера были заняты.
52 xenos
 
09.10.19
13:08
ВЫБРАТЬ
    АвансовыйОтчет.Организация КАК Номер,
    АвансовыйОтчет.Склад КАК Койка
ПОМЕСТИТЬ втКойкиНомера
ИЗ
    Документ.АвансовыйОтчет КАК АвансовыйОтчет
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АвансовыйОтчет.Организация КАК Номер,
    АвансовыйОтчет.Склад КАК Койка,
    АвансовыйОтчет.Дата КАК Дата
ПОМЕСТИТЬ втЗанятостьКоек
ИЗ
    Документ.АвансовыйОтчет КАК АвансовыйОтчет
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взКоекВНомере.Номер КАК Номер,
    взКоекВНомере.КоличествоКоекВНомере КАК КоличествоКоекВНомере
ПОМЕСТИТЬ взКоекВНомере
ИЗ
    (ВЫБРАТЬ
        втКойкиНомера.Номер КАК Номер,
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ втКойкиНомера.Койка) КАК КоличествоКоекВНомере
    ИЗ
        втКойкиНомера КАК втКойкиНомера
    
    СГРУППИРОВАТЬ ПО
        втКойкиНомера.Номер) КАК взКоекВНомере
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВложенныйЗапрос.Номер КАК Номер,
    ВложенныйЗапрос.Дата КАК Дата
ИЗ
    (ВЫБРАТЬ
        втЗанятостьКоек.Номер КАК Номер,
        втЗанятостьКоек.Дата КАК Дата,
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ втЗанятостьКоек.Койка) КАК КоличествоЗанятыхКоекНаДату
    ИЗ
        втЗанятостьКоек КАК втЗанятостьКоек
    
    СГРУППИРОВАТЬ ПО
        втЗанятостьКоек.Номер,
        втЗанятостьКоек.Дата) КАК ВложенныйЗапрос
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ взКоекВНомере КАК взКоекВНомере
        ПО ВложенныйЗапрос.КоличествоЗанятыхКоекНаДату = взКоекВНомере.КоличествоКоекВНомере
53 xenos
 
09.10.19
13:23
Или через ТЗ.



тзКойкиВНомере = ТЗ.Скопировать();
тзКойкиВНомере .Свернуть("Номер, Койка");

тзКоличествоКоекВНомере = ТЗ.Скопировать();
тзКоличествоКоекВНомере.Свернуть("Номер");
тзКоличествоКоекВНомере.Добавить("КоличествоКоек");

Для Каждого стрККвН из тзКоличествоКоекВНомере  Цикл
     строкиКвн = тзКойкиВНомере.НайтиСТроки(Новый Структура("Номер", стрККвН.Номер));
     стрККвН.КоличествоКоек = строкиКвн.Количество();
КонецЦикла;

тзДатыКоекНомера =  ТЗ.Скопировать();;
тзДатыКоекНомера.Свернуть("Номер, Койка, День");

тзДатыНомера =  ТЗ.Скопировать();;
тзДатыНомера.Свернуть("Номер, День");


тзДатыНомераКогдаВсеКойкиБылиЗаполнены = ТЗ.Скопировать();
тзДатыНомераКогдаВсеКойкиБылиЗаполнены.Свернуть("Номер,День");

Для Каждого стрНомера из тзКоличествоКоекВНомере Цикл
  строкиДатыНомера = тзДатыНомера.НайтиСтроки(Новый отбор("Номер", стрНомера.Номер));
  Для Каждого стрДат из строкиДатыНомера Цикл
  строкиКойкиДатыНомера = тзДатыКоекНомера.НайтиСтроки(Новый отбор("Номер, День", стрНомера.Номер, стрДат .День));
     Если строкиКойкиДатыНомера.Количество() = стрНомера.КоличествоКоек  Тогда
        стрДНКВКБЗ =    тзДатыНомераКогдаВсеКойкиБылиЗаполнены.ДОбавить();
        стрДНКВКБЗ.Номер = стрНомера.Номер;
        стрДНКВКБЗ.День= стрДат.День;

     КонецЕсли;

  КонецЦикла;

КонецЦикла;
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший