Имя: Пароль:
1C
1С v8
Запрос: условие на реквизит одного из регистраторов
0 dft2014
 
06.09.16
17:26
Регистр накопления "ФактическиеОтпуска" содержит разные документы-регистраторы. Как мне в запросе добавить такое условие: отбирать по всем регистраторам, но если регистратором будет документ "Отпуск", то отбирать только те отпуска, у которых реквизит ПересчетОтп = ЛОЖЬ.

Вот мой код, но он почему-то не видит остальные регистраторы, кроме Отпуска:


Запрос.Текст =
"ВЫБРАТЬ
|    ФактическиеОтпуска.Сотрудник КАК Сотрудник,
|    ФактическиеОтпуска.Количество КАК ДнейОтпуска,
|    ФактическиеОтпуска.ДатаНачала КАК ДатаС,
|    ФактическиеОтпуска.ДатаОкончания КАК ДатаПо
|ИЗ
|    РегистрНакопления.ФактическиеОтпуска КАК ФактическиеОтпуска
|ГДЕ
|    (ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск И ФактическиеОтпуска.Регистратор.ПересчетОтп = ЛОЖЬ)
|    И ФактическиеОтпуска.Сотрудник В(&Сотрудники)
|
|ОБЪЕДИНИТЬ ВСЕ
|    ВЫБРАТЬ
|    РеестрОтпусков.Сотрудник,
|   РеестрОтпусков.КоличествоДнейОтпуска КАК ДнейБиР,
|    РеестрОтпусков.ДатаНачалаПериодаОтсутствия КАК ДатаНачалаБиР,
|    РеестрОтпусков.ДатаОкончанияПериодаОтсутствия КАК ДатаОкончанияБиР
|ИЗ
|    РегистрСведений.РеестрОтпусков КАК РеестрОтпусков
|ГДЕ
|    РеестрОтпусков.Регистратор ССЫЛКА Документ.БольничныйЛист
|    И РеестрОтпусков.Сотрудник В(&Сотрудники)
|УПОРЯДОЧИТЬ ПО
|    ДатаС";
1 Amra
 
06.09.16
17:32
А что ты хотел при "ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск" в "ГДЕ"?
2 f_vadim
 
06.09.16
17:34
ВЫБОР
КОГДА ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск
ТОГДА ФактическиеОтпуска.Регистратор.ПересчетОтп = ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ
3 Дык ё
 
06.09.16
17:36
выразить?
4 dft2014
 
07.09.16
09:59
(2) Не совсем то решение.

В док-те "Отпуск" есть новый реквизит "ПересчетОтп"(тип булево). В некоторых отпусках он ИСТИНА, в некоторых ЛОЖЬ. В запросе, мне надо добавить условие:  

Если регистратором является документ "Отпуск", то отобрать только те отпуска, у которых реквизит ПересчетОтп = ЛОЖЬ.
Если регистратором является любой другой документ, то это условие не нужно.
5 Ёпрст
 
07.09.16
10:01
(4) это именно то, что ты просишь
6 dft2014
 
07.09.16
10:08
(5) в условии (4) во всех отпусках будет видеть ПересчетОтп = ЛОЖЬ. А мне не так надо!
7 dft2014
 
07.09.16
10:09
Я так думаю, надо что-то вроде такого условия:
Если (ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск И ФактическиеОтпуска.Регистратор.ПересчетОтп = ЛОЖЬ) Тогда
8 Ёпрст
 
07.09.16
10:11
(6) нет
9 Ёпрст
 
07.09.16
10:11
Смотри вниматочнее, это условие
10 Мыш
 
07.09.16
10:21
Переформулируем )
ВЫБОР
КОГДА ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск
ТОГДА НЕ ФактическиеОтпуска.Регистратор.ПересчетОтп
ИНАЧЕ ИСТИНА
КОНЕЦ
11 ViSo76
 
07.09.16
10:33
(10) Если много регистраторов, то скорее всего так:

ГДЕ
...
ВЫБОР
  КОГДА ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск
  ТОГДА НЕ ВЫРАЗИТЬ(ФактическиеОтпуска.Регистратор КАК Документ.Отпуск).ПересчетОтп
  ИНАЧЕ ИСТИНА
КОНЕЦ
12 Ёпрст
 
07.09.16
10:39
(11) че за бредятина ?
13 dft2014
 
07.09.16
10:39
(2) Изменила свой запрос из (0) на ваше условие из (2): при таком условии не отбирает документы с другими регистраторами, тянет только Регистраторы = Отпуск.



Запрос.Текст =
"ВЫБРАТЬ
|    ФактическиеОтпуска.Сотрудник КАК Сотрудник,
|    ФактическиеОтпуска.Количество КАК ДнейОтпуска,
|    ФактическиеОтпуска.ДатаНачала КАК ДатаС,
|    ФактическиеОтпуска.ДатаОкончания КАК ДатаПо
|ИЗ
|    РегистрНакопления.ФактическиеОтпуска КАК ФактическиеОтпуска
|ГДЕ
//|    (ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск И ФактическиеОтпуска.Регистратор.ПересчетОтп = ЛОЖЬ)
//|    И ФактическиеОтпуска.Сотрудник В(&Сотрудники)
|
//+( при таком условии не отбирает документы с другими регистраторами
|    ВЫБОР
|КОГДА ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск
|ТОГДА ФактическиеОтпуска.Регистратор.ПересчетОтп = ЛОЖЬ
|ИНАЧЕ ИСТИНА
|КОНЕЦ
//+)
|
|ОБЪЕДИНИТЬ ВСЕ
|    ВЫБРАТЬ
|    РеестрОтпусков.Сотрудник,
|   РеестрОтпусков.КоличествоДнейОтпуска КАК ДнейБиР,
|    РеестрОтпусков.ДатаНачалаПериодаОтсутствия КАК ДатаНачалаБиР,
|    РеестрОтпусков.ДатаОкончанияПериодаОтсутствия КАК ДатаОкончанияБиР
|ИЗ
|    РегистрСведений.РеестрОтпусков КАК РеестрОтпусков
|ГДЕ
|    РеестрОтпусков.Регистратор ССЫЛКА Документ.БольничныйЛист
|    И РеестрОтпусков.Сотрудник В(&Сотрудники)
|УПОРЯДОЧИТЬ ПО
|    ДатаС";
14 Ёпрст
 
07.09.16
10:39
там выразить нафик не упало, ибо выше уже идёт сравнение на нужный тип документа
15 Ёпрст
 
07.09.16
10:41
(13) при таком коде - ошибка синтаксиса. Показывайте тот запрос, который выполняете, а не копипасту неизвестно откуда.
16 LordCMEPTb
 
07.09.16
10:49
(12) Судя по https://kb.1c.ru/articleView.jsp?id=44 именно такая бредятина и нужна, чтобы цеплялся только 1 таблица документа.
17 Ёпрст
 
07.09.16
10:52
(16) ну-ну, после case там и так всегда будет 1 таблица документа
18 dft2014
 
07.09.16
10:55
(15) Это и есть исходный запрос! Почему прочие регистраторы не видит?
19 Ёпрст
 
07.09.16
10:56
(18) Ну вот только врать то не надо ?
В этом запросе не верно написано условие.
20 Ёпрст
 
07.09.16
10:57
Покажите тот запрос, что выполняете.
21 dft2014
 
07.09.16
11:06
(20) я просто убрала из запроса лишние строчки, для читаемости запроса на форуме. А весь запрос выглядит так:


Запрос.Текст =
"ВЫБРАТЬ
|    ФактическиеОтпуска.Сотрудник КАК Сотрудник,
|    ВЫБОР
|        КОГДА ВЫРАЗИТЬ(ФактическиеОтпуска.ВидЕжегодногоОтпуска КАК Справочник.ВидыОтпусков).НаименованиеПолное = """"
|            ТОГДА ВЫРАЗИТЬ(ФактическиеОтпуска.ВидЕжегодногоОтпуска КАК Справочник.ВидыОтпусков).Наименование
|        ИНАЧЕ ВЫРАЗИТЬ(ФактическиеОтпуска.ВидЕжегодногоОтпуска КАК Справочник.ВидыОтпусков).НаименованиеПолное
|    КОНЕЦ КАК ВидОтпуска,
|    ФактическиеОтпуска.РабочийПериодС КАК РабочийГодС,
|    ФактическиеОтпуска.РабочийПериодПо КАК РабочийГодПо,
|    ФактическиеОтпуска.Количество КАК ДнейОтпуска,
|    ФактическиеОтпуска.ДатаНачала КАК ДатаС,
|    ФактическиеОтпуска.ДатаОкончания КАК ДатаПо,
|    ФактическиеОтпуска.Регистратор.Номер КАК НомерПриказа,
|    ФактическиеОтпуска.Регистратор.Дата КАК ДатаПриказа,
|    ФактическиеОтпуска.Регистратор.ПродлениеОтпуска КАК ПродлениеОтпуска,
|    ФактическиеОтпуска.Регистратор.ПереносОтпуска КАК ПереносОтпуска,
|    ВЫРАЗИТЬ(ФактическиеОтпуска.Основание КАК СТРОКА(1024)) КАК Основание
|ИЗ
|    РегистрНакопления.ФактическиеОтпуска КАК ФактическиеОтпуска
|ГДЕ
//|    (ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск И ФактическиеОтпуска.Регистратор.ПересчетОтп = ЛОЖЬ)
//|    И ФактическиеОтпуска.Сотрудник В(&Сотрудники)
|
//(+
|    ВЫБОР
|КОГДА ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск
|ТОГДА ФактическиеОтпуска.Регистратор.ПересчетОтп = ЛОЖЬ
|ИНАЧЕ ИСТИНА
|КОНЕЦ
//)+
|
|ОБЪЕДИНИТЬ ВСЕ
|    ВЫБРАТЬ
|    РеестрОтпусков.Сотрудник,
|    1,
|    РеестрОтпусков.НачалоПериодаЗаКоторыйПредоставляетсяОтпуск КАК РабГодСБиР,
|    РеестрОтпусков.КонецПериодаЗаКоторыйПредоставляетсяОтпуск КАК РабГодПоБиР,
|   РеестрОтпусков.КоличествоДнейОтпуска КАК ДнейБиР,
|    РеестрОтпусков.ДатаНачалаПериодаОтсутствия КАК ДатаНачалаБиР,
|    РеестрОтпусков.ДатаОкончанияПериодаОтсутствия КАК ДатаОкончанияБиР,
|    РеестрОтпусков.Регистратор.Номер КАК НомерПриказаБиР,
|    РеестрОтпусков.Регистратор.Дата КАК ДатаПриказаБиР,
|   0,
|   0,
|    РеестрОтпусков.Основание КАК ОснованиеБиР
|ИЗ
|    РегистрСведений.РеестрОтпусков КАК РеестрОтпусков
|ГДЕ
|    РеестрОтпусков.Регистратор ССЫЛКА Документ.БольничныйЛист
|    И РеестрОтпусков.Сотрудник В(&Сотрудники)
|УПОРЯДОЧИТЬ ПО
|    ДатаС";
22 Ёпрст
 
07.09.16
11:12
(21)Ты не поверишь - но тут тоже ошибка синтаксиса из-за неправильного условия. Еще варианты будут ?
23 FIXXXL
 
07.09.16
11:13
решение в лоб:
ЕСТЬNULL(ФактическиеОтпуска.Регистратор.ПересчетОтп, ЛОЖЬ)
потом отбор по ЛОЖЬ

если я правильно понял условия
24 Ёпрст
 
07.09.16
11:13
И во втором запросе псевдонимы полей не нужны.
И, наконец. пользуйся ужо конструктором запросов - он сразу тебе ошибку синтаксиса выдаст. И "причешет" твой текст запроса
25 dft2014
 
07.09.16
11:52
(23) Да, все верно! Так и надо мне! Только не знаю как сделать:

1) добавить, что выполнять условие ЕСТЬNULL(ФактическиеОтпуска.Регистратор.ПересчетОтп, ЛОЖЬ), только если ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск.

2) и как потом делать второй отбор по ЛОЖЬ?
26 dft2014
 
07.09.16
11:53
Конструктор запросов мне ошибку не выдает ))
27 Ёпрст
 
07.09.16
11:54
(25) ты не поверишь, ответ в (4).

Просто ты так  и не показала текст запроса, который реально выполняешь
28 xafavute
 
07.09.16
11:54
сравнение на тип НЕ ОТМЕНЯЕТ необходимость выразить
Ибо SQL - это не построчное выполнение
29 Ёпрст
 
07.09.16
11:55
(26) врешь ведь. То что написано в (21) - с ошибкой в условии.
30 dft2014
 
07.09.16
13:35
(27) ответ в (4) - это мой вопрос :)

Исходный текст запроса я уже выложила в (21). И ... что-то вы меня совсем запутали с условиями...
31 Ёпрст
 
07.09.16
13:42
(30)Тот , что в (21) - не рабочий. Выложите текст запроса после конструктора.
32 Ёпрст
 
07.09.16
13:42
И да, решение в (2)
33 FIXXXL
 
07.09.16
17:38
(25)
1) выражением получаешь поле с Ложь-Истина, Истину вернут только доки, в которых есть реквизит ПересчетОтп и этот реквизит=Истина
2) фильтруешь по этому полю, как я понял, тебе только Ложь нужно
34 FIXXXL
 
07.09.16
17:40
(33) + или есть еще регистраторы с таким полем? тогда немного усложнится отбор во втором пункте: Ложь + условие по ССЫЛКА НужныйТипДокумента
35 PR
 
07.09.16
17:44
Мда, колхоз "Северное пламя".
Чем (2)-то не устраивает?
36 youalex
 
07.09.16
18:00
имхо, нагляднее будет левосоединить:
"ИЗ   РегистрНакопления.ФактическиеОтпуска КАК ФактическиеОтпуска
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Отпуск КАК ДокОтпуск
...
ГДЕ isnull(ДокОтпуск.ПересчетОтп, ЛОЖЬ) = ЛОЖЬ


2) Через Выразить (неявное соединение):
ГДЕ isnull(ВЫРАЗИТЬ(Регистратор КАК Документ.Отпуск).ПересчетОтп, ЛОЖЬ) = ЛОЖЬ