Имя: Пароль:
1C
 
Запрос выбирает лишних сотрудников
0 LivingStar
 
18.06.19
10:59
Есть запрос. По проверке выявлено что он отобрал данные по двум лишним сотрудникам, за установленный период.
Так как в запрос передается фильтр, таблица значений с нужными сотрудниками он должен отбирать данные только по ним.
Почему отбираются лишние данные запросом?

Его параметры:
ДиаграммаГантаОтборПоСправочникамСотрудников - тз с нужными сотрудниками
ДиаграммаГантаОтборСотрудников - значение "ВсеСотрудники"
НачДата - начальная дата
КонДата - конечная дата
СписокМастеров - тз с нужными сотрудниками
СписокСотрудников - пусто

////////////////////////////////////////////
////////////////////////////////////////////


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ЕСТЬNULL(СЦентр_ЗагрузкаМастеров.Документ, НЕОПРЕДЕЛЕНО) КАК Документ,
    СЦентр_ЗагрузкаМастеров.НачалоПериода КАК НачалоПериода,
    СЦентр_ЗагрузкаМастеров.КонецПериода КАК КонецПериода,
    ВЫРАЗИТЬ(РАЗНОСТЬДАТ(СЦентр_ЗагрузкаМастеров.НачалоПериода, СЦентр_ЗагрузкаМастеров.КонецПериода, СЕКУНДА) / 60 / 60 * 10 / 6 КАК ЧИСЛО(15, 2)) КАК ДлительностьЧасов,
    СЦентр_ЗагрузкаМастеров.НомерСтрокиВДокументе КАК НомерСтрокиВДокументе,
    СЦентр_ЗагрузкаМастеров.РаботаУслуга КАК РаботаУслуга,
    СотрудникиСрезПоследних.ГрафикРаботы КАК ГрафикРаботы,
    СЦентр_ЗагрузкаМастеров.ДокументОснование КАК ДокументОснование,
    ВЫБОР
        КОГДА ТИПЗНАЧЕНИЯ(ЕСТЬNULL(СЦентр_ЗагрузкаМастеров.Документ, НЕОПРЕДЕЛЕНО)) = ТИП(Документ.ЗаказПокупателя)
                ИЛИ ТИПЗНАЧЕНИЯ(ЕСТЬNULL(СЦентр_ЗагрузкаМастеров.Документ, НЕОПРЕДЕЛЕНО)) = ТИП(Документ.ЗаданиеНаРаботу)
            ТОГДА СЦентр_ЗагрузкаМастеров.Документ.СЦентр_ПринятВРаботу
        КОГДА ТИПЗНАЧЕНИЯ(ЕСТЬNULL(СЦентр_ЗагрузкаМастеров.Документ, НЕОПРЕДЕЛЕНО)) = ТИП(Документ.СЦентр_ВыездМастера)
            ТОГДА СЦентр_ЗагрузкаМастеров.Документ.ПринятВРаботу
    КОНЕЦ КАК ПринятВРаботу,
    СЦентр_ЗагрузкаМастеров.Сотрудник КАК Сотрудник,
    СЦентр_ЗагрузкаМастеров.Номенклатура КАК Номенклатура,
    СЦентр_ЗагрузкаМастеров.Характеристика КАК Характеристика
ИЗ
    РегистрСведений.СЦентр_ЗагрузкаМастеров КАК СЦентр_ЗагрузкаМастеров
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Сотрудники.СрезПоследних КАК СотрудникиСрезПоследних
        ПО СЦентр_ЗагрузкаМастеров.Сотрудник = СотрудникиСрезПоследних.Сотрудник
ГДЕ
    СЦентр_ЗагрузкаМастеров.Сотрудник В(&СписокМастеров)
    И ВЫБОР
            КОГДА &ДиаграммаГантаОтборСотрудников = "СвободныеСотрудники"
                ТОГДА СЦентр_ЗагрузкаМастеров.Сотрудник В (&СписокСотрудников)
            КОГДА &ДиаграммаГантаОтборСотрудников = "ЗанятыеСотрудники"
                ТОГДА НЕ СЦентр_ЗагрузкаМастеров.Сотрудник В (&СписокСотрудников)
            ИНАЧЕ ИСТИНА
        КОНЕЦ
    И ВЫБОР
            КОГДА &ДиаграммаГантаОтборПоСправочникамСотрудников ЕСТЬ NULL
                ТОГДА ИСТИНА
            ИНАЧЕ СЦентр_ЗагрузкаМастеров.Сотрудник В (&ДиаграммаГантаОтборПоСправочникамСотрудников)
        КОНЕЦ
    И (СЦентр_ЗагрузкаМастеров.НачалоПериода МЕЖДУ &НачДата И &КонДата)
    или (СЦентр_ЗагрузкаМастеров.КонецПериода МЕЖДУ &НачДата И &КонДата)
    или (&НачДата >= СЦентр_ЗагрузкаМастеров.НачалоПериода и &КонДата <= СЦентр_ЗагрузкаМастеров.КонецПериода)    

УПОРЯДОЧИТЬ ПО
    Сотрудник,
    НачалоПериода,
    Документ
1 Антиквар
 
18.06.19
11:04
И (СЦентр_ЗагрузкаМастеров.НачалоПериода МЕЖДУ &НачДата И &КонДата)
    или (СЦентр_ЗагрузкаМастеров.КонецПериода МЕЖДУ &НачДата И &КонДата)
    или (&НачДата >= СЦентр_ЗагрузкаМастеров.НачалоПериода и &КонДата <= СЦентр_ЗагрузкаМастеров.КонецПериода)  

Тут явно скобочек не хватает, ИЛИ срабатывает, и там уже не важно какой сотрудник
2 LivingStar
 
18.06.19
11:04
Бывает даже в запрос, передается один сотрудник. А не таблица значений с сотрудниками.
Все равно не фильтрует.
3 catena
 
18.06.19
11:07
(2)Ложь или Истина = Истина. У логических операторов, так же, как у арифметических есть порядок выполнения. Вот "или" - это сложение, а "и" - умножение. А у тебя скобочки не расставлены.
4 Simod
 
18.06.19
11:20
(2) Как уже написали в (1) у тебя в секции ГДЕ три (!) условия по ИЛИ
<CODE>
ГДЕ
   <условие 1>
   ИЛИ <условие 2>
   ИЛИ <условие 3>
</CODE>
с проверкой сотрудников только в первом условии.
5 LivingStar
 
18.06.19
11:25
сделал так

    |    И ((СЦентр_ЗагрузкаМастеров.НачалоПериода МЕЖДУ &НачДата И &КонДата)
    |    или (СЦентр_ЗагрузкаМастеров.КонецПериода МЕЖДУ &НачДата И &КонДата)
    |    или (&НачДата >= СЦентр_ЗагрузкаМастеров.НачалоПериода и &КонДата <= СЦентр_ЗагрузкаМастеров.КонецПериода))
2 + 2 = 3.9999999999999999999999999999999...