gifts2017

ЗУП. Актуальные сведения о должности и подразделении в списке справочника Сотрудники

Опубликовал AHDP (AHDP) в раздел Администрирование - Сервисные утилиты

Справочник СотрудникиОрганизации имеет вспомогательные реквизиты, данные в которых служат для отображения текущих значений должности и подразделения сотрудника. К сожалению, в конфигурации не предусмотрено механизма поддержания актуальности этих сведений на текущую дату. А так как 1С должна использоваться не только для учёта, но и для подготовки кадровых приказов, может возникнуть ситуация когда в списке справочника отображаются неактуальные сведения.

Прелюдия. Вот решили наши кадровики оформить реорганизацию и подготовили сразу пачку приказов будущим периодом, но всё не стоит на месте, и им приходится править ещё не вступившие в силу приказы. Wink Смотрят они в справочник и ничего уже понять не могут. Cry

 

Описание проблемы. Для отображения в списке справочника Сотрудники организации сведений о должности и подразделении работника 1С:ЗУП использует вспомогательные реквизиты справочника. К сожалению, штатно не предусмотрено поддержание их в актуальном состоянии на текущий день. Исправить этот недочёт достаточно просто.

 

Облегчим жизнь кадровикам вот таким кодом (можно воспользоваться приложенной обработкой):

            Запрос = Новый Запрос;

            Запрос.Текст =

                        "ВЫБРАТЬ

                        |           РаботникиОрганизацийСрезПоследних.Должность,

                        |           РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации,

                        |           СотрудникиОрганизаций.Ссылка,

                        |           СотрудникиОрганизаций.ТекущееПодразделениеОрганизации,

                        |           СотрудникиОрганизаций.ТекущаяДолжностьОрганизации

                        |           ИЗ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций

                        |                       СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ТекущаяДата) КАК РаботникиОрганизацийСрезПоследних

                        |                                  ПО РаботникиОрганизацийСрезПоследних.Сотрудник = СотрудникиОрганизаций.Ссылка";

            Запрос.УстановитьПараметр("ТекущаяДата", КонецДня(ТекущаяДата()));

            Результат = Запрос.Выполнить();

 

            ВыборкаДетальныеЗаписи = Результат.Выбрать();

 

            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

                        Актуализирован = Ложь;

                        Если Не ВыборкаДетальныеЗаписи.Должность = ВыборкаДетальныеЗаписи.ТекущаяДолжностьОрганизации Тогда

                                   Сотрудник = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();

                                   Сотрудник.ТекущаяДолжностьОрганизации = ВыборкаДетальныеЗаписи.Должность;

                                   Актуализирован = Истина;

                        КонецЕсли;

                        Если Не ВыборкаДетальныеЗаписи.ПодразделениеОрганизации = ВыборкаДетальныеЗаписи.ТекущееПодразделениеОрганизации Тогда

                                   Если ПустаяСтрока(Сотрудник) Тогда

                                               Сотрудник = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();

                                   КонецЕсли;

                                    Сотрудник.ТекущееПодразделениеОрганизации = ВыборкаДетальныеЗаписи.ПодразделениеОрганизации;

                                   Актуализирован = Истина;

                        КонецЕсли;

                       

                        Если Актуализирован Тогда

                                   Сотрудник.ПолучитьКадровыеДанныеФизлица = Ложь;

                                    Сотрудник.Записать();

                        КонецЕсли;

            КонецЦикла;

 

А себе облегчим жизнь создав регламентное задание, которое будет раз в день актуализировать данные.

 

ЗЫ В описании решения букв больше чем в самом решении. Cool

 

 

 

Скачать файлы

Наименование Файл Версия Размер
АктуализацияСведенийОСотрудниках.epf 56
.epf 6,20Kb
25.10.12
56
.epf 6,20Kb Скачать

См. также

Contragent+ 5.0 от 2 500
Подписаться Добавить вознаграждение

Комментарии

