Имя: Пароль:
1C
1С v8
Решение задачи за один запрос
,
0 AllkaR
 
30.11.13
22:21
Уважаемые 1С-ки, подскажите, либо хотяб даите идею в решении задачи. Есть Справочник Физ лиц с полями Имя и дата рождения. Нужно за один запрос (без обработки результата запроса в модуле)получить таблицу в которой сотрудники будут распределены по группам в каждом месяце: до 20 лет, от 21-30, от 31-40, от 41-50, и после 50, В каждой группе сотрудники сумируются. Полагаю тут Идет конструкция Выбор- Когда и разность дат? или ошибаюсь? может есть более легкое решение
1 IamAlexy
 
30.11.13
22:21
сделай запрос.. делов то
2 AllkaR
 
30.11.13
22:35
а к делу всетаки?? есть идеи?
3 hhhh
 
30.11.13
22:43
ну вы же спми написали. пять штук ВЫБОР КОГДА, ну это 5 строчек. А какое вы более легкое решение ждете? пять групп в 4 строчки впихнуть?
4 МихаилМ
 
30.11.13
22:47
(0)
нарисуйте что есть и что должно получиться.
5 AllkaR
 
30.11.13
22:54
ДатаРождения | Наименование. Должна получиться таблица со значениями: месяц1 месяц2 ....месяцн
меньше 20лет  кол-во  кол-во кол-во
от21до30      кол-во кол-во
от31-40
и более 50
6 AllkaR
 
30.11.13
22:55
ДатаРождения | Наименование. Должна получиться таблица со значениями:
              месяц1 месяц2 ....месяцн
меньше 20лет  кол-во  кол-во кол-во
от21до30      кол-во кол-во
от31-40
и более 50
7 AllkaR
 
30.11.13
23:45
Мне не понятно как сгруппировать, калякните хоть пару строк, заранее оч благодарен
8 dmpl
 
30.11.13
23:47
(7) В СГРУППИРОВАТЬ то же самое выражение пиши, что и в ВЫБРАТЬ.
9 azernot
 
30.11.13
23:57
Выбрать
Количество(Различные Сотрудники.Ссылка) как КолВо,
Выбор Когда Месяц(Сотрудники.ДатаРождения) = 1 ТОгда
"Январь"
Когда Месяц(Сотрудники.ДатаРождения) = 2 ТОгда
"Февраль"
...
Конец как Месяц,
Выбор Когда РазностьДат(&ТекущаяДата, Сотрудники.ДатаРождения, Год) <= 20 ТОгда
"До 20 лет"
Когда РазностьДат(&ТекущаяДата, Сотрудники.ДатаРождения, Год) > 20 И  РазностьДат(&ТекущаяДата, Сотрудники.ДатаРождения, Год) <= 30  ТОгда
"От 20 до 30 лет"
...
Конец как Группа
Из Справочник.Сотрудники как Сотрудники
..
Сгруппировать по
Выбор Когда Месяц(Сотрудники.ДатаРождения) = 1 ТОгда
"Январь"
Когда Месяц(Сотрудники.ДатаРождения) = 2 ТОгда
"Февраль"
...
Конец,
Выбор Когда РазностьДат(&ТекущаяДата, Сотрудники.ДатаРождения, Год) <= 20 ТОгда
"До 20 лет"
Когда РазностьДат(&ТекущаяДата, Сотрудники.ДатаРождения, Год) > 20 И  РазностьДат(&ТекущаяДата, Сотрудники.ДатаРождения, Год) <= 30  ТОгда
"От 20 до 30 лет"
...
Конец
10 Salimbek
 
01.12.13
00:34
(9) Если лень переписывать все в СГРУППИРОВАТЬ, то можно оставить запрос без группировки и подсчета количества, затем обернуть это в подзапрос и в "верхнем" запросе уже все сгруппировать как надо.
11 GANR
 
01.12.13
01:55
(0) Можно еще операции целочисленного деления применить, скажем СтажВГодах / 10 при значениях поля СтажВГодах 21, 22 и 25 вернет одно и то же значение 2 (целая часть от деления) - вот по нему-то и надо группировать. В МС СКЛ эта операция делается просто, в 1С - посложнее, с ВЫРАЗИТЬ, так как в ее запросах может иметь место неявное преобразование к числу с плавающей точкой v8: Как в запросе получить целое от деления и остаток от деления?.
12 mistеr
 
01.12.13
01:56
(0) Я не понял до конца фразу "в каждом месяце". Надо еще разбить на 12 групп по месяцу рождения, или вывести по каждому месяцу каждого года, когда у кого-то ДР?
13 mistеr
 
01.12.13
01:57
(12) Короче, нужен пример исходных данных и требуемый результат.
14 Classic
 
01.12.13
02:31
(10)
Тебе сейчас расскажут, что подзапросы это нубство
15 hhhh
 
01.12.13
07:40
(10) зачем же переписывать? Вы что, такие вещи переписываете? Есть же копипаст.

Реально автору надо набрать три строчки, всё остальное копипастом.
16 AllkaR
 
01.12.13
11:02
Профи спасибо от новичка, но очень заинтересовала темы группировки и подзапрос от Salimbek. Раскажите про подзапрос. Если понятнее вот что должно получиться:    
                        Месяц..      Месяц N

меньше 20            Кол-во        Кол-во  
возраст от 20 до 30    Кол-во        Кол-во
возраст от 31 до 40    Кол-во        Кол-во
возраст от 41 до 50    Кол-во        Кол-во  
больше 50            Кол-во
17 Wobland
 
01.12.13
11:08
а без фото взлетит?
18 AllkaR
 
01.12.13
11:10
Товарищи Ну поделитесь опытом и мастерством! Ну что вы в самом деле
19 mistеr
 
01.12.13
11:20
(16) А N - сколько?
20 User_Agronom
 
01.12.13
11:20
(17) Не, дегустация борща также обязательна ;)
21 Wobland
 
01.12.13
11:23
(18) да поделился бы, так уж всё написано
22 AllkaR
 
01.12.13
11:23
в году 12 месяцев значит N месяцев =12!
А в таблице сотрудников кроме Имени и даты рождения более ничего нет. Про борщь спорно, хотя можно поробывать сварить
23 zak555
 
01.12.13
11:24
(22) > Про борщь спорно, хотя можно поробывать сварить

нет опыта ?
24 AllkaR
 
01.12.13
11:28
снова не по теме
25 User_Agronom
 
01.12.13
11:29
(24) По теме: запрос сгородил? Какие поля?
Сотрудник, возраст, месяц?
Кури группировки...
26 AllkaR
 
01.12.13
11:36
Сотрудник | ДатаРождения
27 User_Agronom
 
01.12.13
11:37
(26) А месяц чего обидел?
28 AllkaR
 
01.12.13
11:40
Вобщем горожу следующее, если подскажите как посчитать сумму в группах- это именно группировка и еще разбить по месяцам будет ценно.

ВЫБРАТЬ
ДатаРождения,
Выбор
Когда Месяц(ДатаРождения)=1 Тогда "Январь"
Когда Месяц(ДатаРождения)=2 Тогда "Февраль"
Когда Месяц(ДатаРождения)=3 Тогда "Март"
Конец как месяцрождения,

Выбор
Когда РазностьДат(&ТекущаяДата, ДатаРождения, Год) <=20 Тогда "меньше20"
Когда РазностьДат(&ТекущаяДата, ДатаРождения, Год) > 20 И РазностьДат(&ТекущаяДата, ДатаРождения, Год) <= 30 Тогда "группа 20-30"
Когда РазностьДат(&ТекущаяДата, ДатаРождения, Год) > 30 И РазностьДат(&ТекущаяДата, ДатаРождения, Год) <= 40 Тогда "группа 31-40"
Когда РазностьДат(&ТекущаяДата, ДатаРождения, Год) > 40 И РазностьДат(&ТекущаяДата, ДатаРождения, Год) <= 50 Тогда "группа 41-50"
Когда РазностьДат(&ТекущаяДата, ДатаРождения, Год) > 50 И РазностьДат(&ТекущаяДата, ДатаРождения, Год) <= 50 Тогда "более 50"

Конец как группы

    
ИЗ Справочник.СотрудникиОрг
29 AllkaR
 
01.12.13
11:42
будет интереснее как раз наверное таки внешним запросом потомучто еще и в группировке все условия перечислять , хотя может так и надо, что скажут профи???
30 Wobland
 
01.12.13
11:48
(29) в группировке все условия перечислять
31 User_Agronom
 
01.12.13
11:49
Я не профи. Сертификатов.нет :)
ИМХО, ДатаРождения нафиг не нужна.
Сгруппировать по группы.
32 Wobland
 
01.12.13
11:50
(31) не всякий профессионал запросы хотя бы видел. специалист - да, предполагается, что знает ;)
33 zak555
 
01.12.13
11:50
(24) ты в какой теме ?
34 AllkaR
 
01.12.13
11:54
Товарищи, если бы задачу можно решить программно- мнеб не составило труда, но тут прям принципиально в один запрос. С 1С только начал работать. Кстати, с вами обсалютно согласен, по поводу кто-то по запросам ктото по коду- я не о сертификатах сеичас. Еще к томуж чтото разность дат неоч работает . охох- может кто с запросами дружит???
35 User_Agronom
 
01.12.13
12:00
(34) тебе в СКД? Или запрос в тексте обработки?
Почти же всё написано. Нужно только правильно сгруппировать и всё.
36 Wobland
 
