Имя: Пароль:
1C
1С v8
Задача найти документ по дате, ввожу дату в поле дата, нет поиска хотя док этой даты есть!
, , Radion
0 alpha78
 
10.06.22
10:05
Здравствуйте - Задача - найти документ по дате, ввожу дату в поле ДатаПоиска обработки (обработку сам создал), правда с временем 0.00.00 нет поиска хотя документы этой даты есть. Как независимо от времени найти все документы нужной даты, вот код программы:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Запрос = Новый Запрос ;    
    Запрос.Текст = "ВЫБРАТЬ
                   |    РеализацияТоваровУслуг.Ссылка,
                   |    РеализацияТоваровУслуг.Дата,
                   |    РеализацияТоваровУслуг.Контрагент,
                   |    РеализацияТоваровУслуг.СуммаДокумента
                   |ИЗ
                   |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                   |ГДЕ
                   |    РеализацияТоваровУслуг.Дата = &Дата" ;
    
    Запрос.УстановитьПараметр("Дата", ДатаПоиска) ;
    
    ЭлементыФормы.ТабличноеПоле1.Значение = Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
    ЭлементыФормы.ТабличноеПоле1.ОбновитьСтроки() ;
    
КонецПроцедуры
1 Kigo_Kigo
 
10.06.22
10:09
Дата МЕЖДУ
        |       НАЧАЛОПЕРИОДА(&ВыбДата, Год) И
        |       КОНЕЦПЕРИОДА(&ВыбДата, Год)"
2 Волшебник
 
модератор
10.06.22
10:10
Время важно.
При сравнении на равенство дата должна совпадать с точностью до секунды
3 Kigo_Kigo
 
10.06.22
10:10
РеализацияТоваровУслуг.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ВыбДата&Дата,ДЕНЬ) И КОНЕЦПЕРИОДА(&ВыбДата,ДЕНЬ)
4 hhhh
 
10.06.22
10:22
(3) хрень какая-то. Так все делают

НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, ДЕНЬ) = &ВыбДата
5 Kigo_Kigo
 
10.06.22
10:23
(4) А что работать не будет?
6 hhhh
 
10.06.22
10:27
(5) конечно. &ВыбДата это же дата без времени. Ну в крайнем случае

НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(&ВыбДата, ДЕНЬ)
7 vde69
 
10.06.22
10:27
(4) (3) НАЧАЛОПЕРИОДА - очень медленная операция.
8 vde69
 
10.06.22
10:30
Запрос = Новый Запрос ;    
    Запрос.Текст = "ВЫБРАТЬ
                   |    РеализацияТоваровУслуг.Ссылка,
                   |    РеализацияТоваровУслуг.Дата,
                   |    РеализацияТоваровУслуг.Контрагент,
                   |    РеализацияТоваровУслуг.СуммаДокумента
                   |ИЗ
                   |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                   |ГДЕ
                   |    РеализацияТоваровУслуг.Дата >= &Дата1 И РеализацияТоваровУслуг.Дата <= &Дата1" ;
    
    Запрос.УстановитьПараметр("Дата1", НачалоДня(ДатаПоиска)) ;
    Запрос.УстановитьПараметр("Дата2", КонецДня(ДатаПоиска)) ;
9 vde69
 
10.06.22
10:31
опечатка
                   |    РеализацияТоваровУслуг.Дата >= &Дата1 И РеализацияТоваровУслуг.Дата <= &Дата2" ;
10 Ryzeman
 
10.06.22
10:34
(8) я всецело за оптимизацию, но разницы с (3) фактически никакой нет. По 1 операции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА и 0.1 миллисекунды не выйграют у по 1 операции НачалоДня() и КонецДня()
11 Garykom
 
гуру
10.06.22
10:36
(10) От реализации зависит
В разных СУБД может быть по разному, вплоть до циклов
12 Garykom
 
гуру
10.06.22
10:37
Вариант (8) намного логичней и понятней чем (3)
13 Ryzeman
 
10.06.22
10:37
Ладно, соглашусь. Я забыл что кроме MS SQL бывает ещё что-то)
14 Garykom
 
гуру
10.06.22
10:38
Например теоретически можно запрос выполнить намного быстрей
Путем отправки туевой тучи параллельных запросов где в каждый будет отправлена одна дата с секундами (сколько там в одном дне секунд?)
А затем результат их объединен
15 Garykom
 
гуру
10.06.22
10:40
Для НомерСекунды = 1 По 60*60*24 Цикл
  ДатаССекундами = Дата+НомерСекунды;
  |ГДЕ
  |    РеализацияТоваровУслуг.Дата = &ДатаССекундами
КонецЦикла
16 Garykom
 
гуру
10.06.22
10:41
(15)+ понятно что отправлять не так надо а чтобы параллельно запросы выполнялись
17 Garykom
 
гуру
10.06.22
10:42
(16)+ Фишка что операция сравнения на > или < да еще их две намного затратней чем просто одно =
18 Ryzeman
 
10.06.22
10:44
(17) а накладные расходы на 86400 обращений к СУБД?) Даже если они в shared memory
19 Garykom
 
гуру
10.06.22
10:45
(18) Одним запросом очень длинным с Соединить ))
20 Garykom
 
гуру
10.06.22
10:45
(19) *ОБЪЕДИНИТЬ
21 alpha78
 
10.06.22
10:48
благодарю, получилось, удачи Вам

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Запрос = Новый Запрос ;    
    Запрос.Текст = "ВЫБРАТЬ
                   |    РеализацияТоваровУслуг.Ссылка,
                   |    РеализацияТоваровУслуг.Дата,
                   |    РеализацияТоваровУслуг.Контрагент,
                   |    РеализацияТоваровУслуг.СуммаДокумента
                   |ИЗ
                   |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                   |ГДЕ
                   |    РеализацияТоваровУслуг.Дата МЕЖДУ &д1 И &д2" ;
    
    Запрос.УстановитьПараметр("д1", НачалоДня(ДатаПоиска)) ;
    Запрос.УстановитьПараметр("д2", КонецДня(ДатаПоиска)) ;
22 vde69
 
10.06.22
10:50
(21) на всякий случай проверь на записи с временем 23:59:59

:)
23 Kassern
 
10.06.22
10:54
(22) тогда лучше:
Граница = Новый Граница(КонецДня(ДатаПоиска),ВидГраницы.Включая);
Запрос.УстановитьПараметр("д2", Граница) ;

Но имхо лучше: НачалоПериода(РеализацияТоваровУслуг.Дата,День)=&д1