Имя: Пароль:
1C
1С v8
Не работает условие "ГДЕ" в запросе.
0 Беата Смит
 
16.04.19
18:33
Добрый вечер! Задача вроде простейшая, но, видимо, не для моего мозга.
Короче, мне нужно получить список всех пятых дней недели за определенный период: дата пятого понедельника в месяце, дата пятого вторника в месяце и так далее...
Я написала запрос, который выводит весь список дат за период с названием дня недели (ДеньНедели) и его порядковым номером в месяце (НомерДняВМесяце).

                Запрос = Новый Запрос;
                Запрос.Текст = ("ВЫБРАТЬ
                |    КалендарныеГрафики.ДатаГрафика как ДатаГрафика,
                |     ДЕНЬНЕДЕЛИ(КалендарныеГрафики.ДатаГрафика) КАК ДеньНедели,
                |     (ВЫРАЗИТЬ((РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(КалендарныеГрафики.ДатаГрафика, МЕСЯЦ), КалендарныеГрафики.ДатаГрафика, ДЕНЬ) + 1) / 7 - 0.6 КАК ЧИСЛО(15, 0))) + 1 КАК НомерДняВМесяце
                |ИЗ
                |    РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики
                |ГДЕ
                |   КалендарныеГрафики.ДатаГрафика МЕЖДУ &НачДата И &КонДата
                |УПОРЯДОЧИТЬ ПО
                |    КалендарныеГрафики.ДатаГрафика ");    
                
                Запрос.УстановитьПараметр("НачДата", НачДата);
                Запрос.УстановитьПараметр("КонДата", КонДата);    
                Результат = Запрос.Выполнить().Выгрузить();
                для каждого строчки из результат цикл
                    сообщить(строчки.НомерДняВМесяце);
                конеццикла;

Я прогоняла проверку, считает он правильно. И в получающейся на выходе структуре есть поле НомерДняВМесяце, в котором попадаются цифры 5.
Но когда я дописываю условие

                |ГДЕ
                |   (КалендарныеГрафики.ДатаГрафика МЕЖДУ &НачДата И &КонДата) И (НомерДняВМесяце = 5)

Запрос тупо перестает работать. Я и скобки по-разному расставляла, и какие абсурдные идеи, типа той, где приводила НомерДняВМесяце к строке и писала

                |ГДЕ
                |   (КалендарныеГрафики.ДатаГрафика МЕЖДУ &НачДата И &КонДата) И (Представление(НомерДняВМесяце) = ""5"")

Не работает это условие. И все тут. Просто скажите, что я делаю не так?((( Я чувствую, что какой-то глупый косяк в моей голове и ответ совсем на поверхности. Но я уже сдалась. Хэлп!
1 azernot
 
16.04.19
18:37
|ГДЕ
|   (КалендарныеГрафики.ДатаГрафика МЕЖДУ &НачДата И &КонДата) И ( (ВЫРАЗИТЬ((РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(КалендарныеГрафики.ДатаГрафика, МЕСЯЦ), КалендарныеГрафики.ДатаГрафика, ДЕНЬ) + 1) / 7 - 0.6 КАК ЧИСЛО(15, 0))) + 1 = 5)
2 Rie
 
16.04.19
18:38
(0) Зачем так сложно вычислять номер дня, если в языке запросов есть функция ДЕНЬ?
И тогда
ГДЕ (......) И (ДЕНЬ(КалендарныеГрафики.ДатаГрафика)=5)
3 Черный маклер
 
16.04.19
18:45
как-то сложно
ГДЕ ... ДЕНЬ(КалендарныеГрафики.ДатаГрафика)-28 > 0
4 Черный маклер
 
16.04.19
18:47
или
ГДЕ ... НЕДЕЛЯ(КалендарныеГрафики.ДатаГрафика)>4
5 Черный маклер
 
16.04.19
18:47
+4 ошибочно
6 Жан Пердежон
 
16.04.19
18:53
ГДЕ
   ...ДЕНЬ(КалендарныеГрафики.ДатаГрафика) > 28
7 Sapiens_bru
 
16.04.19
19:04
(0) Условие в ГДЕ накладывается по тем же полям, которые могут быть получены в выборке, в секции ВЫРАЗИТЬ. Поэтому если вы в выборке пишите

(ВЫРАЗИТЬ((РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(КалендарныеГрафики.ДатаГрафика, МЕСЯЦ), КалендарныеГрафики.ДатаГрафика, ДЕНЬ) + 1) / 7 - 0.6 КАК ЧИСЛО(15, 0))) + 1 КАК НомерДняВМесяце

То и в ГДЕ пишите
(ВЫРАЗИТЬ((РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(КалендарныеГрафики.ДатаГрафика, МЕСЯЦ), КалендарныеГрафики.ДатаГрафика, ДЕНЬ) + 1) / 7 - 0.6 КАК ЧИСЛО(15, 0))) + 1 = 5
8 Беата Смит
 
16.04.19
19:22
(2) Ваш пример найдет 5 день в месяце, то есть 5 января, 5 февраля... а не 5ый понедельник, вторник и так далее в месяце)
9 Беата Смит
 
16.04.19
19:27
(3) (6) Ну да, согласна, в случае с конкретно 5-м днем не было нужды вычислять все номера дней недели)
10 Беата Смит
 
16.04.19
19:29
(1) (7) Да, мой косяк. Спасибо!
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.