Имя: Пароль:
1C
1С v8
Выборка данных по нескольким периодам
, ,
0 KoBapeH
 
21.07.15
12:02
Есть периодический (посекундно), независимый регистр сведений "СостояниеНоменклатуры", в котором заносятся изменения состояния номенклатуры и время, когда это было выполнено. Суть вопроса: надо выбрать обороты из регистра партий товаров, когда номенклатура имела определенное состояние. Сложность заключается в том, что промежутков, когда позиция имела конкретное состояние может быть несколько. И не понятно, как связать регистры в одном запросе. А делать циклы для получения оборотов по каждому промежутку не очень хочется.
1 palpetrovich
 
21.07.15
12:08
а зачем циклы, объеденить в запросе должно помомь ..наверное :)
2 sapphire
 
21.07.15
12:14
(0) В чьом сложност?
1. Формируем диапазоны когда Номенклатура имела нужное состояние и индексируем по Номенклатуре и началу и окончанию периода

2. Левым соединением выбрать обороты из регистра партий товаров период между периодами состояния и номенклатура.

Всё.
3 KoBapeH
 
21.07.15
16:56
(2) не совсем понятно, как это может выглядеть в запросе.
4 KoBapeH
 
21.07.15
17:00
(2) это по пункту 1, если что.
5 KoBapeH
 
21.07.15
17:07
(2) т.е. вы предлагаете создать таблицу значений с номенклатурой и периодами, где каждой строке будет соответствовать один период, когда номенклатура была в нужном состоянии, а затем через временную таблицу запихнуть в запрос и через левое соединение к ней подвязывать обороты?
6 Лефмихалыч
 
21.07.15
17:09
Задача дикая какая-то. На больших объемах нет вариантов ее решить эффективно, не накапливая такие обороты отдельно.
7 KoBapeH
 
21.07.15
17:12
(6) да хочется попробовать сделать не допиливая обороты. Тут просто самому интересно стало.
8 Лефмихалыч
 
21.07.15
17:14
(7) да даже, если рядом положишь регистр, который будет копить обороты в периоды, когда есть эти состояния, задача все равно нерешабельная, т.к. в независимом регистре в любой момент все может поменяться непредсказуемым способом.

С постановкой у тебя беда бедовая. Тебе, судя по всему, вместо того, чтобы задачу поставить, предложили готовое техническое решение люди, которые в таких решениях не компетентны.
9 Лефмихалыч
 
21.07.15
17:15
тут задача скорее не в получении оборотов, а в этих состояниях - они реализованы таким способом, который не предполагает требуемого учета.
10 palpetrovich
 
21.07.15
17:50
в порядке бреда к концу дня :)

ВЫБРАТЬ
    СостояниеНоменклатуры.ВремяНачала,
    СостояниеНоменклатуры.ВремяОкончания,
    ПартииТоваровНаСкладахОбороты.Номенклатура,
    ПартииТоваровНаСкладахОбороты.КоличествоОборот
ИЗ
    РегистрСведений.СостояниеНоменклатуры КАК СостояниеНоменклатуры
левое СОЕДИНЕНИЕ
    РегистрНакопления.ПартииТоваровНаСкладах.Обороты( &Дата1,  &Дата2, Запись, ) КАК ПартииТоваровНаСкладахОбороты
ПО
    ПартииТоваровНаСкладахОбороты.Номенклатура = СостояниеНоменклатуры.Номенклатура
И    
    ПартииТоваровНаСкладахОбороты.Период МЕЖДУ СостояниеНоменклатуры.ВремяНачала И СостояниеНоменклатуры.ВремяОкончания
ГДЕ
    СостояниеНоменклатуры.Активность
11 Ildarovich
 
22.07.15
13:54
Вопрос не сложный. Есть два пути:
1) из регистра сведений "состояния номенклатуры" получить все интервалы, когда номенклатура имела имела нужные состояния. Это делается соединением состояний с собой по номенклатуре и группировкой с выбором в качестве времени окончания минимума бОльших времен. Далее запрос типа (10).
2) если состояния номенклатуры меняются чаще, чем раз в месяц или примерно столько же, то может быть выгоднее работать не с виртуальной таблицей оборотов, а с реальной таблицей движений регистра. Тогда к каждому движению можно приписать соответствующее ему в данный момент состояние номенклатуры обычным приемом мультисрезов последних. Например, кореллированным запросом как в http://forum.infostart.ru/forum24/topic36354/message1387849/#message1387849.
2 + 2 = 3.9999999999999999999999999999999...