Имя: Пароль:
1C
1С v8
Выборка из регистра сведений
0 User_Agronom
 
12.08.14
15:28
Есть регистр сведений (независимый, периодический):
Измерение: Объект (тип ДокументСсылка.РеализацияТиУ)
Ресурс:    Статус (перечисление: значения "А","Б","С","Д","Е","Ф")

Нужно:
для всех записей в которых статус равен "Б" или "Е" найти самую молодую.
ВЫБРАТЬ
    Таблица1.ДокОбъект,
    МАКСИМУМ(Таблица1.ДатаПоследнегоИзменения) КАК ДатаП
ИЗ
    (ВЫБРАТЬ
        СР.Период КАК ДатаПоследнегоИзменения,
        СР.Объект КАК ДокОбъект
    ИЗ
        РегистрСведений.ИмяРегистра КАК СР
    ГДЕ
        (СР.Статус =  ЗНАЧЕНИЕ(Перечисление.Имя.Б
                ИЛИ СР.Статус = ЗНАЧЕНИЕ(Перечисление.Имя.Е)) КАК Таблица1

СГРУППИРОВАТЬ ПО
    Таблица1.ДокОбъект

В принципе получается почти что нужно, но нет колонки статуса.
Полдня думаю как добавить, получается медленно и громозко.

Нужен совет.
1 Господин ПЖ
 
12.08.14
15:36
ловите наркомана
2 Classic
 
12.08.14
15:38
Что делать, если самой молодой записи две с разными статусами?
3 User_Agronom
 
12.08.14
15:40
(1) Алкоголика))
(2) Регистр периодический. В одну секунду не может две записи с одним объектом. А если секунды разные, тогда можно определить что моложе.
4 Господин ПЖ
 
12.08.14
15:40
ловите второго наркомана
5 User_Agronom
 
12.08.14
15:41
(4) А слабо каждые 15 мин писать про ловлю наркоманов?
6 Fram
 
12.08.14
15:51
классическая задачка на умение строить запросы
7 User_Agronom
 
12.08.14
15:54
(6) Не умею. Поучусь.
Запрос я написал: я этот регистр сюда добавил левым соединением по объекту и периоду.

Но работает долго.
8 Drac0
 
12.08.14
15:54
(0) СрезПервых(<НачалоПериода>, <Отбор>) ?
9 Irbis
 
12.08.14
15:54
(5) А слабо без форум сделать?
10 Fram
 
12.08.14
15:56
(8) СрезПоследних ему нужен
11 Drac0
 
12.08.14
15:59
(10) "найти самую молодую." Да?
12 User_Agronom
 
12.08.14
16:00
(10) Срез последних и в параметрах виртуальной таблицы указать отбор?
13 Fram
 
12.08.14
16:04
(11) ну как думаешь кто моложе, 1960 года рождения или 2000?
14 Fram
 
12.08.14
16:04
(12) да
15 Fram
 
12.08.14
16:06
(12) только вот непонятно тебе в рамках Объекта или нет? если нет, то СрезПоследних не катит
16 User_Agronom
 
12.08.14
16:08
(15) Что значит в рамках объекта? У меня так не получалось. Выдавал неправильный результат
17 Fram
 
12.08.14
16:10
(16) ну самую "молодую" для каждого Объекта или по всей таблице?
18 Drac0
 
12.08.14
16:11
(13) Блин :)
19 User_Agronom
 
12.08.14
16:13
Для каждого объекта.
20 User_Agronom
 
12.08.14
16:16
Только что ещё раз попробовал.

РегистрСведений.ИмяРегистра.СрезПоследних(&НаДату,Статус = ЗНАЧЕНИЕ(Перечисление.Имя.Б)    ИЛИ Статус = ЗНАЧЕНИЕ(Перечисление.Имя.Е))

На каждый объект бывает и по две записи - одна со статусом "Б", другая "Е"
21 Fram
 
12.08.14
16:17
(19) Тады все просто - СрезПоследних
22 RomanYS
 
12.08.14
16:17
(0) срезпоследних, условие на статус в условия вирт. таблицы
23 RomanYS
 
12.08.14
16:23
(20) срез вернет одну - самую "молодую"
24 Borteg
 
12.08.14
16:24
Выбрать
Статус где?
25 User_Agronom
 
12.08.14
16:26
(22) см (20)
26 Fram
 
12.08.14
16:36
(20) если ты нас в (0) не обманул и Статус это ресурс, то не должно быть
27 User_Agronom
 
12.08.14
16:39
(26) Да, к сожалению обманул. Статус это измерение.
Но переделывать регистр нельзя. На нём несколько задач завязано.
28 Fram
 
12.08.14
16:41
(27) Тогда запрос не через СрезПоследних, а с соединением
29 User_Agronom
 
12.08.14
16:44
(28) См. (7)  Мне стало интересно, может как проще можно.
30 RomanYS
 
12.08.14
16:46
(27) тогда снова становится актуальным вопрос из (2)
31 User_Agronom
 
12.08.14
17:05
(30) В рамках данной задачи такое возможно только теоретически. Но тогда должен быть статус "Б".
32 bolobol
 
12.08.14
17:45
Чёт не понял проблемы, однако, не понятно и на какой момент должен быть статус Б или Е по условию, допустим - на сегодня:

ВЫБРАТЬ Регистр.Объект
ИЗ Регистр.СрезПоследних()
ГДЕ Регистр.Статус = Б ИЛИ = Е

вот и выбрали Объекты на сегодня только со статусами Б и Е, раз "на сегодня" - значит - самые молодые.
33 Fram
 
12.08.14
17:50
(32) надо еще выбрать молодого среди Б и Е
34 User_Agronom
 
12.08.14
17:53
Статус Б - отправлены документы.
Статус А - Документ изменён.

Если Документ изменён после того, как документы отправлены - нужно послать их ещё раз.

Но, кроме этого, регистр хранит много всякой мелочи - типа выдана первичка, получено что-то  и т.д.

Я бы сделал как написал в (0) Измерение и Ресурс. Но предыдущий программер решил по другому.
35 Eugene_life
 
12.08.14
18:06
(34) так, может, добавить в регистр ресурс. Для старых записей пройдешь обработкой и заполнишь его. Для новых - будешь заполнять оба (измерение и ресурс). Для др задач будет использоваться прежняя часть, а по своей ты сделаешь как надо
36 Fram
 
12.08.14
18:07
(35) жесточайший костыль получится
37 Fram
 
12.08.14
18:09
+(36) если уж переделывать регистр, то реконструировать его как надо, а не костыль приделывать
38 User_Agronom
 
12.08.14
18:26
(37) Согласен. Но это время...
39 sirsp
 
12.08.14
18:30
(7) Дык, выбери срез последних в ВТ, а свой запрос делай к ВТ, а не к регистру. Будет быстро..
40 bolobol
 
12.08.14
18:30
(33) Не сразу понял, что вы написали, но в купе с (26) стало понятно, что сие не регистр, а тупо - табличка данных с датами, на которой необходимо реализовать СрезПоследних своими силами

(35) Костыль не поможет, т.к. от наличия ресурса состав измерений, а следовательно и СрезПоследних - не поменяется.

Ну и по сути:

ВЫБРАТЬ Регистр.Объект, Мах(Регистр.Дата)
ПОМЕСТИТЬ ВТ;
ИЗ Регистр

ВЫБРАТЬ Регистр.*
ПОМЕСТИТЬ ВТ2
ИЗ ВТ ВНУТР Регистр ПО Объект И МахДата И (Статус = Б ИЛИ = Е)
// И что делать если в нужную секунду вместе с Б и/или Е  и другие статусы есть?

ВЫБРАТЬ Регистр.*
ПОМЕСТИТЬ ВТ3
ИЗ ВТ2 ВНУТР ВТ2 ПО Объект И Дата И НЕ Ресурс
// И что делать с двумя (Б и Е) в одну секунду статусами??
41 Fram
 
12.08.14
18:39
(40)
почему условие не прикрутил к первому запросу?
и зачем третий запрос?
42 bolobol
 
12.08.14
18:48
(41) В первом запросе выбирается СрезПоследних по Объекту, а в условии - да, отбор-то нужен по статусу "для всех записей в которых статус равен "Б" или "Е" найти самую молодую", а затем из них уже Мах(Дата). Да, условие в первом запросе надо. Но это не отменяет тогда третий вопрос. А второй - снят.
43 bolobol
 
12.08.14
18:51
(41) То есть, вертаемся к (20) "РегистрСведений.ИмяРегистра.СрезПоследних(&НаДату,Статус = ЗНАЧЕНИЕ(Перечисление.Имя.Б) ИЛИ Статус = ЗНАЧЕНИЕ(Перечисление.Имя.Е))"
- результат более правильный, что делать с двумя статусами (Б и Е) в одну секунду??
44 Fram
 
12.08.14
18:56
(43) Нифига не вертаемся, он признался (27), что Статус у него не ресурс, а тоже измерение
45 bolobol
 
12.08.14
19:00
(44) СрезПоследних должен быстрее получить даты последнего появления статуса из набора (Б, Е).
Потом уже по дате - внутреннее соединение со всей таблицей Регистра, а там появятся дубли, где статус Б и Е в одну секунду. И последовательности в регистре нет, т.о. - необходимо организовать некий выбор Б или Е в конечном итоге выдать в качестве результата, для этого, после соединения - результат с самим собой на предмет разности статусов и вычеркивание чего-то соединяя ещё раз результат с дублями.
46 Fram
 
12.08.14
19:01
(45) это будет лишний запрос к тем же самым данным. зачем?!
47 bolobol
 
12.08.14
20:06
(46) Хм... Затестить бы, да нет такого регистра с данными, чтоб в выполнении разницу учуять. Но выборка всегда быстрее, чем соединение с выбранными данными, так что не факт.
Ну а запрос, даже к тем же самым данным делается чтобы получить из этих данных нужную выборку, а не ту, которую до этого поимели
48 Fram
 
13.08.14
13:31
(47) а СрезПоследних это разве не соединение на уровне движка?
49 User_Agronom
 
13.08.14
14:22
Сделал временными таблицами.

Первая выбирает нужные записи (со статусами Б и Е) из регистра и помещает их в табл1. (Чтобы сразу "отсечь" ненужные элементы и уменьшить размер таблиц)

Вторая группирует табл1 по Объекту и максимуму(Периоду) помещает в табл2

И итоговая, которая к табл2 слева соединяет табл1, чтобы выставить статус.

Пояснение:
Статус "Б" = "Посланы документы электронным письмом" (пишется обработкой, которой сотрудник шлёт письма контрагентам или регламентным заданием)
Статус "Е" = "В документ внесены изменения" (пишется подпиской на событие при записи).

Соответственно, если документ менялся после того как ушло письмо - его нужно послать ещё раз.

Всем принявшим участие в обсуждении спасибо.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.