Skip to content

Instantly share code, notes, and snippets.

@PlugFox
Last active April 19, 2019 10:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PlugFox/3deb4e7a05aba3354b045769bd6b04cf to your computer and use it in GitHub Desktop.
Save PlugFox/3deb4e7a05aba3354b045769bd6b04cf to your computer and use it in GitHub Desktop.
getBirthday
Функция ПолучитьТаблицуЗначенийПоздравлений(ТекущаяДата = Неопределено, МассивФизическихЛиц = Неопределено, ТолькоСотрудники = Неопределено, ПоздравитьСегодня = Ложь) Экспорт
ТекущаяДата = ?(ТекущаяДата = Неопределено, ТекущаяДата(), ТекущаяДата);
Запрос = Новый Запрос;
ТекстЗапроса = "
|// ВЫБЕРЕМ НАЧАЛО ОТБОРА ДНЕЙ РОЖДЕНИЙ
|// ЕСЛИ ПРЕДИДУЩИЙ ДЕНЬ - ВЫХОДНОЙ, ТО НАЧАЛО ПЕРИОДА ЭТИХ ВЫХОДНЫХ
|// В ПРОТИВНОМ СЛУЧАЕ - ТЕКУЩУЮ ДАТУ
|ВЫБРАТЬ ЕСТЬ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