Имя: Пароль:
1C
1С v8
v8: УПП Найти многодетных сотрудников
0 Изучаю УПП
 
07.11.12
14:49
1С 8.2  УПП 1.3
Задача в принципе простенькая: Отобрать работающих сотрудников, у которых более 3-х детей (в возрасте до 14 лет). Отработкой сделал, но хотелось бы запросом. Никак не получается наложить ограничение на возраст.
Вот текст

ВЫБРАТЬ
   СоставСемьи.СтепеньРодства КАК СтепеньРодства,
   СоставСемьи.Имя КАК Имя,
   СоставСемьи.ДатаРождения КАК ДатаРождения
ИЗ
   Справочник.ФизическиеЛица.СоставСемьи КАК СоставСемьи
ГДЕ
   СоставСемьи.Ссылка В
   (ВЫБРАТЬ
       СотрудникиОрганизаций.Физлицо
   ИЗ
       Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.СоставСемьи КАК СоставСемьи
   ПО
       СотрудникиОрганизаций.Физлицо = СоставСемьи.Ссылка
   ГДЕ
       СоставСемьи.НомерСтроки >= 4        // Количество детей
       И СотрудникиОрганизаций.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) // Не уволен
   СГРУППИРОВАТЬ ПО
       СотрудникиОрганизаций.Физлицо)
СГРУППИРОВАТЬ ПО
   СоставСемьи.Ссылка,
   СоставСемьи.СтепеньРодства,
   СоставСемьи.Имя,
   СоставСемьи.ДатаРождения
УПОРЯДОЧИТЬ ПО
   СоставСемьи.Ссылка.Наименование,
   ДатаРождения
ИТОГИ ПО
   СоставСемьи.Ссылка.Наименование

но в отчет попадают все, если их количество >  3. Как подправить строку // Количество детей?
1 Homer
 
07.11.12
14:53
а где ограничение на возраст?
2 Apokalipsec
 
07.11.12
14:54
Дата рождения там есть.)
3 Homer
 
07.11.12
14:55
Год(ТекущаяДата) - Год(СоставСемьи.ДатаРождения)<14
4 Xapac_2
 
07.11.12
14:56
если количество детей > 3 И ВГодах(текущаяДата-ДатаРождения) < 14 тогда сотрудник многодетный.
5 Изучаю УПП
 
07.11.12
14:58
(4) количество детей – нет такого реквизита.
6 Apokalipsec
 
07.11.12
15:00
(5) тебе хватит и условия из (3), вряд-ли у работника жена 13 летняя.)
Хотя по годам может выходить 14, а по месяцам 14 ещё не исполнилось
7 Gesperid
 
07.11.12
15:16
(0) проще и точнее передать значение ДобавитьМесяц(ТекущаяДата(), -(14*12)) в качестве параметра и в запросе сравнивать с ДР
8 Изучаю УПП
 
07.11.12
15:16
На ТекущаяДата – ругается. Вот так прошло
Год(ДАТАВРЕМЯ(2012, 11, 7, 0, 0, 0)) - Год(СоставСемьи.ДатаРождения) < 14
но попали все сотрудники, у которых и по одному, два, три ребенка
9 Xapac_2
 
07.11.12
15:23
&ТекущаяДата - и передавай параметром в запрос
10 Изучаю УПП
 
07.11.12
16:18
Вот с таким условием уже ближе

ГДЕ
   СоставСемьи.НомерСтроки > 3
   И СоставСемьи.ДатаРождения > &ТекущаяДатаМинус14    // До 14 лет
   И СотрудникиОрганизаций.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) // Не уволен

Но  в отбор попадают и те сотрудники, у которых среди первых трех есть старше 14 лет, четвертый – младше. А такие – не нужны, как их убрать?
11 Gesperid
 
07.11.12
16:30

ВЫБРАТЬ
   РаботникиОрганизацийСрезПоследних.Сотрудник.Физлицо КАК Физлицо
ПОМЕСТИТЬ ФизЛица
ИЗ
   РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, ) КАК РаботникиОрганизацийСрезПоследних
ГДЕ
   ВЫБОР
           КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &Период
                   И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
               ТОГДА РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостоянияЗавершения
           ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния
       КОНЕЦ <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
   И РаботникиОрганизацийСрезПоследних.Сотрудник.ВидЗанятости <> ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ВнутреннееСовместительство)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ФизЛица.Физлицо
ИЗ
   ФизЛица КАК ФизЛица
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.СоставСемьи КАК СоставСемьи
       ПО ФизЛица.Физлицо = СоставСемьи.Ссылка
