Имя: Пароль:
IT
 
Разрыв в периоде
,
0 КУНГ ФУ 1С
 
20.10.15
12:03
Нужна помощь в решении алгоритма

Задача:
Есть таблицы с 2 колонками дата начала и дата окончания действия записи.
Необходимо определить был ли разыв в периоде с 01.07.2010 - 01.01.2015.

Начало        Конец    
01.07.2010 - 01.12.2010
02.12.2010 - 23.04.2012
24.04.2012 - 07.08.2012
01.09.2012 - 01.01.2015
1 КУНГ ФУ 1С
 
20.10.15
12:04
Года 2 назад решал похожую задачу с использованием алгоритма разрыва. Сейчас не могу найти этот алгоритм. Кто подскажет.
2 Timon1405
 
20.10.15
12:06
в запросе или где?
3 КУНГ ФУ 1С
 
20.10.15
12:09
в цикле
4 RomanYS
 
20.10.15
12:12
(3)берешь все даты и в двойном цикле их "прорежаешь"
5 Ненавижу 1С
 
гуру
20.10.15
12:12
лучше в запросе))
6 Timon1405
 
20.10.15
12:12
на выбор в цикле перебирать или даты из интервалов на предмет вхождения в заданный или наоборот по всем датам из заданного определять есть ли она хотя бы в одном интервале.
в чем вопрос-то?
7 RomanYS
 
20.10.15
12:13
в запросе правое соединение с таблицей дат и условие Есть NULL на твою таблицу
8 DTXyupyup
 
20.10.15
12:14
Таблица.Сортировать("Начало");
ПраваяГраница = '00010101';
Для каждого Стр ИЗ Таблица Цикл
  Если Стр.Начало>ПраваяГраница И Не значениеЗаполнено(ПраваяГраница) Тогда
    Возврат Истина;
  Иначе
    ПраваяГраница = Стр.Конец;
  КонецЕсли;
КонецЦикла;
Возврат Ложь;
9 Гёдза
 
20.10.15
12:14
соедини с собой по конец+1 = начало, там где нул,там разрыв
10 DTXyupyup
 
20.10.15
12:14
(8) Иначе -> ИначеЕсли Стр.Конец>ПраваяГраница
11 DTXyupyup
 
20.10.15
12:15
(8) Не значениеЗаполнено(ПраваяГраница) -> значениеЗаполнено(ПраваяГраница)
:)
12 1Сергей
 
20.10.15
12:20
Объединить все пересекающиеся периоды. Если в результате остался один период, то НИ ЕДИНОГО РАЗРЫВА ©
13 axuli
 
20.10.15
12:57
тз = Новый ТаблицаЗначений;
    
    тз.Колонки.Добавить("НачПер",Новый ОписаниеТипов("Дата"));
    тз.Колонки.Добавить("КонПер",Новый ОписаниеТипов("Дата"));
    
//                      01.07.2010 - 01.12.2010
//02.12.2010 - 23.04.2012
//24.04.2012 - 07.08.2012
//01.09.2012 - 01.01.2015
    стр = тз.Добавить();
    стр.НачПер = Дата(2010,7,1);
    стр.КонПер = Дата(2010,12,1);
    
    стр = тз.Добавить();
    стр.НачПер = Дата(2010,12,2);
    стр.КонПер = Дата(2012,4,23);
    
    стр = тз.Добавить();
    стр.НачПер = Дата(2012,4,24);
    стр.КонПер = Дата(2012,8,7);

    стр = тз.Добавить();
    стр.НачПер = Дата(2012,9,1);
    стр.КонПер = Дата(2015,1,1);
    
                              //  01.07.2010 - 01.01.2015.
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТЗ",Тз);
    Запрос.УстановитьПараметр("КонтрДатаНач",Дата(2010,7,1));
    Запрос.УстановитьПараметр("КонтрДатаКон",Дата(2015,1,1));
    Запрос.Текст = "ВЫБРАТЬ
                   |    тз.НачПер КАК НачПер,
                   |    тз.КонПер КАК КонПер
                   |ПОМЕСТИТЬ втДанные
                   |ИЗ
                   |    &тз КАК тз
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    взРазрывы.НачалоРазрыва,
                   |    взРазрывы.КонецРазрыва
                   |ИЗ
                   |    (ВЫБРАТЬ
                   |        ДОБАВИТЬКДАТЕ(ВложенныйЗапрос.КонПер, ДЕНЬ, 1) КАК НачалоРазрыва,
                   |        ВложенныйЗапрос.НачалоСледущего КАК КонецРазрыва
                   |    ИЗ
                   |        (ВЫБРАТЬ
                   |            втДанные.НачПер КАК НачПер,
                   |            втДанные.КонПер КАК КонПер,
                   |            МИНИМУМ(ЕСТЬNULL(втДанные1.НачПер, втДанные.КонПер)) КАК НачалоСледущего
                   |        ИЗ
                   |            втДанные КАК втДанные
                   |                ЛЕВОЕ СОЕДИНЕНИЕ втДанные КАК втДанные1
                   |                ПО втДанные.КонПер < втДанные1.НачПер
                   |        
                   |        СГРУППИРОВАТЬ ПО
                   |            втДанные.НачПер,
                   |            втДанные.КонПер) КАК ВложенныйЗапрос
                   |    ГДЕ
                   |        РАЗНОСТЬДАТ(ВложенныйЗапрос.КонПер, ВложенныйЗапрос.НачалоСледущего, ДЕНЬ) > 1) КАК взРазрывы
                   |ГДЕ
                   |    (взРазрывы.НачалоРазрыва >= &КонтрДатаНач
                   |                И взРазрывы.КонецРазрыва <= &КонтрДатаКон
                   |            ИЛИ взРазрывы.КонецРазрыва >= &КонтрДатаНач
                   |                И взРазрывы.КонецРазрыва <= &КонтрДатаКон)";
                  
                   Запрос.Выполнить().Выгрузить().ВыбратьСтроку();
14 mistеr
 
20.10.15
12:58
(0) По-моему эта вчерашняя статья для вас как по заказу вышла:
http://habrahabr.ru/post/266859/
15 Garykom
 
гуру
20.10.15
13:04
вот и в 1С приползли ораклоидо-pl/sql'щики... и начали многостраничными запросами все захламлять...
16 mistеr
 
20.10.15
13:38
(15) Это разве многостраничные...
17 Garykom
 
гуру
20.10.15
13:52
(16) у меня при дефолтовых 1600х900 на 1 экран не влезает
масштаб 100% стандартный и все прочее не менял
18 mikecool
 
20.10.15
13:56
(15) ошибаешься, в запросе ни одного курсора
19 SiAl-chel
 
20.10.15
14:22
(0) "Есть таблицы ..."
Вижу только одну таблицу, разрывов не вижу.
Программист всегда исправляет последнюю ошибку.