Имя: Пароль:
1C
1С v8
ЗУП, странное поведение запроса.
,
0 suvolod
 
24.08.12
12:51
Исходные данные. При приеме на работу сотруднику назначено основное начисление "Оклад по часам". С 1 августа кадровым перемещением это начисление убрали (в документе, на вкладке Начисления, напротив "оклада по часам выбрано" Действие > Прекратить.

Теперь мне нужно запросом выбрать начисления сотрудника. Пишу:

ВЫБРАТЬ
   ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник,
   ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Действие,
   ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.ВидРасчета
ИЗ
   РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(&МомВремени, Сотрудник = &Сотрудник) КАК ПлановыеНачисленияРаботниковОрганизацийСрезПоследних

В результат запроса (на 02.08.12) у меня попало начисление "Оклад по часам" с Действием = Прекратить.

Теперь я хочу отсеять такие неактуальные начисления. Пишу запрос:
ВЫБРАТЬ
   ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник,
   ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Действие,
   ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.ВидРасчета
ИЗ
   РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(&МомВремени, Сотрудник = &Сотрудник И Действие <> ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Прекратить)) КАК ПлановыеНачисленияРаботниковОрганизацийСрезПоследних

... и что вижу - в результат запроса у меня каким-то волшебным образом попадает та-же запись, но в поле действие у нее уже стоит "Начать". И сколько я не бился, так и не смог понять откуда эта запись появилась.

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

ГДЕ
   ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Действие <> ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Прекратить)

Запрос работает правильно, т.е у меня возвращается пустой результат. Одноко прошу подсказать, что не так со вторым запросом и откуда после 02.08.12 он находит запись с действием "Начать"
1 фросия
 
24.08.12
13:00
попробуй условие на вид действия перенести в ГДЕ
2 almar
 
24.08.12
13:05
(0) во втором запросе ты делаешь срез последних из всех записей с действием неравным Прекратить. И запрос его честно возвращает. В 3 запросе ты сначала получаешь срез поледних, а потом его фильтруешь оператором ГДЕ
3 suvolod
 
24.08.12
14:09
(2)almar, ты хочешь сказать, что выставляя параметры в виртуальной таблице СрезПоследних, на самом деле я фильтрую записи до получения среза? Как-то нелогично получается.. ведь тогда, чтобы правильно отработал фильтр на срез, указание фильтра в параметрах запроса не имеет смысла, т.к. в любом случае придется фильтровать повторно через ГДЕ
4 Val54321
 
24.08.12
14:15
есть начисление и действие, а есть начисление завершения и действие завершения
5 suvolod
 
24.08.12
14:19
расшифруй :)
6 suvolod
 
24.08.12
14:21
... ты имел ввиду, что мой запрос вообще построен неверно и я должен обращаться к другим полям регистра ОснНачисления?
7 Aprobator
 
24.08.12
14:22
насколько я помню, действие - ресурс. Поэтому накладывать на него условие в параметрах виртуальной таблицы - ошибка.
8 Dmitry77
 
24.08.12
14:22
ответь себе на вопрос

есть 2 записи
01.01.12 Иванов Начать 100
01.02.12 Иванов прекратить 0

во втором запросе ты сначала фильтруешь эти записи условием
(&МомВремени, Сотрудник = &Сотрудник И Действие <> ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.
получешь
01.01.12 Иванов Начать 100

а потом делаешь отобрать последнее

получаешь

01.01.12 Иванов Начать 100

в последнем,
ты фильтруешь записи условием

(&МомВремени, Сотрудник = &Сотрудник)

01.01.12 Иванов Начать 100
01.02.12 Иванов прекратить 0

потом из них отбираешь последнее

результат
01.02.12 Иванов прекратить 0

потом накладываешь условия

ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Действие <> ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Прекратить)

и не получаешь ни одной записи.
9 Aprobator
 
24.08.12
14:23
читаем ИТС внимательно, там это все описано.
10 Aprobator
 
24.08.12
14:27
а запрос реально кривой. Поскольку есть еще Действие завершения. С начислениями введеными без даты окончания действия это прокатит, а вот с дата окончания уже нет. Посмотри тот же документ начисление зарплаты - заполнение ТЧ.
11 Val54321
 
24.08.12
14:29
посмотри внимательно структуру регистра, возьми в запросе выведи все поля и сразу поймешь в чем дело
12 suvolod
 
24.08.12
14:30
(8),(9) спасибо
(9)не подскажешь, в какой статье на ИТС разобрана моя ситуация с запросом?
13 Aprobator
 
24.08.12
14:36
(12) там было описание запросов еще по 8.1.. Статью уже не помню. Но было в методических рекомендациях по программированию вроде.
14 dnab
 
24.08.12
14:36
там в измерениях ДокументОснование. Зачем это сделано я так и не понял
15 Aprobator
 
24.08.12
14:37
кратко суть по твоей теме - в параметрах виртуальной таблицы условие накладывается только на измерения.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс