Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как получить неперекрывающиеся периоды из регистра

Как получить неперекрывающиеся периоды из регистра
Я
   Антиквар
 
28.09.20 - 01:52
Всем привет!
Вопрос по ЗУП 2.5, по регистру расчета Основные начисления. Но по сути это не важно, любой регистр, да вообще любая таблица, где есть дата начала и дата конца, а также признак сторно-записи.
Нужно получить из регистра периоды, на которые нет сторно записей. Поясню:
Допустим есть в регистре невыход на работу с 10 по 25 сентября 2020 г. Т.е. такая запись:
Невыход, 10.09.2020, 25.09.2020, Сторно = Ложь
Затем работник принес Б\Л с 15 по 18 сентября, в результате в регистре появилась такая запись:
Невыход, 15.09.2020, 18.09.2020, Сторно = Истина
Мне нужно вывести периоды невыхода, которые реально имели место быть. Т.е. мне нужно вывести два периода:
с 10 по 14
и
с 19 по 25

Может и в типовой конфе ЗУП 2.5 есть такие отчеты, где можно подсмотреть алгоритм (запрос), но я не нашел.
Мне приходит на ум только прямой как рельса метод: разбивать периоды на дни, писать их куда-то, а потом то же самое с периодами сторно. Если день сторно-записи есть в обычных днях, то удаляем этот день. И потом из оставшихся неудаленных дней клеить новые периоды.
Но может есть более красивый алгоритм?
   hhhh
 
1 - 28.09.20 - 02:42
(0) наверно режим вытеснения - это механизм платформы, а не какие-то там регистры сведений.
   Classic
 
2 - 28.09.20 - 09:51
В чем проблема запросом сделать?

ВЫБРАТЬ
    тз.ДатаНачала КАК Дата
ПОМЕСТИТЬ ДатыПериодов
ИЗ тз КАК тз

ОБЪЕДИНИТЬ
ВЫБРАТЬ
    тз.ДатаОкончания
ИЗ тз КАК тз
;
ВЫБРАТЬ
     ДатыПериодов.Дата КАК ДатаНачала,
     МИНИМУМ(ДатыПериодов1.Дата) КАК ДатаОкончания
ПОМЕСТИТЬ Периоды
Из ДатыПериодов КАК ДатыПериодов
     ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДатыПериодов КАК ДатыПериодов1
     ПО ДатыПериодов.Дата < ДатыПериодов1.Дата 
СГРУППИРОВАТЬ ПО
     ДатыПериодов.Дата
;
ВЫБРАТЬ
   Периоды.ДатаНачала,
   Периоды.ДатаОкончания
ИЗ Периоды КАК Периоды
   ЛЕВОЕ СОЕДИНЕНИЕ тз КАК тз
   ПО тз.ДатаНачала <= Периоды.ДатаОкончания
      и тз.ДатаОкончания >= Периоды.ДатаНачала
      и тз.Сумма < 0
ГДЕ
    тз.ДатаНачала ЕСТЬ NULL
   mistеr
 
3 - 28.09.20 - 10:09
   Антиквар
 
4 - 28.09.20 - 12:33
(2),(3) Спасибо, надо переварить :)
   mistеr
 
5 - 28.09.20 - 12:39
В одной большой системе, с которой я работал (не 1С), большинство таблиц были с периодами. И эти пересечения нужно было делать почти в каждом запросе. Скажем, три-четыре таблицы с периодами, и пара обычных. И сидишь, херачишь простыню... Где-то ошибся, и результат неверный. И при отладке все возможные случаи проверить. И чтобы план при этом был нормальный.

Как вспомню, так вздрогну.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.