01.12.13
12:01
(34) ээ.. предлагаю решить программно
37 AllkaR
 
01.12.13
12:02
User_Agronom покажите чаинику как это делается, можно просто запрос , мне главное понять
38 AllkaR
 
01.12.13
12:03
можете и из скд запрос
39 User_Agronom
 
01.12.13
12:15
С планшета особо не напишешь. Но смотри:

ВЫБРАТЬ
ТаблицаПодРазбор.месяцрождения,
ТаблицаПодРазбор.группы,
Количество(ТаблицаПодРазбор.ДатаРождения) КАК СколькоЧелов
ИЗ

(ВЫБРАТЬ
ДатаРождения,
Выбор
Когда Месяц(ДатаРождения)=1 Тогда "Январь"
Когда Месяц(ДатаРождения)=2 Тогда "Февраль"
Когда Месяц(ДатаРождения)=3 Тогда "Март"
... все остальные
Конец как месяцрождения,

Выбор
Когда РазностьДат(&ТекущаяДата, ДатаРождения, Год) <=20 Тогда "меньше20"
Когда РазностьДат(&ТекущаяДата, ДатаРождения, Год) > 20 И РазностьДат(&ТекущаяДата, ДатаРождения, Год) <= 30 Тогда "группа 20-30"
Когда РазностьДат(&ТекущаяДата, ДатаРождения, Год) > 30 И РазностьДат(&ТекущаяДата, ДатаРождения, Год) <= 40 Тогда "группа 31-40"
Когда РазностьДат(&ТекущаяДата, ДатаРождения, Год) > 40 И РазностьДат(&ТекущаяДата, ДатаРождения, Год) <= 50 Тогда "группа 41-50"
Когда РазностьДат(&ТекущаяДата, ДатаРождения, Год) > 50 И РазностьДат(&ТекущаяДата, ДатаРождения, Год) <= 50 Тогда "более 50"

Конец как группы

    
ИЗ Справочник.СотрудникиОрг) КАК ТаблицаПодРазбор
Сгруппировать ПО
ТаблицаПодРазбор.месяцрождения,
ТаблицаПодРазбор.группы

Еще бы упорядочить и вообще бы здорово стало.
Можно пакетным запросом (удобнее к понятию), но ты же просишь один запрос.
40 User_Agronom
 
01.12.13
12:18
Если В СКД пишешь, попробуй сразу сгруппировать по этим полям.
41 azernot
 
01.12.13
12:23
Я не понял, чем (9) не устраивает?
42 User_Agronom
 
01.12.13
12:29
(41) Устраивает. Он, похоже, в эту сторону и пилит.
43 AllkaR
 
01.12.13
12:34
Огромное спасибо всем, особенно User_Agronom.
44 User_Agronom
 
01.12.13
12:36
(43) получилось?
45 AllkaR
 
01.12.13
12:55
Получилось, только подскажите плиз почему не работает функция  РазностьДат(&ТекущаяДата, ДатаРождения, Год) почему вдруг все сотрудники отнеслись к дате кому меньше 20?
46 AllkaR
 
01.12.13
13:02
Все работает пардон, условие у меня не выполняется, результат же с -
47 kumena
 
01.12.13
13:11
Выбор Когда РазностьДат(&ТекущаяДата, Сотрудники.ДатаРождения, Год) <= 20 ТОгда

это криво будет работать, текущая дата может быть 1 декабря, а ДР 15. полных лет будет <> разность дат
48 AllkaR
 
01.12.13
14:04
таак, а вы (kumena), чтобы посоветовали использовать?
49 Мимохожий Однако
 
01.12.13
14:22
Сотрудники.ДатаРождения, Месяц) <= 240
50 kumena
 
01.12.13
14:32
(48)

    ВЫБОР
        КОГДА ГОД(РаботникиОрганизации.Сотрудник.Физлицо.ДатаРождения) = 1
                ИЛИ РаботникиОрганизации.Сотрудник.Физлицо.ДатаРождения > &Период
            ТОГДА 0
        ИНАЧЕ ГОД(&Период) - ГОД(РаботникиОрганизации.Сотрудник.Физлицо.ДатаРождения) + ВЫБОР
                КОГДА МЕСЯЦ(РаботникиОрганизации.Сотрудник.Физлицо.ДатаРождения) * 100 + ДЕНЬ(РаботникиОрганизации.Сотрудник.Физлицо.ДатаРождения) > МЕСЯЦ(&Период) * 100 + ДЕНЬ(&Период)
                    ТОГДА -1
                ИНАЧЕ 0
            КОНЕЦ
    КОНЕЦ КАК ФизЛицоВозраст

Зарплата и Управление Персоналом, редакция 2.5 (2.5.69.3) ©
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший