*ОМС – обязательное медицинское страхование
Благодарности:
- Р.С.В.
- Armando //infostart.ru/profile/16019/
Постановка задачи.
Разработать запрос, который бы позволял формировать 2 вида отчета:
1) отчет по принятым сотрудникам, подлежащим ОМС; причем должно учитываться 2 момента:
1.2) в отчет по принятым сотрудникам, подлежащим ОМС, не должны попадать сотрудники, уволенные в периоде формирования отчета;
1.2) в отчет по принятым сотрудникам, подлежащим ОМС, не должны попадать сотрудники, имеющие на дату отчета действующие полисы ОМС;
2) отчет по уволенным сотрудникам, подлежащим исключению из числа ОМС.
Отчет должен иметь следующие настройки:
1) даты «С» и «ПО» формирования отчета;
2) «организация» – по какому юр. лицу будет формироваться отчет;
3) «ПарамИсключениеПоПрописке» - если этот параметр равен строке ”Ростов”, то в отчет не должны попадать сотрудники, которые прописаны в Ростове.
4) «ПринятыеУволенные» - текстовый параметр, который может принимать значения «Принятые» или «Уволенные», в зависимости от этого параметра строится либо отчет по принятым, либо по уволенным.
Ключевые прикладные объекты метаданных, таблицы которых будут участвовать в запросе:
1) регистр сведений РаботникиОрганизаций (с недавних пор у него синоним «Кадровая история сотрудников (по юрлицам)»).
2) справочник «МедицинскиеСтраховыеПолисы»
3) регистр сведений ФИОФизЛиц, а точнее виртуальную таблицу «ФИОФизЛицСрезПоследних» – без нее не обходится ни один запрос и ни одна печатная форма, формируемые для кадров. Частенько даже опытные специалисты под полем «ФИО» подразумевают «Сотрудник.Наименование», что не правильно (некоторым просто лень добавить еще одну таблицу в запрос). В больших организациях это может обернуться конфузами в случаях, когда сотрудницы выходят замуж и меняют фамилию, а потом разводятся и снова меняют фамилию, а потом снова выходят и т.д. Обязательно стоит задавать параметры виртуальной таблицы, например, так:
РегистрСведений.ФИОФизЛиц.СрезПоследних( &ПарамКонПериода, ФизЛицо В
(ВЫБРАТЬ ВТ.Физлицо
ИЗ ВТ_ПринятыеУволенныеЗаПериод КАК ВТ))
КАК ФИОФизЛицСрезПоследних
В идеале, если параметры заданы по всем измерениям виртуальной таблицы.
4) справочник ФизическиеЛица. Многие специалисты получают, например, дату рождения физ лица так: «Штатники.Сотрудник.ФизЛицо.ДатаРождения», что сильно проигрывает в производительности правильному варианту: «ФизЛицо.ДатаРождения». Т.е. три точки и более в получении поля – это бэдово. Причем, для клиент серверного варианта такой запрос может вызвать ошибку выполнения, если количество точек более 4 (точно не помню). Лучше левом соединением присоединять нужную таблицу, а уж из нее получать необходимые поля.
5) виртуальная таблица регистра сведений ГражданствоФизЛицСрезПоследних – получим гражданство. Не забудем указать параметры виртуальной таблицы, например, так:
РегистрСведений.ГражданствоФизЛиц.СрезПоследних( &ПарамКонПериода, ФизЛицо В
(ВЫБРАТЬ ВТ.Физлицо
ИЗ ВТ_ПринятыеУволенныеЗаПериод КАК ВТ))
КАК ГражданствоФизЛицСрезПоследних
6) виртуальная таблица регистра сведений ПаспортныеДанныеФизЛицСрезПоследних – получим серию и номер паспорта гражданина РФ. Не забудем указать параметры виртуальной таблицы.
7) реальная таблица «КонтактнаяИнформация» - получим юридический адрес физ. лица. При этом лучше переименовать таблицу «КонтактнаяИнформация» в «КонтактнаяИнформация_ЮрАдресФизЛица». Мне категорически не нравится когда, многие прославленные специалисты переименовывают таблицы, давая им следующие имена «ФЛнеУ5» или «ЗТХ_4» или «КрупныеКлиенты». Нужно обязательно сохранять в названии таблицы «подсказку» - откуда она берется. На закладке «Связи» эту таблиц можно присоединить например так:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация_ЮрАдресФизЛица
ПО ВТ_ПринятыеУволенныеЗаПериод.Физлицо = КонтактнаяИнформация_ЮрАдресФизЛица.Объект
И (КонтактнаяИнформация_ЮрАдресФизЛица.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресФизЛица))
8) прочие таблицы, необходимые для получения полей отчета.
Основная идея построения запроса, структура пакетов
1 пакет запрос. Закладка «Дополнительно», создание временной таблицы ВТ_ПринятыеУволенныеЗаПериод
Основная сложность заключается в том, что нужно одним запросом, не собирая его через текстовые куски, описать получение полей для 2 разных отчетов: по принятым и уволенным.
Для реализации подобно функционала в первом пакете получим записи реальной таблицы РС «РаботникиОрганизация», и в зависимости от входного значения «ПринятыеУволенные» будем получать записи за период только принятых или только уволенных сотрудников.
1 пакет нам понадобится для написания во 2 пакете конструкций вида:
ФизЛицо В
(ВЫБРАТЬ
ВТ.Физлицо
ИЗ
ВТ_ПринятыеУволенныеЗаПериод КАК ВТ)
Таблица:
- РС РаботникиОрганизаций
Поля:
- РаботникиОрганизаций.Сотрудник
- РаботникиОрганизаций.Сотрудник.ФизЛицо (это поле нужно проиндексировать)
- РаботникиОрганизаций.Регистратор
Условия:
1) ограничение на период
ВЫБОР
КОГДА &ПринятыеУволенные = "Принятые"
ТОГДА РаботникиОрганизаций.Период МЕЖДУ &ПарамНачПериода И &ПарамКонПериода
КОГДА &ПринятыеУволенные = "Уволенные"
ТОГДА ДОБАВИТЬКДАТЕ(РаботникиОрганизаций.Период, ДЕНЬ, -1) МЕЖДУ &ПарамНачПериода И &ПарамКонПериода
КОНЕЦ
2) отбор по организации
РаботникиОрганизаций.Организация = &ПарамОрганизация
3) отбор штатников:
РаботникиОрганизаций.Сотрудник.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровСФизЛицами.ТрудовойДоговор) И
РаботникиОрганизаций.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)
4) когда формируем списки принятых сотрудников, учтем, что сотрудник может быть принят по срочному договору, и что дата окончания договора может быть ранее, чем дата конца формирования отчета; когда формируем списки уволенных сотрудников это безразлично
ВЫБОР
КОГДА &ПринятыеУволенные = "Принятые"
ТОГДА РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу)
И ВЫБОР
КОГДА РаботникиОрганизаций.ПериодЗавершения МЕЖДУ &ПарамНачПериода И &ПарамКонПериода
И РаботникиОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ТОГДА РаботникиОрганизаций.ПричинаИзмененияСостоянияЗавершения
ИНАЧЕ РаботникиОрганизаций.ПричинаИзмененияСостояния
КОНЕЦ <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
КОГДА &ПринятыеУволенные = "Уволенные"
ТОГДА РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
КОНЕЦ
5) когда формируем списки принятых сотрудников, учтем, что принятый сотрудник может быть уволен в том же интервале, за который формируют отчет, поэтому нужно проверять чтобы принятый сотрудник не попал в списки уволенных за этот же временной интервал; когда формируем списки уволенных сотрудников это безразлично
ВЫБОР
КОГДА &ПринятыеУволенные = "Принятые"
ТОГДА (НЕ РаботникиОрганизаций.Сотрудник В
(ВЫБРАТЬ
РаботникиОрганизаций.Сотрудник КАК Сотрудник
ИЗ
РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
ДОБАВИТЬКДАТЕ(РаботникиОрганизаций.Период, ДЕНЬ, -1) МЕЖДУ &ПарамНачПериода И &ПарамКонПериода
И РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
И РаботникиОрганизаций.Организация = &ПарамОрганизация
И РаботникиОрганизаций.Сотрудник.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровСФизЛицами.ТрудовойДоговор)
И РаботникиОрганизаций.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)))
КОГДА &ПринятыеУволенные = "Уволенные"
ТОГДА ИСТИНА
КОНЕЦ
2 пакет запрос. Закладка «Дополнительно», создание временной таблицы ВТ_Результат
В этом пакете мы к временной таблице ВТ_ПринятыеУволенныеЗаПериод левым соединением будет нанизывать таблицы ФИОФизЛицСрезПоследних, МедицинскиеСтраховыеПолисы, ПаспортныеДанныеФизЛицСрезПоследних и др.
На закладке «Условия» для решения задачи о том, что в отчет не должны попадать сотрудники, которые прописаны, например, в Ростове, напишем:
(НЕ ЕСТЬNULL(КонтактнаяИнформация_ЮрАдресФизЛица.Представление, "адрес прописки не указан") ПОДОБНО & ПарамИсключениеПоПрописке)
Так как в отчет по принятым сотрудникам, подлежащим ОМС, не должны попадать сотрудники, имеющие на дату отчета действующие полисы ОМС, то на закладке «Условия» напишем:
ВЫБОР
КОГДА &ПринятыеУволенные = "Уволенные"
ТОГДА ИСТИНА
КОГДА &ПринятыеУволенные = "Принятые"
ТОГДА ВЫБОР
КОГДА МедицинскиеСтраховыеПолисы.ДатаОкончанияПолиса > &ПарамКонПериода
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ
КОНЕЦ
3 пакет запрос.
Этот пакет в принципе не нужен. Тут ничего не вычисляем и не соединяем. Мы просто выбираем временную таблицу «ВТ_Результат» из 2 пакета и все ее поля. Но все же этот пакет удобен на для отладки. Например, хотим мы посмотреть, что получается в результате выполнения 1 пакета – удаляем из таблиц «ВТ_Результат», выбираем временную таблицу «ВТ_ПринятыеУволенныеЗаПериод» и все ее поля. Все – готово.
Или можем создать еще один пакет-запрос, в котором что-то с чем-то соединить, поместить во временную таблицу и точно так же вывести.
История изменений:
07.06.2010 - текст запроса был изменен после рекомендаций Armando, более доходчиво написано для чего нужет 1 пакет-запрос.
08.06.2010 - в первом пакете измен текст условия на периоды