1. AHDP (AHDP) 26.10.12 10:22
Для регламентного задания, только актуализирующего состояние справочника следует использовать этот код:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|РаботникиОрганизацийСрезПоследних.Должность,
|РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации,
|СотрудникиОрганизаций.Ссылка
| ИЗ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
| СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ТекущаяДата) КАК РаботникиОрганизацийСрезПоследних
| ПО РаботникиОрганизацийСрезПоследних.Сотрудник = СотрудникиОрганизаций.Ссылка
| И Не (РаботникиОрганизацийСрезПоследних.Должность = СотрудникиОрганизаций.ТекущаяДолжностьОрганизации Или РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации = СотрудникиОрганизаций.ТекущееПодразделениеОрганизации)";

Запрос.УстановитьПараметр("ТекущаяДата", КонецДня(ТекущаяДата()));
ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сотрудник = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
Сотрудник.ТекущаяДолжностьОрганизации = ВыборкаДетальныеЗаписи.Должность;
Сотрудник.ТекущееПодразделениеОрганизации = ВыборкаДетальныеЗаписи.ПодразделениеОрганизации;
Сотрудник.ПолучитьКадровыеДанныеФизлица = Ложь;
Сотрудник.Записать();
КонецЦикла;
2. Ольга (elf78) 26.10.12 12:01
В общее-то эта информация есть и обновляется при проведении кадровых документов. В справочнике СотрудниковОрганизации есть реквизиты ТекущееПодразделениеОрганизации и ТекущаяДолжностьОрганизации, в которые пишутся актуальные данные при проведении по регистру сведений Работники организаций с помощью процедуры Общего модуля "ПолныеПраваЗК"
// В процедуре всем сотрудникам, которые есть в документе регистраторе,
// устанавливаются текущие кадровые данные
// Перед записью данных необходимо отобрать данные без учета регистратора
// При записи данных необходимо отбирать данные с учетом регистратора
//
Процедура ЗаписатьТекущиеКадровыеДанныеСотрудникаОрганизации(Отказ, Замещение, БезРегистратора, Регистратор) Экспорт

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

Запрос.УстановитьПараметр("Регистратор", Регистратор);

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

Выборка = Запрос.Выполнить().Выбрать();

УстановитьРеквизитыИЗаписатьСотрудникаОрганизации(Выборка, Отказ);

КонецПроцедуры
3. AHDP (AHDP) 26.10.12 12:09
elf78, Вы не внимательно прочитали анотацию. Предлагеаемое регламентное задание и предназначено для борьбы с "последствиями" указанного вами алгориртма.
ЗЫ Оно родилось из обработки, разгребавшей "кадровые" истории.
4. Ольга (elf78) 26.10.12 12:35
Понятно.. я смотрю в российском ЗУП нет последовательности кадровых документов
5. al petrov (petrov_al) 27.10.12 12:53
(3) AHDP,а вот такая ситуация 01.10.2012 у сотрудника было текущее подразделение "А". С 02.10.2012 сотрудника перевели приказом в подразделение "В" с периодом завершения 03.10.2012. Какое текущее подразделение будет в справочнике сотрудники и какое фактически допустим 04.10.2012? Помоему у вас в запросе это неучитывается.
6. Марина Чирина (chmv) 29.10.12 12:47
7. mikhailovaew (mikhailovaew) 20.11.12 11:49
А в древних релизах ЗУП в справочнике Сотрудники отображались актуальные должность и подразделение, не из реквизитов, а динамически рассчитываемые... Потом от этого отказались. "Это поведения было отменено как излишне ресурсоемкое более трех лет назад. Показ "актуальных" данных приводит к проблемам с пролистыванием списка сотрудников."
8. Mr. Alf Garcia (mip128) 06.07.13 11:46
А с ГПХшниками что ты делаешь?
9. Михаил (Gasilin) 04.06.14 14:41
Полезное регламентное задание. В частности в карточке сотрудника при временном перемещении пишет должность завершения, а не текущую.
+
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа