Имя: Пароль:
1C
1С v8
не получается сделать запрос с условием, в котором участвует вычисляемое поле
,
0 alpha78
 
17.03.21
14:58
Здравствуйте, хочу выбрать из спр. ФизЛица людей возрастом меньше 55 лет
Выбираю фио, день рождения, создаю вычисляемое поле для возраста  - сегодняшний год - год рождения

Запрос.Текст = "ВЫБРАТЬ
                   |    ФизическиеЛица.Наименование КАК Наименование,
                   |    ФизическиеЛица.ДатаРождения,
                   |    ФизическиеЛица.Родитель,
                   |    (ГОД(&Сегодня) - ГОД(ФизическиеЛица.ДатаРождения) КАК Возраст
                   |ИЗ
                   |    Справочник.ФизическиеЛица КАК ФизическиеЛица
                   |ГДЕ
                   |    НЕ ФизическиеЛица.ЭтоГруппа
                   |    И ФизическиеЛица.Родитель <> &Пустой
                   |    И Возраст < 55
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    Наименование";


не получается сделать запрос с условием, в котором участвует вычисляемое поле

выдает ошибку - ПОЛЕ НЕ НАЙДЕНО ВОЗРАСТ
БРЕД ЧТО ОН ЧЕШЕТ, КОГДА ЕСТЬ ВЫЧИСЛЯЕМОЕ ПОЛЕ И В КОНСТРУКТОРЕ ЗАПРОСОВ ВО ВКЛАДКЕ ОБЪЕДИНЕНИЯ/ПСЕВДОНИМЫ Я ЕГО НАЗВАЛ Возраст
Подсобите что я не так делаю, спасибо!
1 shuhard
 
17.03.21
15:00
(0) И  ФизическиеЛица.Возраст < 55
2 alpha78
 
17.03.21
15:07
И  ФизическиеЛица.Возраст < 55
все равно ругается - поле не найдено - бред
3 boozin
 
17.03.21
15:14
И  (ГОД(&Сегодня) - ГОД(ФизическиеЛица.ДатаРождения) < 55
4 Simod
 
17.03.21
15:35
Рукалицо...
5 youalex
 
17.03.21
15:39
Реальный порядок выполнения операторов в запросе (упрощенно, без соединений , ПЕРВЫЕ и РАЗЛИЧНЫЕ) :
1)ИЗ
2)ГДЕ
3)СГРУППИРОВАТЬ
4)ИМЕЮЩИЕ
4)ВЫБРАТЬ
5)УПОРЯДОЧИТЬ

Т.о. в операторе "ГДЕ" неизвестно, что у тебя там за синоним в  "ВЫБРАТЬ"
А вот в УПОРЯДОЧИТЬ - известно.
6 Малыш Джон
 
17.03.21
15:39
(0)  "(ГОД(&Сегодня) - ГОД(ФизическиеЛица.ДатаРождения) КАК Возраст" - количество открывающих и закрывающих скобок посчитай
7 Малыш Джон
 
17.03.21
15:41
+(6) ну и (3), да
8 boozin
 
17.03.21
15:44
И  (ГОД(&Сегодня) - ГОД(ФизическиеЛица.ДатаРождения)) < 55
Скобку забыл
9 youalex
 
17.03.21
15:46
(0) ну и вообще, для этого (ГОД(&Сегодня) - ГОД(ФизическиеЛица.ДатаРождения)
есть функция запроса РАЗНОСТЬДАТ
10 Малыш Джон
 
17.03.21
15:58
(9) она довольно своеобразно работает: считает количество "переходов" между границами дат

"ВЫБРАТЬ РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2019, 12, 31),ДАТАВРЕМЯ(2021, 1, 1), ГОД)" выдаст 2, хотя по факту - 1 год и 1 день

и

"ВЫБРАТЬ РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2019, 01, 01),ДАТАВРЕМЯ(2021,12,31), ГОД)" выдаст тоже 2, хотя это 3 года без одного дня
11 acht
 
17.03.21
16:11
(9) Вообще для этого передают параметром заранее расчитаную дату рождения. Такую, что все люди, родившиеся позже, имеют возраст меньше 55 лет. И волшебным образом и индексы начинают работать и запросы упрощаются...

А то понапишут тут своих формул.
12 youalex
 
17.03.21
16:20
(10) да ты прав)
И (11) прав вдвойне)
13 youalex
 
17.03.21
16:25
Про РазностьДат (не знал):
Эта функция возвращает количество пересеченных границ (целое число со знаком), указанных в аргументе datepart, за период времени, указанный в аргументах startdate и enddate.
https://docs.microsoft.com/ru-ru/sql/t-sql/functions/datediff-transact-sql?view=sql-server-ver15