Имя: Пароль:
1C
1С v8
Помогите разобраться с Запросом...
0 Darhon
 
26.07.13
09:40
Доброе время суток. Такая ситуация есть запрос который формирует список сотрудников работающих в организации в течении заданного интервала времени. 1С 8.2 ЗУП Почему-то не осуществляется отбор по организации, хотя параметр задается на форме полевыбора организация заполняется. В выборку все равно попадают все сотрудники. Вот текст запроса:


     Запрос=Новый запрос;
     Запрос.Текст="ВЫБРАТЬ
                  |    РаботникиОрганизацийСрезПоследних.Сотрудник.Ссылка КАК Сотрудник,
                  |    РаботникиОрганизацийСрезПоследних.Сотрудник.Наименование,
                  |    РаботникиОрганизацийСрезПоследних.Сотрудник.Физлицо.Ссылка КАК ФизЛицо,
                  |    РаботникиОрганизацийСрезПоследних.Организация.Ссылка КАК Организация,
                  |    РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния.Ссылка,
                  |    РаботникиОрганизацийСрезПоследних.Сотрудник.Должность.Наименование КАК Должность
                  |ИЗ
                  |    РегистрСведений.РаботникиОрганизаций.СрезПоследних(&НачПериода, ) КАК РаботникиОрганизацийСрезПоследних
                  |ГДЕ
                  | РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> &Увольнение
                  | ОБЪЕДИНИТЬ
                  | ВЫБРАТЬ
                  | РаботникиОрганизаций.Сотрудник.Ссылка КАК Сотрудник,
                  |    РаботникиОрганизаций.Сотрудник.Наименование,
                  |    РаботникиОрганизаций.Сотрудник.Физлицо.Ссылка КАК ФизЛицо,
                  |    РаботникиОрганизаций.Организация.Ссылка КАК Организация,
                  |    РаботникиОрганизаций.ПричинаИзмененияСостояния.Ссылка,
                  |    РаботникиОрганизаций.Сотрудник.Должность.Наименование КАК Должность
                  | ИЗ
                  |РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
                  |ГДЕ          
                  |РаботникиОрганизаций.ПричинаИзмененияСостояния = &Прием
                  |И РаботникиОрганизаций.Период > &НачПериода
                  |И РаботникиОрганизаций.Период <= &КонПериода
                  |И РаботникиОрганизаций.Организация = &Организация
                  |";                                   
                  Запрос.УстановитьПараметр("Организация",Организация);
                  Запрос.УстановитьПараметр("НачПериода",НачПериода);
                  Запрос.УстановитьПараметр("КонПериода",КонПериода);
                  Запрос.УстановитьПараметр("Увольнение", Перечисления.ПричиныИзмененияСостояния.Увольнение);
                  Запрос.УстановитьПараметр("Прием", Перечисления.ПричиныИзмененияСостояния.ПриемНаРаботу);

                  Выборка=Запрос.Выполнить().Выбрать();


Заранее спасибо.

P.S. И еще подскажите как вытащить из ЗУП основную организация (ну иили аналог)...
1 Ненавижу 1С
 
гуру
26.07.13
09:42
потому что в первой части нет условия на организацию
2 rikodroo
 
26.07.13
09:44
Что-то типа этого надо в первом наверное:

РегистрСведений.РаботникиОрганизаций.СрезПоследних(&НачПериода, Организация = &Организация )
3 Darhon
 
26.07.13
09:44
Блин, я почему-то думал раз запрос с объединением достаточно одного условия :( Значит он как-то по другому работает чем я себе представлял :)
4 ДенисЧ
 
26.07.13
09:45
(3) Надо не представлять, а думать :-)
5 Ненавижу 1С
 
гуру
26.07.13
09:47
(4) надо ЗНАТЬ, в данном случае
6 ДенисЧ
 
26.07.13
09:51
(5) Достаточно подумать. А знание придёт в процессе
7 cw014
 
26.07.13
09:52
(6) Надо сначала представить, потом подумать, потом почитать все таки умные книжки, а потом уже ЗНАТЬ )))
8 Капитан О
 
26.07.13
09:56
(5) (6) (7) умные какие. надо создать ветку на мисте. всё!
9 Darhon
 
26.07.13
12:14
:)) Спасибо всем за предыдущие разъяснения...но проблема еще и в следующем. Запрос выбирает не последнюю должность сотрудника, то есть если в интервале временном было кадровое перемещение, он его игнорирует и выбирает по должности на которую человека принимали на работу, и еще много сотрудников у которых запрос выдает пустую должность, хотя в справочнике сотрудников должность указана. Пустая должность выдается только после повторного вызова процедуры с запросом, когда процедура вызывается из ПриОткрытии пустых должностей нет...
10 Darhon
 
26.07.13
12:36
Подниму тему, за назойливость прошу прощения, но разобраться край как нужно :)
11 Бертыш
 
26.07.13
13:15
А ты какую должность хочешь вывести? В справочнике должность это тьфу, она там справочно, когда хочу тогда меняю. Что бы выбрать должность на какой-то момент надо знать момент на который ты хочешь её получить. Что ты хочешь короче.
12 Darhon
 
26.07.13
13:17
Последнюю должность на которой человек работает. Но это должно быть в рамках периода НачДата и КонДата. То есть приняли его менеджером, потом перевели старшим менеджером, запрос должен выдать старшего менеджера...а у меня выдает менеджера... Да и еще эти пустые значения в должностях непонятно почему вылазят :((
13 Darhon
 
26.07.13
13:21
Про пустые значения: Открываем справочник сотрудников организации находим человека, у него должность директор. Открываем форму отчета, приоткрытии вызывается этот же запрос, директор попадает в список нужных сотрудников, нажимаем кнопку перезаполнить, вызывается этот запрос еще раз, директор не попадает, смотрим отладчиком, а должность null....
14 Бертыш
 
26.07.13
13:36
(12) Пустые значения это могут быть увольнения
У тебя есть сотрудники по которым:
А) были кадровые перемещения.
Б) не было кадровых перемещений

С сотрудниками Б промашка состоит в том что при срезе ты получаешь всех сотрудников, в том числе и из группы А
Соответственно тебе сначала надо определится кто у тебя входит в группу А и исключить их из среза
Условие Сотрудник не в А
Следовательно А должно быть временной таблицей для пущей скорости выполнения ввиду того что А нам нужны наложить фильтр на срез и А нам нужны вывести

Рассмотрим А А меняет должность в периоде. Нужно выбрать движения. При этом А может менять должность в периоде более одного раза. Нужно собрать таблицу всех изменений должностей кроме случаев с увольнением. Таблица вида
Дата,Должность,Сотрудник
Она нам так же понадобится более чем один раз, то есть временная таблица
Выбираем максимальную дату изменения должности, игнорируя расхождения в должностях, то есть Максимум(Дата),Сотрудник
Далее соединяя полученный максимум даты по равенству с исходной таблицей получаем из исходной таблицы должность на дату максимума
Итак мы получили перечень А кто менял должность в интервале и какая самая последняя должность. Сохраняем во временную таблицу
Далее берем срез должностей всех сотрудников данной организации на конец периода (не обязательно на начало брать всё равно мы отсекаем тех у кого менялась должность)
Ставим условие что в срезе не входящие в А
Итак мы получили список Б
Итак есть список А и список Б
Осталось их объединить
Главное при этом не забывать учитывать что запись может соответствовать как основной должности так и внутреннему совместителю, а для внешнего совместителя правила те же что и для основного сотрудника
15 Бертыш
 
26.07.13
13:37
Надеюсь я понятно всё объяснил?
16 Бертыш
 
26.07.13
13:40
Кстати вместо задания перечисления в качестве параметра можно использовать конструкцию языка запросов ЗНАЧЕНИЕ()
17 Бертыш
 
26.07.13
13:46
Срез на начало предпочтительнее среза на конец ввиду наличия должностей уволенных в периоде сотрудников Если они конечно тебе нужны и дороги
18 Darhon
 
26.07.13
13:56
Да...понятно :) Спасибо...буду реализовывать :)
19 Darhon
 
26.07.13
15:05
Блин, а для помещения во временную таблицу в каком из 2 ИЗ нужно писать ПОМЕСТИТЬ ))
20 Галахад
 
гуру
26.07.13
15:06
(19) Пользуйся построителем.