Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

МоментВремени в условии ГДЕ в Запросе.

МоментВремени в условии ГДЕ в Запросе.
Я
   PuhUfa
 
20.07.20 - 17:14
Есть простой запрос:

ТекстЗапроса = ТекстЗапроса +
    "ВЫБРАТЬ
    |    ОтбираемыйДокумент.Ссылка
    |ПОМЕСТИТЬ ТаблицаДокументов
    |ИЗ
    |    Документ.РеализацияТоваров КАК ОтбираемыйДокумент
    |ГДЕ
    |    ОтбираемыйДокумент.Проведен
    |    И ОтбираемыйДокумент.МоментВремени >= &ДатаНачала
    |    И ОтбираемыйДокумент.МоментВремени <= &ДатаОкончания
    |";

ДатаНачала и ДатаОкончания - МоментВремени
Запрос работает, вот только в выборку не попадают документы на основании которых создан момент времени.
Делал через МЕЖДУ - результат тот же.
Это нормально и просто нужно смириться или как то можно в результат запроса включить граничные документы?
   lodger
 
1 - 20.07.20 - 17:20
ВидГраницы - Определяет набор видов границ по отношению к граничному значению:
ВидГраницы.Включая - Граница включает граничное значение.
ВидГраницы.Исключая - Граница исключает граничное значение.
   PuhUfa
 
2 - 20.07.20 - 17:23
(1) и с чем сравнивать Границу в условии ГДЕ? Что при сравнении с Дата, что при сравнении с МоментВремени получаю ошибку о том, что сравнивать можно только одинаковые типы.
   ZDenis
 
3 - 20.07.20 - 17:23
Запрос.УстановитьПараметр("ДатаНачала", Новый Граница(Отчет.НачалоПериода, ВидГраницы.Включая) );
Запрос.УстановитьПараметр("ДатаОкончания", Новый Граница(Отчет.КонецПериода, ВидГраницы.Включая) );
   RomanYS
 
4 - 20.07.20 - 17:40
(0) Условие ">=" вроде корректно работает с моментами, а вот "<=" почему-то возвращает ложь при равенстве.
Делай отдельно условия на дату и на ссылку.
   PuhUfa
 
5 - 20.07.20 - 17:43
(4) Понятно. Значит буду извращаться. Спс.
   fisher
 
6 - 20.07.20 - 17:43
(0)(4) Странно. Выглядит ненормально. Но я в таком варианте и не использовал никогда.
   PuhUfa
 
7 - 20.07.20 - 17:46
(6) Как минимум не логично это выглядит -)
   RomanYS
 
8 - 20.07.20 - 17:52
(6) Там вообще странно
В консоли запросов УПП (на построителе)
ВЫБРАТЬ
    АвансовыйОтчет.Ссылка,
    АвансовыйОтчет.Представление,
    АвансовыйОтчет.МоментВремени,
    &МоментВремени КАК МоментВремениПараметр,
    АвансовыйОтчет.МоментВремени <= &МоментВремени КАК Поле1,
    АвансовыйОтчет.МоментВремени >= &МоментВремени КАК Поле2,
    &МоментВремени <= &МоментВремени КАК Поле3,
    &МоментВремени >= &МоментВремени КАК Поле4
ИЗ
    Документ.АвансовыйОтчет КАК АвансовыйОтчет
ГДЕ
    АвансовыйОтчет.МоментВремени >= &МоментВремени

МоментВремени - нормально выводится,
МоментВремениПараметр - выдает ошибку (Неверные параметры <<?>>&МоментВремени КАК МоментВремениПараметр) 
Поле1 и Поле2 - выводятся,
Поле3 и Поле4 - выдают ошибку (Неверные параметры в операции сравнения. Нельзя сравнивать поля
 неограниченной длины и поля несовместимых типов.
&МоментВремени <<?>><= &МоментВремени КАК Поле3)

Проще считать, что запрос просто не умеет работать с моментами, проблем меньше будет
   PuhUfa
 
9 - 20.07.20 - 18:02
(8) Да уж. При таком раскладе лучше вообще отказаться от момента времени. Не ясно, что 1С еще не включит в запрос. Хотелось сделать красиво, а получится как всегда -)
   Конструктор1С
 
10 - 20.07.20 - 18:19
Эээ... А в документе-то нафига отбирать по моменту времени? МВ создан для регистров
   RomanYS
 
11 - 20.07.20 - 18:25
(10) нафига это ТС конечно интересно. А вот с "МВ создан для регистров" можно поспорить. Границы - да, вероятно для запросов к виртуальным таблицам, с МВ не так однозначно.
   Конструктор1С
 
12 - 20.07.20 - 18:35
(11) ни разу в жизни даже в голову не пришло фильтровать документы по моменту времени. Они прекрасно отбираются по дате. Все документы внутри одной секунды неминуемо загребутся запросом, если эта секунда входит в диапазон отбора. А если нужно отобрать только часть документов внутри одной секунды... тут уже нужно сперва задуматься, для нафига оно надо

попробовал сейчас сделать отбор в документе по МВ (внутри МВ дата и ссылка), получилось вот такое уродство

исходный запрос:

ВЫБРАТЬ
    ПриходнаяНакладная.Ссылка КАК Ссылка,
    ПриходнаяНакладная.Номер КАК Номер,
    ПриходнаяНакладная.Дата КАК Дата,
    ПриходнаяНакладная.МоментВремени КАК МоментВремени
ИЗ
    Документ.ПриходнаяНакладная КАК ПриходнаяНакладная
ГДЕ
    ПриходнаяНакладная.МоментВремени >= &МоментВремени

прилетело в СУБД:

exec sp_executesql N'SELECT
T1._IDRRef,
T1._Number,
T1._Date_Time,
T1._Date_Time,
T1._IDRRef
FROM dbo._Document34 T1
WHERE (T1._Date_Time >= P1 AND (T1._Date_Time > @P2 OR (T1._Date_Time = @P3 AND (T1._IDRRef >= @P4))))',N'P1 datetime2(3),@P2 datetime2(3),@P3 datetime2(3),@P4 varbinary(16)','4020-01-01 00:00:00','4020-01-01 00:00:00','4020-01-01 00:00:00',0x831DB06EBF821FE511EAA1BCF0CEC88A
   Йохохо
 
13 - 20.07.20 - 18:38
(12) но ведь порядок не гарантирован
   RomanYS
 
14 - 20.07.20 - 18:50
(12) а сделай условие "<="
   PuhUfa
 
15 - 20.07.20 - 18:53
(10)(11) Своя последовательность. Свой РН. Документы при проведении движения по своему РН НЕ формируют. Движения потом доформировываются отдельным модулем. Движения зависимы от последовательности документов. ДатаНачала формируется как раз из текущей границы последовательности и от нее потом по порядку формируются/переформировываются движения по РН. Понятно, что брать все документы попавшие в секунду дополнительной нагрузки не дадут. Подумаешь, по каким то документам они сформируются без необходимости. Но поскольку, в запросе, можно выбрать МоментВремени то хотел сделать красиво -)
   Конструктор1С
 
16 - 20.07.20 - 19:16
(13) но не в отборе же. Вот есть, допустим, 1000 документов первой секундой дня. Какой смысл отбирать из всей тыщи документы, которые позже ПриходнойНакладной №598? Технически-то оно возможно, но вот на бизнес-логику такой подход не натянуть

(14) то же самое

exec sp_executesql N'SELECT
T1._IDRRef,
T1._Number,
T1._Date_Time,
T1._Date_Time,
T1._IDRRef
FROM dbo._Document34 T1
WHERE (T1._Date_Time <= P1 AND (T1._Date_Time < @P2 OR (T1._Date_Time = @P3 AND (T1._IDRRef <= @P4))))',N'P1 datetime2(3),@P2 datetime2(3),@P3 datetime2(3),@P4 varbinary(16)','4020-01-01 00:00:00','4020-01-01 00:00:00','4020-01-01 00:00:00',0x831DB06EBF821FE511EAA1BCF0CEC88A
   Конструктор1С
 
17 - 20.07.20 - 19:22
(15) и что, сильно много документов внутри одной секунды сидит?
   Йохохо
 
18 - 20.07.20 - 19:23
(16) "но вот на бизнес-логику такой подход не натянуть " повторяемость это то что должен делать момент времени, решения не знаю
   PuhUfa
 
19 - 20.07.20 - 19:35
(17) Нет не много. В моем случае вообще не критично. Говорю же - хотел сделать красиво раз в запросе есть МоментВремени. Уже переделал.
   RomanYS
 
20 - 20.07.20 - 22:14
(16) интересно почему "<=" не корректно отрабатывает, если в SQL так переводится. Или криво только в файловой?
   Конструктор1С
 
21 - 21.07.20 - 06:36
(20) вот такой странный отбор получился, если в отбор передать МВ с датой и ссылкой

ВЫБРАТЬ
    ПриходнаяНакладная.Ссылка КАК Ссылка,
    ПриходнаяНакладная.Номер КАК Номер,
    ПриходнаяНакладная.Дата КАК Дата
ИЗ
    Документ.ПриходнаяНакладная КАК ПриходнаяНакладная
ГДЕ
    ПриходнаяНакладная.МоментВремени >= &НачалоПериода
    И ПриходнаяНакладная.МоментВремени <= &КонецПериода


exec sp_executesql N'SELECT
T1._IDRRef,
T1._Number,
T1._Date_Time
FROM dbo._Document34 T1
WHERE (T1._Date_Time >= P1 AND (T1._Date_Time > @P2 OR (T1._Date_Time = @P3 AND (T1._IDRRef >= @P4)))) AND (T1._Date_Time <= @P5 AND (T1._Date_Time < @P6 OR (T1._Date_Time = @P7 AND (T1._IDRRef <= @P8))))',N'P1 datetime2(3),@P2 datetime2(3),@P3 datetime2(3),@P4 varbinary(16),@P5 datetime2(3),@P6 datetime2(3),@P7 datetime2(3),@P8 varbinary(16)','4020-05-01 00:00:00','4020-05-01 00:00:00','4020-05-01 00:00:00',0x8325B06EBF821FE511EACB02EE9F02CB,'4020-07-01 00:00:00','4020-07-01 00:00:00','4020-07-01 00:00:00',0x831DB06EBF821FE511EAA1BCF0CEC88A
   RomanYS
 
22 - 21.07.20 - 11:00
(21) почему странный, вроде норм как и в (16). Почему глючит непонятно.


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