ГДЕ
   СоставСемьи.СтепеньРодства В (&Дочь, &Сын)
   И ДОБАВИТЬКДАТЕ(СоставСемьи.ДатаРождения, МЕСЯЦ, 14 * 12) > &Период // четырнадцатилетие наступит после &Период

СГРУППИРОВАТЬ ПО
   ФизЛица.Физлицо

ИМЕЮЩИЕ
   КОЛИЧЕСТВО(*) > 3
12 Изучаю УПП
 
07.11.12
16:33
(11) Спасибо, завтра проверю.
13 Gesperid
 
07.11.12
16:41
(12) а вообще, если тебе не для тренировки, то результат можно получить отчетом "Списки сотрудников организации"
14 Изучаю УПП
 
08.11.12
11:05
(13) Все заработало, после небольших исправлений

ВЫБРАТЬ
   РС_РО_СП.Сотрудник.Физлицо КАК Физлицо
ПОМЕСТИТЬ ФизЛица
ИЗ
   РегистрСведений.РаботникиОрганизаций.СрезПоследних() КАК РС_РО_СП
ГДЕ
   РС_РО_СП.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
   И РС_РО_СП.Сотрудник.ВидЗанятости <> ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ВнутреннееСовместительство)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ФизЛица.Физлицо
ИЗ
   ФизЛица КАК ФизЛица
   ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.СоставСемьи КАК СоставСемьи
   ПО ФизЛица.Физлицо = СоставСемьи.Ссылка
   ГДЕ
   ДОБАВИТЬКДАТЕ(СоставСемьи.ДатаРождения, МЕСЯЦ, 14 * 12) > &Период // Период = ТекущаяДата()
СГРУППИРОВАТЬ ПО
   ФизЛица.Физлицо
ИМЕЮЩИЕ
   КОЛИЧЕСТВО(*) > 3

Отчет «Списки сотрудников организации» тоже посмотрел, только не нашел там куда поставить условие КОЛИЧЕСТВО(*) > 3.
15 Изучаю УПП
 
12.11.12
09:12
Доброго дня! Задача немного усложнилась. Кроме сотрудников нужно вывести и их детей с датой рождения. Вот текст запроса:

ВЫБРАТЬ
   РС_РО_СП.Сотрудник.Физлицо КАК Физлицо
ПОМЕСТИТЬ РаботающиеФЛ
ИЗ
   РегистрСведений.РаботникиОрганизаций.СрезПоследних(, ) КАК РС_РО_СП
ГДЕ
   РС_РО_СП.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
   И РС_РО_СП.Сотрудник.ВидЗанятости <> ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ВнутреннееСовместительство)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   СоставСемьи.ДатаРождения КАК ДатаРождения,
   СоставСемьи.СтепеньРодства КАК СтепеньРодства
ИЗ
   Справочник.ФизическиеЛица.СоставСемьи КАК СоставСемьи
ГДЕ
   СоставСемьи.Ссылка В
           (ВЫБРАТЬ
               ФизЛица.Физлицо
           ИЗ
               РаботающиеФЛ КАК ФизЛица ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.СоставСемьи КАК СоставСемьи
                   ПО
                       ФизЛица.Физлицо = СоставСемьи.Ссылка
           ГДЕ
               ДОБАВИТЬКДАТЕ(СоставСемьи.ДатаРождения, МЕСЯЦ, 14 * 12) > &Период
           СГРУППИРОВАТЬ ПО
                       ФизЛица.Физлицо
           ИМЕЮЩИЕ
               КОЛИЧЕСТВО(*) > 3)
СГРУППИРОВАТЬ ПО
   СоставСемьи.Ссылка,
   СоставСемьи.ДатаРождения,
   СоставСемьи.СтепеньРодства

Все отрабатывает, но есть замечание – у одного человека двойняшки с одной датой рождения и они группируются.  И никак не убрать СГРУППИРОВАТЬ ПО    СоставСемьи.ДатаРождения.
16 Изучаю УПП
 
12.11.12
09:24
В запросе &Период = ТекущаяДата()
17 Serg_1960
 
12.11.12
09:34
(15) "...и они группируются.  И никак не убрать..." - Справочник.ФизическиеЛица.СоставСемьи.НомерСтроки
18 Изучаю УПП
 
12.11.12
09:56
(17) Все получилось, спасибо.
И последний вопрос – как правильней составить структуру запроса в (15) или как ниже

ВЫБРАТЬ
   РС_РО_СП.Сотрудник.Физлицо КАК Физлицо
ПОМЕСТИТЬ РаботающиеФЛ
ИЗ РС …

ВЫБРАТЬ
   …  Физлицо
ПОМЕСТИТЬ Многодетные
ИЗ РаботающиеФЛ

ВЫБРАТЬ
   …  Детей
ИЗ Многодетные
19 Изучаю УПП
 
12.11.12
09:59
Да, кстати, (17) ПЕРСОНАЛЬНОЕ ОГРОМНОЕ СПАСИБО!
20 Serg_1960
 
12.11.12
10:01
:)
21 Serg_1960
 
12.11.12
10:41
(18) "как правильнее" - в смысле - как оптимальнее? Запрос в (15), имхо, не совсем правильный. Не соединение, а просто запрос к составу семьи с отбором ссылки по РаботающиеФЛ; вывод результат запроса в дерево с отбором по количеству ссылки больше трех. Надо пробывать на данных :(
22 Gesperid
 
12.11.12
11:47
Всё таки настаиваю на передачи параметров сын и дочь =)


ВЫБРАТЬ
   РаботникиОрганизацийСрезПоследних.Сотрудник.Физлицо КАК Физлицо
ПОМЕСТИТЬ ФизЛица
ИЗ
   РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, ) КАК РаботникиОрганизацийСрезПоследних
ГДЕ
   ВЫБОР
           КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &Период
                   И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
               ТОГДА РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостоянияЗавершения
           ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния
       КОНЕЦ <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
   И РаботникиОрганизацийСрезПоследних.Сотрудник.ВидЗанятости <> ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ВнутреннееСовместительство)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ФизЛица.Физлицо
ПОМЕСТИТЬ ФизЛица2
ИЗ
   ФизЛица КАК ФизЛица
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.СоставСемьи КАК СоставСемьи
       ПО ФизЛица.Физлицо = СоставСемьи.Ссылка
ГДЕ
   СоставСемьи.СтепеньРодства В (&Дочь, &Сын)
   И ДОБАВИТЬКДАТЕ(СоставСемьи.ДатаРождения, МЕСЯЦ, 14 * 12) > &Период

СГРУППИРОВАТЬ ПО
   ФизЛица.Физлицо

ИМЕЮЩИЕ
   КОЛИЧЕСТВО(*) > 3
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ФизЛица2.Физлицо,
   СоставСемьи.Имя,
   СоставСемьи.СтепеньРодства,
   СоставСемьи.ДатаРождения
ИЗ
   Справочник.ФизическиеЛица.СоставСемьи КАК СоставСемьи
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ФизЛица2 КАК ФизЛица2
       ПО СоставСемьи.Ссылка = ФизЛица2.Физлицо
ГДЕ
   СоставСемьи.СтепеньРодства В (&Дочь, &Сын)
   И ДОБАВИТЬКДАТЕ(СоставСемьи.ДатаРождения, МЕСЯЦ, 14 * 12) > &Период
23 Gesperid
 
12.11.12
11:50
(21) как раз выражение

ВЫБРАТЬ
 Поле
ИЗ
Таблица
ГДЕ
 Поле (ВЫБРАТЬ Поле ИЗ ТаблицаОтбора)

тормознее, чем соединение
24 Изучаю УПП
 
12.11.12
13:17
(22) Спасибо за альтернативный вариант. Но если добавить Сын/Дочь, то тогда и Падчерицы/Пасынки встречаются. А сестры/братья в нашу базу не заносятся, поэтом в данном случае достаточно даты рождения. К тому же степень родства выводится в таблицу.
Прогнал оба варианта (15) и (22) – на глаз по времени выполнения разницы никакой.
25 Gesperid
 
12.11.12
13:33
(24) а жены/мужья заносятся? запрос (15) и жен/мужей вывалит у для "многодетных"
26 Изучаю УПП
 
12.11.12
15:24
Жены/мужья заносятся, но они заведомо старше 14 лет.
27 Gesperid
 
12.11.12
15:35
не читатель? см. (25)
28 Изучаю УПП
 
12.11.12
15:43
(27) Скорректировал (15) в конце на
......
   ГДЕ
       ДОБАВИТЬКДАТЕ(СоставСемьи.ДатаРождения, МЕСЯЦ, 14 * 12) > &Период
   СГРУППИРОВАТЬ ПО
               ФизЛица.Физлицо
   ИМЕЮЩИЕ
       КОЛИЧЕСТВО(*) > 3) И ДОБАВИТЬКДАТЕ(СоставСемьи.ДатаРождения, МЕСЯЦ, 14 * 12) > &Период

УПОРЯДОЧИТЬ ПО
   СоставСемьи.Ссылка.Наименование,
   СоставСемьи.ДатаРождения,
   СоставСемьи.СтепеньРодства
ИТОГИ ПО
   СоставСемьи.Ссылка.Наименование

И группировать по номеру строки не надо.
Ошибка? Это не ошибка, это системная функция.