Last active
April 19, 2019 10:35
-
-
Save PlugFox/3deb4e7a05aba3354b045769bd6b04cf to your computer and use it in GitHub Desktop.
getBirthday
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Функция ПолучитьТаблицуЗначенийПоздравлений(ТекущаяДата = Неопределено, МассивФизическихЛиц = Неопределено, ТолькоСотрудники = Неопределено, ПоздравитьСегодня = Ложь) Экспорт | |
ТекущаяДата = ?(ТекущаяДата = Неопределено, ТекущаяДата(), ТекущаяДата); | |
Запрос = Новый Запрос; | |
ТекстЗапроса = " | |
|// ВЫБЕРЕМ НАЧАЛО ОТБОРА ДНЕЙ РОЖДЕНИЙ | |
|// ЕСЛИ ПРЕДИДУЩИЙ ДЕНЬ - ВЫХОДНОЙ, ТО НАЧАЛО ПЕРИОДА ЭТИХ ВЫХОДНЫХ | |
|// В ПРОТИВНОМ СЛУЧАЕ - ТЕКУЩУЮ ДАТУ | |
|ВЫБРАТЬ ЕСТЬNULL(МИНИМУМ(Вых.Дата), &тДата) КАК Дата | |
|ПОМЕСТИТЬ втНачалоПериодаТекущихПоздравлений | |
|ИЗ РегистрСведений.ДанныеПроизводственногоКалендаря КАК Вых | |
|ПРАВОЕ СОЕДИНЕНИЕ | |
|( // Найдем предидущий рабочий день для текущей даты | |
|ВЫБРАТЬ ПЕРВЫЕ 1 Дата | |
|ИЗ РегистрСведений.ДанныеПроизводственногоКалендаря | |
|ГДЕ Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&тДата, МЕСЯЦ, -1) И ДОБАВИТЬКДАТЕ(&тДата, ДЕНЬ, -1) | |
|И ВидДня В(ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) | |
|, ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) | |
|УПОРЯДОЧИТЬ ПО Дата УБЫВ) КАК Раб | |
|ПО Вых.Дата МЕЖДУ Раб.Дата и &тДата | |
|И НЕ Вых.ВидДня В(ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) | |
|, ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) | |
|; | |
|// ВЫБЕРЕМ КАДРОВУЮ ИСТОРИЮ СОТРУДНИКОВ | |
|ВЫБРАТЬ РАЗРЕШЕННЫЕ | |
| Р.ФизическоеЛицо КАК personID | |
| , МАКСИМУМ(ВЫБОР | |
| КОГДА Р.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение) | |
| ТОГДА ПОДСТРОКА(О.НаименованиеСокращенное, 0, 150) | |
| ИНАЧЕ null | |
| КОНЕЦ) КАК organization | |
| , МАКСИМУМ(ВЫБОР | |
| КОГДА Р.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение) | |
| ТОГДА П.Наименование | |
| ИНАЧЕ null | |
| КОНЕЦ) КАК subdivision | |
| , МАКСИМУМ(ВЫБОР | |
| КОГДА Р.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение) | |
| ТОГДА Д.Наименование | |
| ИНАЧЕ null | |
| КОНЕЦ) КАК position | |
| , МАКСИМУМ(Р.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)) | |
| КАК isEmployee | |
| , МИНИМУМ(ВЫБОР | |
| КОГДА Месяц(Ф.ДатаРождения)*100 + День(Ф.ДатаРождения) < Месяц(&тДата)*100 + День(&тДата) | |
| ТОГДА ГОД(ДОБАВИТЬКДАТЕ(&тДата, ГОД, 1))*10000 + МЕСЯЦ(Ф.ДатаРождения)*100 + ДЕНЬ(Ф.ДатаРождения) | |
| ИНАЧЕ ГОД(&тДата)*10000 + МЕСЯЦ(Ф.ДатаРождения)*100 + ДЕНЬ(Ф.ДатаРождения) | |
| КОНЕЦ) | |
| КАК _следующийДеньРождения | |
| , МИНИМУМ(Месяц(Ф.ДатаРождения)*100 + День(Ф.ДатаРождения) <= Месяц(&тДата)*100 + День(&тДата) | |
| И Месяц(Ф.ДатаРождения)*100 + День(Ф.ДатаРождения) >= Месяц(Н.Дата)*100 + День(Н.Дата)) | |
| КАК _неПоздравлен // ИСТИНА если др был на предидущих праздниках и еще не поздравили | |
|ПОМЕСТИТЬ втСотрудники | |
|ИЗ | |
| РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних() КАК Р | |
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК Ф | |
| ПО Р.ФизическоеЛицо = Ф.Ссылка | |
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК О | |
| ПО (Р.Организация = О.Ссылка) | |
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПодразделенияОрганизаций КАК П | |
| ПО (Р.Подразделение = П.Ссылка) | |
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК Д | |
| ПО (Р.Должность = Д.Ссылка), | |
| втНачалоПериодаТекущихПоздравлений КАК Н | |
|ГДЕ | |
| Ф.ДатаРождения <> ДАТАВРЕМЯ(1, 1, 1) | |
| " + ?(МассивФизическихЛиц=Неопределено, "", "И Р.ФизическоеЛицо В(&мФизическихЛиц)") + " | |
| " + ?(ТолькоСотрудники=Неопределено | |
, "" // ТолькоСотрудники = Неопределено, тогда выберем всех | |
, ?(ТолькоСотрудники | |
, "И Р.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)" // если только работающий | |
, "И Р.ВидСобытия = ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)")) // если только уволенных | |
+ " | |
|СГРУППИРОВАТЬ ПО | |
| Р.ФизическоеЛицо | |
|ИНДЕКСИРОВАТЬ ПО personID, _следующийДеньРождения | |
|; | |
|// ВЫБЕРЕМ ПРОИЗВОДСТВЕННЫЙ КАЛЕНДАРЬ С РАБОЧИМИ ДНЯМИ ЗА ГОД | |
|ВЫБРАТЬ | |
| Дата КАК Дата | |
| , ГОД(Дата)*10000 + МЕСЯЦ(Дата)*100 + ДЕНЬ(Дата) | |
| КАК _годМесяцДата | |
|ПОМЕСТИТЬ втКалендарь | |
|ИЗ | |
| РегистрСведений.ДанныеПроизводственногоКалендаря | |
|ГДЕ | |
| Дата МЕЖДУ &тДата И ДОБАВИТЬКДАТЕ(&тДата, МЕСЯЦ, 12) | |
| И ВидДня В(ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) | |
| , ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) | |
|; | |
|// НАЙДЕМ ДАТЫ СОБЫТИЙ ПОЗДРАВЛЕНИЙ | |
|ВЫБРАТЬ | |
| С.personID КАК personID | |
| , МИНИМУМ(К.Дата) КАК event | |
| , С.organization КАК organization | |
| , С.subdivision КАК subdivision | |
| , С.position КАК position | |
| , С.isEmployee КАК isEmployee | |
|ПОМЕСТИТЬ втСобытия | |
|ИЗ | |
| втСотрудники КАК С | |
| ЛЕВОЕ СОЕДИНЕНИЕ втКалендарь КАК К | |
| ПО ВЫБОР | |
| КОГДА С._неПоздравлен | |
| ТОГДА ИСТИНА | |
| ИНАЧЕ К._годМесяцДата >= С._следующийДеньРождения | |
| КОНЕЦ // Если др у сотрудника было на только что прошедших выходных | |
| // тогда надо поздравить в ближайший рабочий день | |
|СГРУППИРОВАТЬ ПО | |
| С.personID, С.organization, С.subdivision, С.position, С.isEmployee | |
|ИНДЕКСИРОВАТЬ ПО personID | |
|; | |
|// ПРИБЕРЕМСЯ ЗА СОБОЙ | |
|УНИЧТОЖИТЬ втСотрудники;УНИЧТОЖИТЬ втКалендарь;УНИЧТОЖИТЬ втНачалоПериодаТекущихПоздравлений | |
|; | |
|// СОБЕРЕМ РЕЗУЛЬТАТ | |
|ВЫБРАТЬ | |
| Ф.Ссылка КАК personID | |
| , Ф.Фамилия КАК lastName | |
| , Ф.Имя КАК firstName | |
| , Ф.Отчество КАК patronymic | |
| , ВЫБОР | |
| КОГДА Ф.Пол = Значение(Перечисление.ПолФизическогоЛица.Мужской) | |
| ТОГДА ""m"" | |
| КОГДА Ф.Пол = Значение(Перечисление.ПолФизическогоЛица.Женский) | |
| ТОГДА ""f"" | |
| ИНАЧЕ null | |
| КОНЕЦ КАК sex | |
| , ДЕНЬ(Ф.ДатаРождения) КАК bdDay | |
| , МЕСЯЦ(Ф.ДатаРождения) КАК bdMonth | |
| , ДЕНЬ(Ф.ДатаРождения) = ДЕНЬ(&тДата) И МЕСЯЦ(Ф.ДатаРождения) = МЕСЯЦ(&тДата) | |
| КАК bdToday | |
| , С.event КАК event | |
| , С.event = &тДата КАК eventToday | |
| , С.isEmployee КАК isEmployee | |
| , С.organization КАК organization | |
| , С.subdivision КАК subdivision | |
| , С.position КАК position | |
| , ЕСТЬNULL(Н.Режим, 0) КАК mode // УДАЛИТЬ ДЛЯ ТИПОВОЙ КОНФЫ | |
|ИЗ | |
| втСобытия КАК С | |
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК Ф | |
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.веб_др_настройки КАК Н | |
| ПО Ф.Ссылка = Н.ФизическоеЛицо | |
| ПО С.personID = Ф.Ссылка | |
| ГДЕ | |
| ВЫБОР | |
| КОГДА &ПоздравитьСегодня | |
| ТОГДА С.event = &тДата | |
| И ЕСТЬNULL(Н.Режим, 0) <> 1 // УДАЛИТЬ ДЛЯ ТИПОВОЙ КОНФЫ | |
| И (С.isEmployee | |
| ИЛИ ЕСТЬNULL(Н.Режим, 0) = 2 // УДАЛИТЬ ДЛЯ ТИПОВОЙ КОНФЫ | |
| ) | |
| ИНАЧЕ ИСТИНА | |
| КОНЕЦ | |
|УПОРЯДОЧИТЬ ПО | |
| bdMonth ВОЗР, bdDay ВОЗР | |
|"; | |
Запрос.Текст = ТекстЗапроса; | |
Запрос.УстановитьПараметр("тДата", НачалоДня(ТекущаяДата)); | |
Запрос.УстановитьПараметр("ПоздравитьСегодня", ПоздравитьСегодня); | |
Если МассивФизическихЛиц<>Неопределено Тогда | |
Запрос.УстановитьПараметр("мФизическихЛиц", МассивФизическихЛиц); | |
КонецЕсли; | |
Возврат Запрос.Выполнить().Выгрузить(); | |
КонецФункции // ПолучитьТаблицуЗначенийПоздравлений() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment