Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Запрос: условие на реквизит одного из регистраторов

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

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


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

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

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

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



Запрос.Текст =
"ВЫБРАТЬ
|    ФактическиеОтпуска.Сотрудник КАК Сотрудник,
|    ФактическиеОтпуска.Количество КАК ДнейОтпуска,
|    ФактическиеОтпуска.ДатаНачала КАК ДатаС,
|    ФактическиеОтпуска.ДатаОкончания КАК ДатаПо
|ИЗ
|    РегистрНакопления.ФактическиеОтпуска КАК ФактическиеОтпуска
|ГДЕ
//|    (ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск И ФактическиеОтпуска.Регистратор.ПересчетОтп = ЛОЖЬ)

//|    И ФактическиеОтпуска.Сотрудник В(&Сотрудники)
|
//+( при таком условии не отбирает документы с другими регистраторами

|    ВЫБОР 
|КОГДА ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск 
|ТОГДА ФактическиеОтпуска.Регистратор.ПересчетОтп = ЛОЖЬ 
|ИНАЧЕ ИСТИНА 
|КОНЕЦ
//+)

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


Запрос.Текст =
"ВЫБРАТЬ
|    ФактическиеОтпуска.Сотрудник КАК Сотрудник,
|    ВЫБОР
|        КОГДА ВЫРАЗИТЬ(ФактическиеОтпуска.ВидЕжегодногоОтпуска КАК Справочник.ВидыОтпусков).НаименованиеПолное = """"
|            ТОГДА ВЫРАЗИТЬ(ФактическиеОтпуска.ВидЕжегодногоОтпуска КАК Справочник.ВидыОтпусков).Наименование
|        ИНАЧЕ ВЫРАЗИТЬ(ФактическиеОтпуска.ВидЕжегодногоОтпуска КАК Справочник.ВидыОтпусков).НаименованиеПолное
|    КОНЕЦ КАК ВидОтпуска,
|    ФактическиеОтпуска.РабочийПериодС КАК РабочийГодС,
|    ФактическиеОтпуска.РабочийПериодПо КАК РабочийГодПо,
|    ФактическиеОтпуска.Количество КАК ДнейОтпуска,
|    ФактическиеОтпуска.ДатаНачала КАК ДатаС,
|    ФактическиеОтпуска.ДатаОкончания КАК ДатаПо,
|    ФактическиеОтпуска.Регистратор.Номер КАК НомерПриказа,
|    ФактическиеОтпуска.Регистратор.Дата КАК ДатаПриказа,
|    ФактическиеОтпуска.Регистратор.ПродлениеОтпуска КАК ПродлениеОтпуска,
|    ФактическиеОтпуска.Регистратор.ПереносОтпуска КАК ПереносОтпуска,
|    ВЫРАЗИТЬ(ФактическиеОтпуска.Основание КАК СТРОКА(1024)) КАК Основание
|ИЗ
|    РегистрНакопления.ФактическиеОтпуска КАК ФактическиеОтпуска
|ГДЕ
//|    (ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск И ФактическиеОтпуска.Регистратор.ПересчетОтп = ЛОЖЬ)

//|    И ФактическиеОтпуска.Сотрудник В(&Сотрудники)
|
//(+

|    ВЫБОР 
|КОГДА ФактическиеОтпуска.Регистратор ССЫЛКА Документ.Отпуск 
|ТОГДА ФактическиеОтпуска.Регистратор.ПересчетОтп = ЛОЖЬ 
|ИНАЧЕ ИСТИНА 
|КОНЕЦ
//)+

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

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

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

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

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

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


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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует