Публикация написана мной в далеком 2011 году. Некоторые описанные технические приемы сегодня можно сделать более проще, оптимальнее и элегантнее.
Однако, сама суть подхода к реализации отчета на СКД принципиально не изменилась.
Оглавление
1 Отзывы и успешные внедрения
2 Описание для пользователей
3 Примеры настроек отчета
4 Описание для разработчиков и внедренцев
4.1 Структура регистров для получения данных
4.2 Первый пакет: РС_РаботникиОрганизаций
4.3 Второй пакет: ВТ_ТаблицаСотрудников
4.4 Третий пакет: РС_СостоянияСотрудников
4.5 Четвертый пакет: ВТ_СостоянияСотрудниковДополненные
4.6 Пятый пакет: ВТ_СостоянияСУчетомПересеченийПериодов
4.7 Шестой пакет: ВТ_СостоянияРазвернутые
4.8 Седьмой пакет: ВТ_СверткаПоследовательныхОдинаковыхЗаписейСостояний
4.9 Результирующий пакет
4.10 Использование индексов и индексирования
Обратная связь
Обновления, изменения, доработки публикации
1 Отзывы и успешные внедрения
1) Резензия Ирины Кондратенко, руководитель HR-практикой, БИТ. ( http://www.1cbit.ru/events_detail.php?ID=130306&ref=46 )
Отчет актуальный, хорошая методологическая проработка. Вызывает уважение профессиональный (системный) подход автора к решению задачи — учтены не только нюансы кадрового учета сотрудников, но и вопросы производительности.
Можем рекомендовать нашим клиентам для использования.
2) Отчет внедрен в некоторых ДЗО ОАО РЖД.
3) Читай комментарии к отчету.
2 Описание для пользователей
Работая с кадровыми и расчетными службами в крупнейшем холдинге РФ, неизбежно сталкиваешься с проблемой сверки и сопоставления кадровых и расчетных данных. В том случае, если учет невыходов оформляется кадровиками путем ввода документов-отклонений, а на основании этих документов вводятся расчетные документы, то возникновение ошибок в оформлении кадровых документов или их несвоевременная регистрация, может вести к неверному начислению зарплаты и как следствие некорректному расчету налогов. Следует принимать во внимание, что расчетчики оперируют понятием «вид расчета», в то время как кадровики – «состояние сотрудника». В этой связи обеспечение надежной связи между «состояниями сотрудников» и «видами расчетов», возможность ее проанализировать и, в случае необходимости, корректировать — краеугольная задача.
Данный отчет позволяет в детальной и настраиваемой форме выводить информацию о состояниях сотрудников за выбранный период. Данные собираются исключительно с кадровых регистров. С помощью этого отчета можно:
1) Контролировать ввод документов отклонений и кадровых приказов на прием и увольнение
2) Сверять кадровые состояния сотрудников с данными из отчета «Форма Т13 (табель)»
3) Сверять кадровые состояния сотрудников с ведомостью начислений и сводом
4) Компоновать в различных разрезах (хоть по гороскопу) данные по состояниям сотрудников.
По просьбе пользователя rasswet, которую он изложил в комментариях к публикации, поясняю:
дней в периоде — это сколько дней неявки приходится на выбранный в параметрах отчета период.
дней отклонения — это общее зарегистрированное в программе число дней неявки.
Например, строим отчет за период с 01 по 31 января 2012 года. Сотрудница 15 декабря 2011 года уходит в отпуск по уходу за ребенком до 2013 года. Тогда дней в периоде =31, а дней отклонения =547.
Вы можете прямо сейчас скачать отчет с этого сайта и начать им пользоваться!
Если у Вас возникли какие-то сложности или есть вопросы и пожелания — пишите на электронную почту: PanteleevI@Inbox.ru
3 Примеры настроек отчета
Основная настройка "По состояниям" :
Экзотическая настройка "Состояния по гороскопу":
Настройка отчета "Для сверки табелей":
4 Описание для разработчиков и внедренцев
Более полутора лет назад создал отчет по состояниям (отклонениям). Он создавался для кадровиков и должен был собирать данные исключительно из "кадровых" регистров, т.е. без учета фактически оплаченных периодов. Конечно, просматривал кто и что сделал по этой теме, но стоящих работ не нашел. Решил изобрести удобный велосипед и таки добился своего. Затем было внедрение и продолжительная работа с замечаниями и пожеланиями. Сейчас после протяженного тестирования мне не стыдно поделиться некоторыми соображениями по этой теме.
4.1 Структура регистров для получения данных
Для решения задачи нам потребуются обработки: «Консоль отчетов» и «Консоль отчетов».
Основные данные для отчета будем собирать с регистров сведений: «СостояниеРаботниковОрганизаций» и «РаботникиОрганизаций».
Рассмотрим структуру этих регистров:
Оба регистра периодические с периодичностью в пределах дня, подчиненные регистратору.
Они имеют два измерения «Сотрудник» и «Организация» (другие измерения, начинающиеся со слова «удалить», уже не используются и представляют собой аппендикс из прошлого).
Важно отметить, что в типовой конфигурации ЗУП 2.5.37.1 в этих регистрах проиндексировано измерение «Организация» и ресурс «Обособленное подразделение»:
Для чего нужно использовать индексирование? В таблице реляционной БД данные хранятся обычно в том порядке, в каком их ввели в таблицу. Такой способ позволяет быстро вводить данные, новые записи просто добавляются в конец таблицы. Но вот если нужно что-то быстро найти, то такой способ хранения обеспечивает некоторые трудности в плане производительности. При индексировании таблицы по измерению «Организация» таблица дополнительно упорядочивается по этому полю и при поиске нужно просматривать меньший объем данных.
Если у вас достаточно большой объем данных (от несколько десятков кадровых движений в день и отклонений), то имеет смысл задуматься, не проиндексировать ли в конфигураторе измерение «Сотрудник»? Практически во всех типовых запросах с использованием регистров сведений «СостояниеРаботниковОрганизаций» и «РаботникиОрганизаций» связь с другими таблицами осуществляется через поля «Сотрудник», так же очень часто на него накладываются различные условия. Аналогично с полями «Период завершения» и «ПричинаИзмененияСостояния».
Замечу, что чрезмерное необоснованное индексирование может значительно ухудшить скорость записи данных в БД.
Откроем консоль отчетов, создадим новый отчет, назовем его «Отчет по состояниям».
В конструкторе компоновке данных добавляем набор данных запрос.
Далее работаем в конструкторе.
4.2 Первый пакет: РС_РаботникиОрганизаций
Для того, чтобы получить отчет по состояниям за период нам нужно сначала получить список всех штатных (в т.ч. и совместителей) сотрудников за период. Получим их из регистра сведений «РаботникиОрганизаций».
Нам нужно получить все записи регистра за период. Для этого объединим реальные записи за период с таблицей среза последних на дату начала периода.
Текст запроса первого пакета:
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
СотрудникиЗаПериод.Сотрудник,
СотрудникиЗаПериод.Регистратор,
СотрудникиЗаПериод.Период КАК Период,
СотрудникиЗаПериод.ЗанимаемыхСтавок,
СотрудникиЗаПериод.ОбособленноеПодразделение,
СотрудникиЗаПериод.ПодразделениеОрганизации,
СотрудникиЗаПериод.Должность,
СотрудникиЗаПериод.ГрафикРаботы,
СотрудникиЗаПериод.ПричинаИзмененияСостояния
ПОМЕСТИТЬ РС_РаботникиОрганизаций
ИЗ
(ВЫБРАТЬ
РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
РаботникиОрганизацийСрезПоследних.Регистратор КАК Регистратор,
ВЫБОР
КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения
ИНАЧЕ РаботникиОрганизацийСрезПоследних.Период
КОНЕЦ КАК Период,
ВЫБОР
КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизацийСрезПоследних.ЗанимаемыхСтавокЗавершения
ИНАЧЕ РаботникиОрганизацийСрезПоследних.ЗанимаемыхСтавок
КОНЕЦ КАК ЗанимаемыхСтавок,
ВЫБОР
КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизацийСрезПоследних.ОбособленноеПодразделениеЗавершения
ИНАЧЕ РаботникиОрганизацийСрезПоследних.ОбособленноеПодразделение
КОНЕЦ КАК ОбособленноеПодразделение,
ВЫБОР
КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизацииЗавершения
ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации
КОНЕЦ КАК ПодразделениеОрганизации,
ВЫБОР
КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизацийСрезПоследних.ДолжностьЗавершения
ИНАЧЕ РаботникиОрганизацийСрезПоследних.Должность
КОНЕЦ КАК Должность,
ВЫБОР
КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизацийСрезПоследних.ГрафикРаботыЗавершения
ИНАЧЕ РаботникиОрганизацийСрезПоследних.ГрафикРаботы
КОНЕЦ КАК ГрафикРаботы,
ВЫБОР
КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостоянияЗавершения
ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния
КОНЕЦ КАК ПричинаИзмененияСостояния
ИЗ
РегистрСведений.РаботникиОрганизаций.СрезПоследних(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), Организация = &ПарамОрганизация) КАК РаботникиОрганизацийСрезПоследних
ГДЕ
(НЕ ВЫБОР
КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостоянияЗавершения
ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния
КОНЕЦ = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение))
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РаботникиОрганизаций.Сотрудник,
РаботникиОрганизаций.Регистратор,
ВЫБОР
КОГДА РаботникиОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизаций.ПериодЗавершения
ИНАЧЕ РаботникиОрганизаций.Период
КОНЕЦ,
ВЫБОР
КОГДА РаботникиОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизаций.ЗанимаемыхСтавокЗавершения
ИНАЧЕ РаботникиОрганизаций.ЗанимаемыхСтавок
КОНЕЦ,
ВЫБОР
КОГДА РаботникиОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизаций.ОбособленноеПодразделениеЗавершения
ИНАЧЕ РаботникиОрганизаций.ОбособленноеПодразделение
КОНЕЦ,
ВЫБОР
КОГДА РаботникиОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизаций.ПодразделениеОрганизацииЗавершения
ИНАЧЕ РаботникиОрганизаций.ПодразделениеОрганизации
КОНЕЦ,
ВЫБОР
КОГДА РаботникиОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизаций.ДолжностьЗавершения
ИНАЧЕ РаботникиОрганизаций.Должность
КОНЕЦ,
ВЫБОР
КОГДА РаботникиОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизаций.ГрафикРаботыЗавершения
ИНАЧЕ РаботникиОрганизаций.ГрафикРаботы
КОНЕЦ,
ВЫБОР
КОГДА РаботникиОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РаботникиОрганизаций.ПричинаИзмененияСостоянияЗавершения
ИНАЧЕ РаботникиОрганизаций.ПричинаИзмененияСостояния
КОНЕЦ
ИЗ
РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
РаботникиОрганизаций.Организация = &ПарамОрганизация
И РаботникиОрганизаций.Период > НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РаботникиОрганизаций.Период <= КОНЕЦПЕРИОДА(&ОкончаниеПериода, ДЕНЬ)) КАК СотрудникиЗаПериод
ИНДЕКСИРОВАТЬ ПО
СотрудникиЗаПериод.Сотрудник,
Период
Количество полей.
9полей: Сотрудник, Регистратор, Период , Организация, ЗанимаемыхСтавой, Обособленное Подразделение, ПодразделениеОрганизации, Должность, ГрафикРаботы, ПричинаИзмененияСостояния.
5 ссылочных, 2 примитивных.
Количество записей.
Строк при выводе результата в тестовой базе 1750 с отбором за 2011 год.
Таблица результирующих записей (не вся):
|
|
|
|
|
1
|
Александр
|
01.01.2011
|
Перемещение
|
Отделение эксплуатации
|
|
2
|
Анатолий
|
01.01.2011
|
Перемещение
|
Сектор дизайна
|
|
3
|
Анатолий
|
11.10.2011
|
Увольнение
|
Сектор дизайна
|
|
4
|
Альбина
|
01.01.2011
|
Перемещение
|
Сектор организационного обеспечения
|
|
5
|
Жанна
|
01.01.2011
|
Перемещение
|
Сектор методического обеспечения
|
|
6
|
Ксения
|
01.01.2011
|
Перемещение
|
Отдел комплексных систем
|
|
7
|
Ксения
|
13.05.2011
|
Увольнение
|
Отдел комплексных систем
|
|
Мы добились своей цели: отобрали все записи регистра сведений за период. При этом не забыли последние записи с увольнениями.
4.3 Второй пакет: ВТ_ТаблицаСотрудников
В предыдущем пакете мы получили все актуальные записи регистра сведений «РаботникиОрганизаций». Теперь выберем из них уникальных сотрудников.
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РС_РаботникиОрганизаций.Сотрудник КАК Сотрудник
ПОМЕСТИТЬ ВТ_ТаблицаСотрудников
ИЗ
РС_РаботникиОрганизаций КАК РС_РаботникиОрганизаций
СГРУППИРОВАТЬ ПО
РС_РаботникиОрганизаций.Сотрудник
ИНДЕКСИРОВАТЬ ПО
Сотрудник;
Количество полей.
1поле: Сотрудник
1 ссылочное.
Количество записей.
Строк при выводе результата в тестовой базе 1140 с отбором за 2011 год.
4.4 Третий пакет: РС_СостоянияСотрудников
Получим все записи регистра сведений «СостояниеРаботниковОрганизаций» за 2011 год.
Для этого объединим реальные записи за период с таблицей среза последних на дату начала периода.
Таблица записей регистра (с отбором по сотруднику за 2010 год):
|
|
|
|
|
|
1
|
Александр Анатольевич
|
11.11.2009
|
В командировке
|
14.11.2009
|
Работает
|
|
2
|
Александр Анатольевич
|
22.03.2010
|
В ежегодном отпуске
|
27.03.2010
|
Работает
|
|
3
|
Александр Анатольевич
|
05.04.2010
|
В командировке
|
08.04.2010
|
Работает
|
|
4
|
Александр Анатольевич
|
04.05.2010
|
В ежегодном отпуске
|
08.05.2010
|
Работает
|
|
5
|
Александр Анатольевич
|
25.05.2010
|
В командировке
|
28.05.2010
|
Работает
|
|
6
|
Александр Анатольевич
|
05.07.2010
|
В ежегодном отпуске
|
11.07.2010
|
Работает
|
|
7
|
Александр Анатольевич
|
11.07.2010
|
В ежегодном отпуске
|
17.07.2010
|
Работает
|
|
8
|
Александр Анатольевич
|
10.08.2010
|
В командировке
|
14.08.2010
|
Работает
|
|
9
|
Александр Анатольевич
|
03.10.2010
|
В командировке
|
07.10.2010
|
Работает
|
|
10
|
Александр Анатольевич
|
25.10.2010
|
В ежегодном отпуске
|
30.10.2010
|
Работает
|
|
11
|
Александр Анатольевич
|
01.12.2010
|
В командировке
|
03.02.2011
|
Работает
|
|
|
|
|
|
|
|
|
|
В приведенном примере набора записей для нас прежде всего будут интересны первая и последняя строки. Поскольку мы формируем отчет с 01.01.2010, то первую строку нужно преобразовать так, чтобы «период завершения» поставить на место «периода» и «состояние завершения» на место «состояния»:
1
|
Александр Анатольевич
|
11.11.2009
|
В командировке
|
14.11.2009
|
Работает
|
|
1
|
Александр Анатольевич
|
14.11.2009
|
Работает
|
|
|
В тексте запроса поле «ПЕРИОД» это можно вычислить так:
ВЫБОР
КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода,ДЕНЬ)
И СостояниеРаботниковОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения
ИНАЧЕ СостояниеРаботниковОрганизаций.Период
КОНЕЦ
А поле «ПЕРИОД ЗАВЕРШЕНИЯ» следующим образом:
ВЫБОР
КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода,ДЕНЬ)
И СостояниеРаботниковОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ СостояниеРаботниковОрганизаций.ПериодЗавершения
КОНЕЦ
В последней строке поля «период завершения» и «состояние завершения» не несут смысловой нагрузки, поскольку отчет по 31.12.2010.
11
|
Александр Анатольевич
|
01.12.2010
|
В командировке
|
03.02.2011
|
Работает
|
|
11
|
Александр Анатольевич
|
01.12.2010
|
В командировке
|
|
|
ВЫБРАТЬ РАЗРЕШЕННЫЕ
СостояниеРаботниковОрганизаций.Сотрудник КАК Сотрудник,
СостояниеРаботниковОрганизаций.Организация КАК Организация,
СостояниеРаботниковОрганизаций.Регистратор,
ВЫБОР
КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И СостояниеРаботниковОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения
ИНАЧЕ СостояниеРаботниковОрганизаций.Период
КОНЕЦ КАК Период,
ВЫБОР
КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И СостояниеРаботниковОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА СостояниеРаботниковОрганизаций.СостояниеЗавершения
ИНАЧЕ СостояниеРаботниковОрганизаций.Состояние
КОНЕЦ КАК Состояние,
ВЫБОР
КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И СостояниеРаботниковОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения > КОНЕЦПЕРИОДА(&ОкончаниеПериода, ДЕНЬ)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ СостояниеРаботниковОрганизаций.ПериодЗавершения
КОНЕЦ КАК ПериодЗавершения,
ВЫБОР
КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И СостояниеРаботниковОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ПустаяСсылка)
КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения > КОНЕЦПЕРИОДА(&ОкончаниеПериода, ДЕНЬ)
ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ПустаяСсылка)
ИНАЧЕ СостояниеРаботниковОрганизаций.СостояниеЗавершения
КОНЕЦ КАК СостояниеЗавершения
ПОМЕСТИТЬ РС_СостоянияСотрудников
ИЗ
РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
ГДЕ
СостояниеРаботниковОрганизаций.Сотрудник В
(ВЫБРАТЬ
ВТ.Сотрудник
ИЗ
ВТ_ТаблицаСотрудников КАК ВТ)
И СостояниеРаботниковОрганизаций.Период > НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И СостояниеРаботниковОрганизаций.Период <= КОНЕЦПЕРИОДА(&ОкончаниеПериода, ДЕНЬ)
И СостояниеРаботниковОрганизаций.Организация = &ПарамОрганизация
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
СостояниеРаботниковОрганизацийСрезПоследних.Сотрудник,
СостояниеРаботниковОрганизацийСрезПоследних.Организация,
СостояниеРаботниковОрганизацийСрезПоследних.Регистратор,
ВЫБОР
КОГДА СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения
ИНАЧЕ СостояниеРаботниковОрганизацийСрезПоследних.Период
КОНЕЦ,
ВЫБОР
КОГДА СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА СостояниеРаботниковОрганизацийСрезПоследних.СостояниеЗавершения
ИНАЧЕ СостояниеРаботниковОрганизацийСрезПоследних.Состояние
КОНЕЦ,
ВЫБОР
КОГДА СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
КОГДА СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения > КОНЕЦПЕРИОДА(&ОкончаниеПериода, ДЕНЬ)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения
КОНЕЦ,
ВЫБОР
КОГДА СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ПустаяСсылка)
КОГДА СостояниеРаботниковОрганизацийСрезПоследних.ПериодЗавершения > КОНЕЦПЕРИОДА(&ОкончаниеПериода, ДЕНЬ)
ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ПустаяСсылка)
ИНАЧЕ СостояниеРаботниковОрганизацийСрезПоследних.СостояниеЗавершения
КОНЕЦ
ИЗ
РегистрСведений.СостояниеРаботниковОрганизаций.СрезПоследних(
НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ),
Сотрудник В
(ВЫБРАТЬ
ВТ.Сотрудник
ИЗ
ВТ_ТаблицаСотрудников КАК ВТ)
И Организация = &ПарамОрганизация) КАК СостояниеРаботниковОрганизацийСрезПоследних
ИНДЕКСИРОВАТЬ ПО
Сотрудник,
Период,
ПериодЗавершения,
Организаци;
Количество полей.
7полей: Сотрудник, Регистратор, Период ,Состояние, Организация, ПериодЗавершения, СостояниеЗавершения.
5 ссылочных, 2 примитивных.
Количество записей.
Строк при выводе результата в тестовой базе 50807 с отбором за 2011 год.
4.5 Четвертый пакет: ВТ_СостоянияСотрудниковДополненные
Рассмотрим еще один возможный случай.
Записи регистра за период (01.01.2010-31.12.2010) с отбором по сотруднику:
|
|
|
|
|
|
№ п/п
|
Сотрудник
|
Период
|
Состояние
|
Дата возврата
|
Состояние по окончании
|
|
1
|
Артем Михайлович
|
14.04.2010
|
Болеет
|
|
|
|
Первая запись в регистре о болезни, до этого строк нет. Получается временной пробел за период 01.01.2010-13.04.2010. Если разобраться, то мы увидим, что сотрудник был принят 01.03.2010, но документ «Прием на работу в организацию» не делает проводок по регистру состояний с состоянием «Работает».
Или еще один пример. Сотрудник принят 07.08.2010 и с тех пор в базе не было введено по нему ни одного документа отклонения (очень трудолюбивый стахановец). Поскольку документ «Прием на работу в организацию» не делает проводок по регистру состояний с состоянием «Работает» то нам нужно сделать это прямо в запросе вручную.
Документ «Увольнение из организации» так же не делает проводок по регистру состояний. В этой связи нам так же нужно обрабатывать такие случаи в запросе.
Для восполнения временного пробела нам нужно:
1) выявить всех сотрудников, у которых нет ни одной записи с Периодом и ПериодомЗавершения (если он заполнен)
2) для каждого сотрудника из 1) получить таблицу с полями: сотрудник, дата приема и состояние = «Работает» из регистра «Работники организаций».
3) объединить полученные записи о приемах в организацию с записями временной таблицы РС_СостоянияСотрудников 2 пакета.
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
Вложенный.Сотрудник,
Вложенный.Организация,
Вложенный.Регистратор,
Вложенный.Период,
Вложенный.Состояние,
Вложенный.ПериодЗавершения,
Вложенный.СостояниеЗавершения
ПОМЕСТИТЬ ВТ_СостоянияСотрудниковДополненные
ИЗ
(ВЫБРАТЬ
РаботникиОрганизацийСрезПервых.Сотрудник КАК Сотрудник,
РаботникиОрганизацийСрезПервых.Организация КАК Организация,
РаботникиОрганизацийСрезПервых.Регистратор КАК Регистратор,
РаботникиОрганизацийСрезПервых.Период КАК Период,
ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.Работает) КАК Состояние,
ДАТАВРЕМЯ(1, 1, 1) КАК ПериодЗавершения,
ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ПустаяСсылка) КАК СостояниеЗавершения
ИЗ
РегистрСведений.РаботникиОрганизаций.СрезПервых(
,
Сотрудник В
(ВЫБРАТЬ
ВТ.Сотрудник
ИЗ
ВТ_ТаблицаСотрудников КАК ВТ)
И ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу)
И Организация = &ПарамОрганизация) КАК РаботникиОрганизацийСрезПервых
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РС_СостоянияСотрудников.Сотрудник КАК Сотрудник
ИЗ
РС_СостоянияСотрудников КАК РС_СостоянияСотрудников
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РС_СостоянияСотрудников.Сотрудник КАК Сотрудник
ИЗ
РС_СостоянияСотрудников КАК РС_СостоянияСотрудников
ГДЕ
ВЫБОР
КОГДА РС_СостоянияСотрудников.ПериодЗавершения = ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РС_СостоянияСотрудников.Период <= НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
ИНАЧЕ РС_СостоянияСотрудников.Период <= НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
ИЛИ РС_СостоянияСотрудников.ПериодЗавершения <= НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
КОНЕЦ
СГРУППИРОВАТЬ ПО
РС_СостоянияСотрудников.Сотрудник) КАК СотрудникиСЗаписямиНаПериодНачало
ПО РС_СостоянияСотрудников.Сотрудник = СотрудникиСЗаписямиНаПериодНачало.Сотрудник
ГДЕ
СотрудникиСЗаписямиНаПериодНачало.Сотрудник ЕСТЬ NULL
СГРУППИРОВАТЬ ПО
РС_СостоянияСотрудников.Сотрудник) КАК СотрудникиДляПоискаДатыПриема
ПО РаботникиОрганизацийСрезПервых.Сотрудник = СотрудникиДляПоискаДатыПриема.Сотрудник
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РС_СостоянияСотрудников.Сотрудник,
РС_СостоянияСотрудников.Организация,
РС_СостоянияСотрудников.Регистратор,
РС_СостоянияСотрудников.Период,
РС_СостоянияСотрудников.Состояние,
РС_СостоянияСотрудников.ПериодЗавершения,
РС_СостоянияСотрудников.СостояниеЗавершения
ИЗ
РС_СостоянияСотрудников КАК РС_СостоянияСотрудников
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL,
РаботникиОрганизацийСрезПервых.Организация,
РаботникиОрганизацийСрезПервых.Регистратор,
РаботникиОрганизацийСрезПервых.Период,
ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.Работает),
ДАТАВРЕМЯ(1, 1, 1),
ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ПустаяСсылка)
ИЗ
РС_РаботникиОрганизаций КАК ВТ_ТаблицаСотрудников,
РС_СостоянияСотрудников КАК РС_СостоянияСотрудников,
РегистрСведений.РаботникиОрганизаций.СрезПервых(
,
Сотрудник В
(ВЫБРАТЬ
ВТ.Сотрудник
ИЗ
ВТ_ТаблицаСотрудников КАК ВТ)
И ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу)
И Организация = &ПарамОрганизация) КАК РаботникиОрганизацийСрезПервых
ГДЕ
РС_СостоянияСотрудников.Сотрудник ЕСТЬ NULL
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РаботникиОрганизаций.Сотрудник,
РаботникиОрганизаций.Организация,
РаботникиОрганизаций.Регистратор,
РаботникиОрганизаций.Период,
ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.НеРаботает),
ДАТАВРЕМЯ(1, 1, 1),
ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ПустаяСсылка)
ИЗ
РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
РаботникиОрганизаций.Регистратор ССЫЛКА Документ.УвольнениеИзОрганизаций
И РаботникиОрганизаций.Период МЕЖДУ НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ) И КОНЕЦПЕРИОДА(&ОкончаниеПериода, ДЕНЬ)) КАК Вложенный
ИНДЕКСИРОВАТЬ ПО
Вложенный.Сотрудник,
Вложенный.Период,
Вложенный.ПериодЗавершения;
Количество полей.
7полей: Сотрудник, Организация, Регистратор, Период, Состояние, ПериодЗавершения , СостояниеЗавершения.
Из них 5 ссылочных, 2 примитивных.
Количество записей.
Строк при выводе результата в тестовой базе 6074 с отбором за 2011 год.
4.6 Пятый пакет: ВТ_СостоянияСУчетомПересеченийПериодов
Рассмотрим случаи пересечения периодов.
Записи регистра за период (01.01.2010-31.12.2010) с отбором по сотруднику:
|
|
|
|
|
|
|
|
|
|
|
|
|
№ п/п
|
Сотрудник
|
Период
|
Состояние
|
Период завершения
|
Состояние завершения
|
Регистратор
|
|
13
|
Анатолий Борисович
|
01.01.2010
|
В ежегодном отпуске
|
23.01.2010
|
Работает
|
Отпуска организаций 1910-ОТ от 22.12.2009 0:00:00
|
|
14
|
Анатолий Борисович
|
15.01.2010
|
В отпуске без сохранения зарплаты
|
25.03.2010
|
Работает
|
Отпуска организаций 45-ОБ от 23.03.2010 10:39:34
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
При наличии таких записей отчет нам должен четко показать следующую информацию:
С 01.01 по 14.01 – ежегодный отпуск
С 15.01 по 25.03 – отпуск без сохранения
Другими словами нам нужно:
1) найти все записи, для которых существуют другие записи, разрывающие их периоды или совпадающие с ними
2) в найденных записях вычислить ПериодЗавершения=Дата(1,1,1) и СостояниеЗавершения=ПустаяСсылка
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Вложенный.Сотрудник КАК Сотрудник,
Вложенный.Организация КАК Организация,
Вложенный.Регистратор КАК Регистратор,
Вложенный.Период КАК Период,
Вложенный.Состояние КАК Состояние
ПОМЕСТИТЬ ВТ_СостоянияСУчетомПересеченийПериодов
ИЗ
(ВЫБРАТЬ РАЗЛИЧНЫЕ
ВТ_СостоянияСотрудниковДополненные1.Сотрудник КАК Сотрудник,
ВТ_СостоянияСотрудниковДополненные1.Организация КАК Организация,
ВТ_СостоянияСотрудниковДополненные1.Регистратор КАК Регистратор,
ВЫБОР
КОГДА ВТ_СостоянияСотрудниковДополненные2.Сотрудник ЕСТЬ NULL
ТОГДА ВТ_СостоянияСотрудниковДополненные1.ПериодЗавершения
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
КОНЕЦ КАК Период,
ВЫБОР
КОГДА ВТ_СостоянияСотрудниковДополненные2.Сотрудник ЕСТЬ NULL
ТОГДА ВТ_СостоянияСотрудниковДополненные1.СостояниеЗавершения
ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ПустаяСсылка)
КОНЕЦ КАК Состояние
ИЗ
ВТ_СостоянияСотрудниковДополненные КАК ВТ_СостоянияСотрудниковДополненные1
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СостоянияСотрудниковДополненные КАК ВТ_СостоянияСотрудниковДополненные2
ПО ВТ_СостоянияСотрудниковДополненные1.Сотрудник = ВТ_СостоянияСотрудниковДополненные2.Сотрудник
И (ВТ_СостоянияСотрудниковДополненные1.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1))
И (ВТ_СостоянияСотрудниковДополненные2.Период > ВТ_СостоянияСотрудниковДополненные1.Период)
И (ВТ_СостоянияСотрудниковДополненные2.Период <= ВТ_СостоянияСотрудниковДополненные1.ПериодЗавершения)
И ВТ_СостоянияСотрудниковДополненные1.Организация = ВТ_СостоянияСотрудниковДополненные2.Организация
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВТ_СостоянияСотрудниковДополненные.Сотрудник,
ВТ_СостоянияСотрудниковДополненные.Организация,
ВТ_СостоянияСотрудниковДополненные.Регистратор,
ВТ_СостоянияСотрудниковДополненные.Период,
ВТ_СостоянияСотрудниковДополненные.Состояние
ИЗ
ВТ_СостоянияСотрудниковДополненные КАК ВТ_СостоянияСотрудниковДополненные) КАК Вложенный
ГДЕ
(НЕ Вложенный.Период = ДАТАВРЕМЯ(1, 1, 1))
ИНДЕКСИРОВАТЬ ПО
Сотрудник,
Период;
Количество полей.
5полей: Сотрудник, Организация, Регистратор, Период, Состояние
3 ссылочных, 2 примитивных.
Количество записей.
Строк при выводе результата в тестовой базе 9493 с отбором за 2011 год.
4.7 Шестой пакет: ВТ_СостоянияРазвернутые
Получим из 1 записи 2 записи, будто «разворачивая» их. Например из 1записи:
№ п/п
|
Сотрудник
|
Период
|
Состояние
|
Период завершения
|
Состояние завершения
|
Регистратор
|
13
|
Анатолий Борисович
|
11.01.2010
|
В ежегодном отпуске
|
23.01.2010
|
Работает
|
Отпуска организаций 1910-ОТ от 22.12.2009 0:00:00
|
получим 2 записи:
№ п/п
|
Сотрудник
|
Период
|
Состояние
|
Регистратор
|
13
|
Анатолий Борисович
|
11.01.2010
|
В ежегодном отпуске
|
Отпуска организаций 1910-ОТ от 22.12.2009 0:00:00
|
14
|
Анатолий Борисович
|
23.01.2010
|
Работает
|
Отпуска организаций 1910-ОТ от 22.12.2009 0:00:00
|
Количество записей получится не ровно в 2 раза больше, т.к. будет еще условие.
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Состояния.Регистратор КАК РегистраторСостояния,
ВЫБОР
КОГДА Состояния.Регистратор ССЫЛКА Документ.ВозвратНаРаботуОрганизаций
ТОГДА "Возврат на работу"
КОГДА Состояния.Регистратор ССЫЛКА Документ.ИзменениеУсловийОплатыОтпускаПоУходуЗаРебенком
ТОГДА "Изменение условий оплаты отпуска по уходу"
КОГДА Состояния.Регистратор ССЫЛКА Документ.КадровоеПеремещениеОрганизаций
ТОГДА "Кадровое перемещение"
КОГДА Состояния.Регистратор ССЫЛКА Документ.КомандировкиОрганизаций
ТОГДА "Командировка"
КОГДА Состояния.Регистратор ССЫЛКА Документ.НеявкиИБолезниОрганизаций
ТОГДА "Неявки и болезни"
КОГДА Состояния.Регистратор ССЫЛКА Документ.ОтпускаОрганизаций
ТОГДА "Отпуск"
КОГДА Состояния.Регистратор ССЫЛКА Документ.ОтпускПоУходуЗаРебенком
ТОГДА "Отпуск по уходу"
КОГДА Состояния.Регистратор ССЫЛКА Документ.ПриемНаРаботуВОрганизацию
ТОГДА "Прием на работу"
КОГДА Состояния.Регистратор ССЫЛКА Документ.УвольнениеИзОрганизаций
ТОГДА "Увольнение"
КОГДА Состояния.Регистратор ССЫЛКА Документ.ПереносДанных
ТОГДА "Перенос данных"
ИНАЧЕ "Прочее"
КОНЕЦ КАК РегистраторСостоянияВид,
Состояния.Организация КАК Организация,
Состояния.Сотрудник КАК Сотрудник,
Состояния.ПериодС КАК ПериодС,
Состояния.ПериодПо КАК ПериодПо,
Состояния.Состояние КАК Состояние,
ВЫБОР
КОГДА Состояния.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.НеРаботает)
ТОГДА 0
ИНАЧЕ РАЗНОСТЬДАТ(Состояния.ПериодС, Состояния.ПериодПо, ДЕНЬ) + 1
КОНЕЦ КАК ДнейОтклонения,
ВЫБОР
КОГДА Состояния.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.НеРаботает)
ТОГДА 0
ИНАЧЕ ВЫБОР
КОГДА Состояния.ПериодС < &НачалоПериода
И Состояния.ПериодПо > &ОкончаниеПериода
ТОГДА РАЗНОСТЬДАТ(&НачалоПериода, &ОкончаниеПериода, ДЕНЬ) + 1
КОГДА Состояния.ПериодС < &НачалоПериода
И Состояния.ПериодПо <= &ОкончаниеПериода
ТОГДА РАЗНОСТЬДАТ(&НачалоПериода, Состояния.ПериодПо, ДЕНЬ) + 1
КОГДА Состояния.ПериодС >= &НачалоПериода
И Состояния.ПериодПо > &ОкончаниеПериода
ТОГДА РАЗНОСТЬДАТ(Состояния.ПериодС, &ОкончаниеПериода, ДЕНЬ) + 1
ИНАЧЕ РАЗНОСТЬДАТ(Состояния.ПериодС, Состояния.ПериодПо, ДЕНЬ) + 1
КОНЕЦ
КОНЕЦ КАК ДнейВПериоде
ПОМЕСТИТЬ ВТ_СостоянияРазвернутые
ИЗ
(ВЫБРАТЬ
ВТ_СостоянияСУчетомПересеченийПериодов.Сотрудник КАК Сотрудник,
ВТ_СостоянияСУчетомПересеченийПериодов.Организация КАК Организация,
ВТ_СостоянияСУчетомПересеченийПериодов.Регистратор КАК Регистратор,
ВТ_СостоянияСУчетомПересеченийПериодов.Период КАК ПериодС,
ВЫБОР
КОГДА ВТ_СостоянияСУчетомПересеченийПериодов.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.НеРаботает)
ТОГДА ВТ_СостоянияСУчетомПересеченийПериодов.Период
ИНАЧЕ ЕСТЬNULL(ДОБАВИТЬКДАТЕ(Тета.ПериодСнизу, ДЕНЬ, -1), &ОкончаниеПериода)
КОНЕЦ КАК ПериодПо,
ВТ_СостоянияСУчетомПересеченийПериодов.Состояние КАК Состояние
ИЗ
ВТ_СостоянияСУчетомПересеченийПериодов КАК ВТ_СостоянияСУчетомПересеченийПериодов
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ВТ_СостоянияСУчетомПересеченийПериодов.Сотрудник КАК Сотрудник,
ВТ_СостоянияСУчетомПересеченийПериодов.Организация КАК Организация,
ВТ_СостоянияСУчетомПересеченийПериодов.Период КАК Период,
МИНИМУМ(ВТ_СостоянияСУчетомПересеченийПериодовСнизу.Период) КАК ПериодСнизу
ИЗ
ВТ_СостоянияСУчетомПересеченийПериодов КАК ВТ_СостоянияСУчетомПересеченийПериодов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СостоянияСУчетомПересеченийПериодов КАК ВТ_СостоянияСУчетомПересеченийПериодовСнизу
ПО ВТ_СостоянияСУчетомПересеченийПериодов.Сотрудник = ВТ_СостоянияСУчетомПересеченийПериодовСнизу.Сотрудник
И ВТ_СостоянияСУчетомПересеченийПериодов.Организация = ВТ_СостоянияСУчетомПересеченийПериодовСнизу.Организация
И ВТ_СостоянияСУчетомПересеченийПериодов.Период < ВТ_СостоянияСУчетомПересеченийПериодовСнизу.Период
СГРУППИРОВАТЬ ПО
ВТ_СостоянияСУчетомПересеченийПериодов.Сотрудник,
ВТ_СостоянияСУчетомПересеченийПериодов.Организация,
ВТ_СостоянияСУчетомПересеченийПериодов.Период) КАК Тета
ПО ВТ_СостоянияСУчетомПересеченийПериодов.Сотрудник = Тета.Сотрудник
И ВТ_СостоянияСУчетомПересеченийПериодов.Организация = Тета.Организация
И ВТ_СостоянияСУчетомПересеченийПериодов.Период = Тета.Период) КАК Состояния
ИНДЕКСИРОВАТЬ ПО Сотрудник, ПериодС, ПериодПо;
Количество полей.
9полей: Сотрудник, Организация, РегистраторСостояния, РегистраторСостоянияВид, ПериодС, ПериодПо, Состояние, ДнейОтклонения, ДнейВПериоде .
Из них 5 ссылочных, 4 примитивных.
Количество записей.
Строк при выводе результата в тестовой базе 9493 за 2011 год.
Оптимизация.
Пятый «ВТ_СостоянияСУчетомПересеченийПериодов» и шестой «ВТ_СостоянияРазвернутые
пакеты можно без потери производительности объединить в один пакет.
Выше они специально разделены для более простого понимания того, что происходит.
Оптимизированный пакет «ВТ_СостоянияРазвернутые» будет выглядеть вот так:
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Вложенный.Сотрудник,
Вложенный.Организация,
Вложенный.Регистратор,
Вложенный.Период,
Вложенный.Состояние
ПОМЕСТИТЬ ВТ_Развернутые
ИЗ
(ВЫБРАТЬ РАЗЛИЧНЫЕ
ВТ_СостоянияСотрудниковДополненные1.Сотрудник КАК Сотрудник,
ВТ_СостоянияСотрудниковДополненные1.Организация КАК Организация,
ВТ_СостоянияСотрудниковДополненные1.Регистратор КАК Регистратор,
ВЫБОР
КОГДА ВТ_СостоянияСотрудниковДополненные2.Сотрудник ЕСТЬ NULL
ТОГДА ВТ_СостоянияСотрудниковДополненные1.ПериодЗавершения
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
КОНЕЦ КАК Период,
ВЫБОР
КОГДА ВТ_СостоянияСотрудниковДополненные2.Сотрудник ЕСТЬ NULL
ТОГДА ВТ_СостоянияСотрудниковДополненные1.СостояниеЗавершения
ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ПустаяСсылка)
КОНЕЦ КАК Состояние
ИЗ
ВТ_СостоянияСотрудниковДополненные КАК ВТ_СостоянияСотрудниковДополненные1
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СостоянияСотрудниковДополненные КАК ВТ_СостоянияСотрудниковДополненные2
ПО ВТ_СостоянияСотрудниковДополненные1.Сотрудник = ВТ_СостоянияСотрудниковДополненные2.Сотрудник
И (ВТ_СостоянияСотрудниковДополненные1.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1))
И (ВТ_СостоянияСотрудниковДополненные2.Период > ВТ_СостоянияСотрудниковДополненные1.Период)
И (ВТ_СостоянияСотрудниковДополненные2.Период <= ВТ_СостоянияСотрудниковДополненные1.ПериодЗавершения)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВТ_СостоянияСотрудниковДополненные.Сотрудник,
ВТ_СостоянияСотрудниковДополненные.Организация,
ВТ_СостоянияСотрудниковДополненные.Регистратор,
ВТ_СостоянияСотрудниковДополненные.Период,
ВТ_СостоянияСотрудниковДополненные.Состояние
ИЗ
ВТ_СостоянияСотрудниковДополненные КАК ВТ_СостоянияСотрудниковДополненные) КАК Вложенный
ГДЕ
(НЕ Вложенный.Период = ДАТАВРЕМЯ(1, 1, 1));
4.8 Седьмой пакет: ВТ_СверткаПоследовательныхОдинаковыхЗаписейСостояний
В полученной таблице можно найти следующие записи:
Вячеслав
|
Работает
|
03.09.2011
|
05.09.2011
|
Вячеслав
|
Болеет
|
06.09.2011
|
07.09.2011
|
Вячеслав
|
Болеет
|
08.09.2011
|
03.10.2011
|
Вячеслав
|
Болеет
|
04.10.2011
|
19.10.2011
|
Вячеслав
|
Работает
|
20.10.2011
|
31.12.2011
|
Три записи о состоянии «болеет» можно и нужно объединить в одну.
Получим следующую таблицу :
Вячеслав
|
Работает
|
03.09.2011
|
05.09.2011
|
Вячеслав
|
Болеет
|
06.09.2011
|
07.09.2011
|
Вячеслав
|
Работает
|
20.10.2011
|
31.12.2011
|
Теперь нужно не забыть увеличить «ПериодПо» в оставшейся записи на число дней удаленных записей.
В результате получим следующую таблицу:
Вячеслав
|
Работает
|
03.09.2011
|
05.09.2011
|
Вячеслав
|
Болеет
|
06.09.2011
|
19.09.2011
|
Вячеслав
|
Работает
|
20.10.2011
|
31.12.2011
|
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_СостоянияРазвернутые.РегистраторСостояния,
ВТ_СостоянияРазвернутые.РегистраторСостоянияВид,
ВТ_СостоянияРазвернутые.Организация,
ВТ_СостоянияРазвернутые.Сотрудник КАК Сотрудник,
ВТ_СостоянияРазвернутые.ПериодС КАК ПериодС,
ВТ_СостоянияРазвернутые.ПериодПо КАК ПериодПо,
ВТ_СостоянияРазвернутые.Состояние,
ВТ_СостоянияРазвернутые.ДнейОтклонения,
ВТ_СостоянияРазвернутые.ДнейВПериоде
ПОМЕСТИТЬ ВТ_СверткаПоследовательныхОдинаковыхЗаписейСостояний
ИЗ
ВТ_СостоянияРазвернутые КАК ВТ_СостоянияРазвернутые
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ВТ_СостоянияРазвернутые.РегистраторСостояния КАК РегистраторСостояния_ПредЗапись,
ВТ_СостоянияРазвернутые.РегистраторСостоянияВид КАК РегистраторСостоянияВид_ПредЗапись,
ВТ_СостоянияРазвернутые.Организация КАК Организация_ПредЗапись,
ВТ_СостоянияРазвернутые.Сотрудник КАК Сотрудник_ПредЗапись,
ВТ_СостоянияРазвернутые.ПериодС КАК ПериодС_ПредЗапись,
ВТ_СостоянияРазвернутые.ПериодПо КАК ПериодПо_ПредЗапись,
ВТ_СостоянияРазвернутые.Состояние КАК Состояние_ПредЗапись,
ВТ_СостоянияРазвернутые.ДнейОтклонения КАК ДнейОтклонения_ПредЗапись,
ВТ_СостоянияРазвернутые.ДнейВПериоде КАК ДнейВПериоде_ПредЗапись,
ТЕТА.ПериодС КАК ПериодС
ИЗ
(ВЫБРАТЬ
ВТ_СостоянияРазвернутые.Сотрудник КАК Сотрудник,
ВТ_СостоянияРазвернутые.ПериодС КАК ПериодС,
МАКСИМУМ(ВТ_СостоянияРазвернутые_ПредЗапись.ПериодС) КАК ПериодС_ПредЗапись
ИЗ
ВТ_СостоянияРазвернутые КАК ВТ_СостоянияРазвернутые
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СостоянияРазвернутые КАК ВТ_СостоянияРазвернутые_ПредЗапись
ПО ВТ_СостоянияРазвернутые.Сотрудник = ВТ_СостоянияРазвернутые_ПредЗапись.Сотрудник
И ВТ_СостоянияРазвернутые.ПериодС > ВТ_СостоянияРазвернутые_ПредЗапись.ПериодС
СГРУППИРОВАТЬ ПО
ВТ_СостоянияРазвернутые.Сотрудник,
ВТ_СостоянияРазвернутые.ПериодС) КАК ТЕТА
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СостоянияРазвернутые КАК ВТ_СостоянияРазвернутые
ПО ТЕТА.Сотрудник = ВТ_СостоянияРазвернутые.Сотрудник
И ТЕТА.ПериодС_ПредЗапись = ВТ_СостоянияРазвернутые.ПериодС) КАК ПредСостояние
ПО ВТ_СостоянияРазвернутые.Сотрудник = ПредСостояние.Сотрудник_ПредЗапись
И ВТ_СостоянияРазвернутые.ПериодС = ПредСостояние.ПериодС
ГДЕ
(НЕ ЕСТЬNULL(ПредСостояние.Состояние_ПредЗапись, ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ПустаяСсылка)) = ВТ_СостоянияРазвернутые.Состояние)
ИНДЕКСИРОВАТЬ ПО
Сотрудник,
ПериодС,
ПериодПо;
Количество полей.
9полей: Сотрудник, Организация, РегистраторСостояния, РегистраторСостоянияВид, ПериодС, ПериодПо, Состояние, ДнейОтклонения, ДнейВПериоде .
Из них 5 ссылочных, 4 примитивных.
Количество записей.
Строк при выводе результата в тестовой базе 9056 за 2011 год.
4.9 Результирующий пакет
Текст результирующего пакета:
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВЛОЖЕННЫЙ.РегистраторСостояния,
ВЛОЖЕННЫЙ.РегистраторСостоянияВид,
ВЛОЖЕННЫЙ.Организация,
ВЛОЖЕННЫЙ.Сотрудник,
ВЛОЖЕННЫЙ.ПериодС,
ВЛОЖЕННЫЙ.ПериодПо,
ВЛОЖЕННЫЙ.Состояние,
ВЫБОР
КОГДА ВЛОЖЕННЫЙ.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.НеРаботает)
ТОГДА 0
ИНАЧЕ РАЗНОСТЬДАТ(ВЛОЖЕННЫЙ.ПериодС, ВЛОЖЕННЫЙ.ПериодПо, ДЕНЬ) + 1
КОНЕЦ КАК ДнейОтклонения,
ВЫБОР
КОГДА ВЛОЖЕННЫЙ.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.НеРаботает)
ТОГДА 0
ИНАЧЕ ВЫБОР
КОГДА ВЛОЖЕННЫЙ.ПериодС < &НачалоПериода
И ВЛОЖЕННЫЙ.ПериодПо > &ОкончаниеПериода
ТОГДА РАЗНОСТЬДАТ(&НачалоПериода, &ОкончаниеПериода, ДЕНЬ) + 1
КОГДА ВЛОЖЕННЫЙ.ПериодС < &НачалоПериода
И ВЛОЖЕННЫЙ.ПериодПо <= &ОкончаниеПериода
ТОГДА РАЗНОСТЬДАТ(&НачалоПериода, ВЛОЖЕННЫЙ.ПериодПо, ДЕНЬ) + 1
КОГДА ВЛОЖЕННЫЙ.ПериодС >= &НачалоПериода
И ВЛОЖЕННЫЙ.ПериодПо > &ОкончаниеПериода
ТОГДА РАЗНОСТЬДАТ(ВЛОЖЕННЫЙ.ПериодС, &ОкончаниеПериода, ДЕНЬ) + 1
ИНАЧЕ РАЗНОСТЬДАТ(ВЛОЖЕННЫЙ.ПериодС, ВЛОЖЕННЫЙ.ПериодПо, ДЕНЬ) + 1
КОНЕЦ
КОНЕЦ КАК ДнейВПериоде
ИЗ
(ВЫБРАТЬ
ВТ_Свертка.РегистраторСостояния КАК РегистраторСостояния,
ВТ_Свертка.РегистраторСостоянияВид КАК РегистраторСостоянияВид,
ВТ_Свертка.Организация КАК Организация,
ВТ_Свертка.Сотрудник КАК Сотрудник,
ВТ_Свертка.ПериодС КАК ПериодС,
ВЫБОР
КОГДА СледЗапись.ПериодС_СледЗапись ЕСТЬ NULL
ТОГДА ВТ_Свертка.ПериодПо
КОГДА ДОБАВИТЬКДАТЕ(СледЗапись.ПериодС_СледЗапись, ДЕНЬ, -1) = ВТ_Свертка.ПериодПо
ТОГДА ВТ_Свертка.ПериодПо
ИНАЧЕ ДОБАВИТЬКДАТЕ(ЕСТЬNULL(СледЗапись.ПериодС_СледЗапись, ДАТАВРЕМЯ(2011, 1, 1)), ДЕНЬ, -1)
КОНЕЦ КАК ПериодПо,
ВТ_Свертка.Состояние КАК Состояние,
ВТ_Свертка.ДнейОтклонения КАК ДнейОтклонения,
ВТ_Свертка.ДнейВПериоде КАК ДнейВПериоде,
СледЗапись.ПериодС_СледЗапись КАК ПериодС_СледЗапись
ИЗ
ВТ_СверткаПоследовательныхОдинаковыхЗаписейСостояний КАК ВТ_Свертка
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ВТ_Свертка.РегистраторСостояния КАК РегистраторСостояния_СледЗапись,
ВТ_Свертка.РегистраторСостоянияВид КАК РегистраторСостоянияВид_СледЗапись,
ВТ_Свертка.Организация КАК Организация_СледЗапись,
ВТ_Свертка.Сотрудник КАК Сотрудник_СледЗапись,
ВТ_Свертка.ПериодС КАК ПериодС_СледЗапись,
ВТ_Свертка.ПериодПо КАК ПериодПо_СледЗапись,
ВТ_Свертка.Состояние КАК Состояние_СледЗапись,
ВТ_Свертка.ДнейОтклонения КАК ДнейОтклонения_СледЗапись,
ВТ_Свертка.ДнейВПериоде КАК ДнейВПериоде_СледЗапись,
ТЕТА.ПериодС КАК ПериодС
ИЗ
(ВЫБРАТЬ
ВТ_Свертка.Сотрудник КАК Сотрудник,
ВТ_Свертка.ПериодС КАК ПериодС,
МИНИМУМ(ВТ_Свертка_СледЗапись.ПериодС) КАК ПериодС_СледЗапись
ИЗ
ВТ_СверткаПоследовательныхОдинаковыхЗаписейСостояний КАК ВТ_Свертка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СверткаПоследовательныхОдинаковыхЗаписейСостояний КАК ВТ_Свертка_СледЗапись
ПО ВТ_Свертка.Сотрудник = ВТ_Свертка_СледЗапись.Сотрудник
И ВТ_Свертка.ПериодС < ВТ_Свертка_СледЗапись.ПериодС
СГРУППИРОВАТЬ ПО
ВТ_Свертка.Сотрудник,
ВТ_Свертка.ПериодС) КАК ТЕТА
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СверткаПоследовательныхОдинаковыхЗаписейСостояний КАК ВТ_Свертка
ПО ТЕТА.Сотрудник = ВТ_Свертка.Сотрудник
И ТЕТА.ПериодС_СледЗапись = ВТ_Свертка.ПериодС) КАК СледЗапись
ПО ВТ_Свертка.Сотрудник = СледЗапись.Сотрудник_СледЗапись
И ВТ_Свертка.ПериодС = СледЗапись.ПериодС) КАК ВЛОЖЕННЫЙ
Количество полей.
9полей: Сотрудник, Организация, РегистраторСостояния, РегистраторСостоянияВид, ПериодС, ПериодПо, Состояние, ДнейОтклонения, ДнейВПериоде .
Из них 5 ссылочных, 4 примитивных.
Количество записей.
Строк при выводе результата в тестовой базе 9056 за 2011 год.
Нужно понимать, что это полная информация о состояниях более чем 1 тысячи сотрудников за 2011 год.
Полученная таблица является развернутой и наиболее полной информацией о состояниях (отклонениях) сотрудниках за выбранный период. В чистом виде данный запрос рекомендую использовать для создания отчетов, где используется записи регистра сведений «СостояниеРаботниковОрганизаций».
4.10 Использование индексов и индексирования
Давайте сделаем замер производительности запроса на получения записей за период с 01.01.209 по 31.12.2011 год. Сначала будем тестировать на типовой конфигурации ЗУП 2.5.37.1, а затем на измененной, с установленным свойством «индексировать» в измерении «Сотрудник». Запускать запрос будем из обработки «Консоль отчетов». Сортируем по времени выполнения и видим строку №389 Обработка.КонсольОтчетов.Форма :
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанныхКонсоли, ИсполняемыеНастройки, ДанныеРасшифровкиКонсоли);
— это строка и будет нашей лакмусовой бумажкой.
База файловая размером 3,27 Гб, ПК : intel(r) i5 3.33 Ггц, ОЗУ 4 Гб, 32 разрядная ОС Win7.
Замеры делались 20 раз, с предварительной чисткой КЭШа. Таблица усредненных результатов:
Типовая конфигурация
|
Измененная конфигурация с индексированным полем «Сотрудник»
|
Кол
|
Время %
|
Время
|
Кол
|
Время %
|
Время
|
1
|
0,1745
|
1,91
|
1
|
0,1636
|
1,76
|
Замеры показывают, что установка свойства «индексировать» у измерения «Сотрудник» регистров сведений «СостояниеРаботниковОрганизаций» и «РаботникиОрганизаций», дает небольшой прирост производительности. Расплата за производительность – сложности при обновлении конфигурации (а если она типовая, то снятие с поддержки).
Буду рад узнать ваше мнение о статье в комментариях и благодарен за оценку.
Вопросы, предложения сотрудничества и замечания пишите в комментариях, в личку или по адресу Panteleev@Inbox.ru
Резюме автора: //infostart.ru/job/resume/537490/
С пожеланием творческих успехов всем посетителям сайта ИС, Пантелеев Иван.
Обновления, изменения, доработки по просьбам трудящихся
Дата: 20120904. По просьбе пользователя rasswet поясняю:
дней в периоде — это сколько дней неявки приходится на выбранный в параметрах отчета период.
дней отклонения — это общее зарегистрированное в программе число дней неявки.
Например, строим отчет за период с 01 по 31 января 2012 года. Сотрудница 15 декабря 2011 года уходит в отпуск по уходу за ребенком до 2013 года. Тогда дней в периоде =31, а дней отклонения =547.
Дата: 20120907. Новая версия отчета. Исправлены все выявленные ошибки и частные случаи с комбинацией различных отклонений. Отчет тестировался в ЗУП 2.5.54.1 на платформе 8.2.15.310.
Дата: 20120908. Описание отчета поделено на 2 смысловые части: для пользователя (в начале статьи) и для разработчика. В пользовательской части добавлено несколько картинок с примерами настроек отчета.
Дата: 20241107. В описании отчета некоторые куски кода помещены в сворачиваемые текстовые блоки — сниппеты. Добавлено оглавление, пункт "обратная связь".
Моя переработанная статья будет полезна и работникам кадровых служб и разработчикам кадровых отчетов. Вся информация для пользователей размещена в самом начале статьи, ниже идет техническое описание сбора данных для отчета.
К статье прикреплен отчет на основе СКД, который позволяет в детальной и настраиваемой форме выводить информацию о состояниях сотрудников за выбранный период. Данные собираются исключительно с кадровых регистров. Через механизм характеристик реализована поддержка использования категорий и свойств объектов.
В описании для разработчиков я расскажу об основных принципах создания отчета по состояниям (отклонениям) сотрудников организаций за выбранный период. Данные будем брать из регистров сведений «СостояниеРаботниковОрганизаций» и «РаботникиОрганизаций». В файлах выложен полностью работоспособный отчет по статье, который можно быстро адаптировать под Ваши учетные задачи.
(тестировалась в ЗУП 2.5.37.1, 2.5.54.1 / 8.2.14.533, 8.2.15.310)
Перейти к публикации
Автор молодец! Все бы авторы так подробно описывали свои доработки и разработки!
(1)
Спасибо, я старался раскрыть тему как можно глубже.
Недавно снял с публикации свои морально устаревшие работы, после чего вылетел из ТОП 100. Впрочем, ничуть об этом не жалею. Я расту как специалист и считаю, что лучше иметь одну, но достойную статью, чем с десяток «таксебе».
Пока не пробовал на деле, но за труды однозначно плюс!
Отличная и подробная документаци,просто как учебное пособие, автору спасибо за труд!
Автору большое спасиба. Попробуем этот отчет под ЗУП Украина.
Автору для раздумий: у нас несколько организаций в одной базе. Так вот пробовал запускать ваш отчет и попадают сотры из других Организаций, причем только Уволенные. Стал рыть и добавил условие по организации в пакет ВЛОЖЕННЫЙ в четвертый подзапрос. Тогда стало все ОК. 🙂
Есди не секрет, что изменилось в статье в сравнении с предыдущей редакцией (от 23.12.2011 г.)? Какие-либо слова поменялись местами? Добавлено новое предложение? Изменены формы отчётов? Не мешало бы информировать посетителей, а то статья-то немаленькая, и поиск изменений может занять продолжительное время…
Очень хороший отчет, и статья раскрывает суть отчета, однозначно плюсую.
Очень обширная, статья, просто мега громадная ))))))
И кодик проведён )
Дествительно автор молодец, написал все подробно, понятно, что не мало важно!
Для решения задачи нам потребуются обработки: «Консоль отчетов» и «Консоль отчетов».
Тут что-то не так. Наверно, имеется ввиду «Консоль запросов»?
Спасибо, за большую работу большой плюс.
Спасибо. Важная тема, раскрыта глубоко. Очень хороший отчет, и статья содержит все, что нужно.
Актуально, особенно для организаций с магазинами, текучкой продавцов.
спасибо за подробное пояснение
подскажите пожалуйста, что отражается в дней периоде и в дней отклонений.
дней в периоде это количество рабочих дней которые должен был отработать Сотрудник если бы у него не было отклонений? а дней отклонений-это сумма всех отклонений (больничные, декрет и т.п.)? как тогда отклонений больше чем дней в периоде? или я что-то не понимаю?
(21) rasswet, Все просто.
<дней в периоде> — это сколько дней неявки приходится на выбранный в параметрах отчета период.
<дней отклонения> — это общее зарегистрированное в программе число дней неявки.
Например, строим отчет за период с 01 по 31 января 2012 года. Сотрудница 15 декабря 2011 года уходит в отпуск по уходу за ребенком до 2013 года. Тогда <дней в периоде>=31, а <дней отклонения>=547.
(22) спасибо за разъяснение. Возможно имеет смысл где-то в описание это включить? или я это пропустил.
(22) подскажите
делаю отчет за 2012 год, в отчет попадают строки у которых в столбце «период по…» стоит дата 2011 года.
по-моему, в отчет за 12 год не должно быть строк, у которых период по закончился в 11 году. Это прошлый период.
Согласны?
З.Ы. проявляется точно в состоянии «В отпуске без сохранения зарплаты» (достаточно много случаев) и В ежегодном отпуске (немного)
(22) подскажите, это всё же недоработка отчета?
делаю отчет за 2012 год, в отчет попадают строки у которых в столбце «период по…» стоит дата 2011 года.
по-моему, в отчет за 12 год не должно быть строк, у которых период по закончился в 11 году. Это прошлый период.
спасибо за подробное описание, очень нужен был запрос на работавших в периоде, как раз первая таблица пригодилась.
(24)
Выложил новую версию отчета: исправлен лишь частный случай задваивания строк при смене состояний (Командировка->Болеет).
Все варианты и настройки отчета протестированы на большой выборке данных (> 1 тыс. человек). Ошибок не обнаружено.
(5) no_registration,
Под ЗУП (как и УПП) для Украины не подойдет: большое отличие в ресурсах регистра РаботникиОрганизаций: в украинской 7 ресурсов, а тут представлено 13.
Вопрос к автору: эти ресурсы (а точнее: ПериодЗавершения, ЗанимаемыхставокЗавершения и т.п.) были изначально в типовой конфигурации или же добавлены для отчета?
(29)
В описании четко написано на каких конфигурациях тестировался отчет —
это типовые для РФ ЗУП.
Можете скачать их релизы и сравнить с ЗУП для Украины.
А лучше откройте консоль и перепишите под себяя. Это не так сложно )))
Выбор периода не плохо бы добавить на панель и варианты отчётов выложить вместе с отчётом.
(31)
Не все коту масленница
Нет настроек вариантов отчета, по умолчанию открывается знаки зодиака)))
Изначально использовали этот отчет для контроля остатков отпусков, увы в настройках этого нет
Спасибо автору за труды.Суть отчета понятна, мне нужно сделать что-то подобное с нарядами и отклонениями ) спасибо.
А как в настройке сделать,что бы вывести первые 2 отчета?
спасибо, заодно прокачал знания по запросам, автор +
Спасибо за отчет, очень помог кадровой службе.
(2) MagIvan,
это где смотреть?
(38) что где посмотреть?
http://infostart.ru/community/top100/
я имел ввиду, что входил по рейтингу, а потом вылетел:
но меня это уже не расстраивает, поскольку оценка людей в попугаях очень условна
и тем не менее оценка на Ифостарте для меня как рейтинг кредитоспособности гос-ва, выданный S&P (более менее надежная)
времени мало, в боях участвую …
Большое спасибо за отчет! Автор- умница, очень подробно все расписал. От кадров — глубокая благодарность
Спасибо за статью и отчеты!
Кадровики были очень довольны!
И изложение на высоком учовне!
Однозначно + за работу, но есть непонятные ньюансы. Скрин прикрепляю
http://www.foto-me.ru/v.php?id=e03cfd498314fbd75c91cebc9528f892
Зачем, если я выбираю явно один период — отчет захватывает периоды с пересечением да и вдогонку выводит не нужный период ?
по уму бы, хорошо видеть что данный сотрудник был в этом периоде в отпуске …
(42) b-dm,
Сначала подумал, что вы бухгалтер или кадровик, который в глаза не видел конфигуратор. Потом посмотрел — ан нет, вы что-то там писать изволите.
Отчет на СКД был назвал вами обработкой, и весь смысл вашего послания сводился к тому, что вам лень или вы не умеете создавать в режиме предприятия настройки к отчету и сохранять их в справочник «Сохраненные отчеты».
Отчет и его методология буквально разжеваны в статье.
У меня студенты за день въезжают как его настраивать в режиме предприятия в типовой базе.
Короче стыд и позор, товарищ.
(43) Уважаемый laeg!
Данная статья и отчет к ней — это пример правильного методического подхода к разработки отчетов для кадровых служб большого холдинга. Его можно скачать, посмотреть код, осмыслить идеологию и попытаться транспанировать ее на свои базы. Аккуратно и со всей ответственностью.
Отчет, разумеется, не учитывает специфику конкретно вашего предприятия. Так же в вашей базе могут быть ошибки ведения учета. Скачивать его и ставить в готовом виде имеет смысл только если у вас базовая конфигурация или стирильный учет.
Данный отчет протестирован на предприятиях ДЗО Холдинга численностью более 1.5 тыс чел в 1 базе.
Баз много, все типовые, но сильно дописанные (в т.ч. исправлены косяки разработчиков 1С).
Проблем не было.
Последняя версия отчета переработана и рассчитана на управляемые формы,
но пока выкладывать его не буду.
Судя по скрину вы работаете в рждшной отрасли как и я. Или нет? Так или иначе настоящий профессионал никогда огульно не будет брать готовые отчеты, разработанные на других тестовых данных, и внедрять в своих предприятиях. Это удел, как бы помягче сказать, авантюристов в области 1С.
Если вы хотите внедрить отчет подобного уровня в своей базе, то сделать это бесплатно методом скачки с ИСа вряд ли получится. Ибо такие отчеты — это сложный продукт, требующий обязательной адаптации, обучения пользователей, тонкой настройки под учет конкретного предприятия. Повторюсь, этот отчет, как и любой другой в свободном доступе, — для настоящего профи помогает определиться с вектором, но ни коем образом не является панацеей и избавлением от проблем и в готовом виде. Ибо нет и не может быть трафаретных решений для реальных предприятий.
Если вы хотите решение, рассчитанного под ваше предприятие и нужды, то имеет смысл продолжить общение в личке.
(45) MagIvan, Отчет ваш был взят как пример для разработки другого отчета, который будет использовать теже данные и похожий подход. Естественно я полностью согласен, что брать вещи с ИС и сразу ставить в работу — это авантюризм 🙂
Но даже на ваших скринах, по моему мнению присутствуют ошибки в подходе решения задачи (хотя может у вас и задачи другие), в частности периодов. Кадровые службы не интересуют что было ДО и ПОСЛЕ указанного периода в параметрах отчета, это лишняя информация.
Еще раз спасибо за то что поделились своей работой, это существенная экономия времени для решения моей задачи.
(44) в ближайшие дни попробую ещё раз разобраться, (я себя не идеализирую в плане знаний), в вашем отчете на СКД а не обработке. думаю не нужно к словам придираться, а смотреть что реально может разработка. Т.к. как она скачана и запущена as is без доп.настроек — это просто тихий ужас.Даёт минимум информации при максимальных сложностях.И не надо на студентах кивать, мы не в вузе, там идите и учите, а здесь делятся знаниями, обсуждают что то.с таким «педагогическим» подходом лучше не учить ничему студентов.
вобщем и целом ваш отчет на СКД мне как пользователю не понравился, за это жирный минус.
кстати, в РЖДшной структуре так важен знак зодиака? по нему берут на работу ?
(47)
Дмитрий, добрый вечер!
Гороскоп не причем, совершенно.
Чем руководствуется отдел кадров РЖД при приеме на работу не представляю,
но догадываюсь, что в основном профессиональными качествами 🙂
Это ж учебный пример, в котором я как бы намекаю, что можно данные по-всякому компоновать.
Делать это играючи. Гороскоп ли это, или шкала по полу и возрастам ни имеет никакого значения.
Очень хорошо подобные вещи в книге по СКД описаны.
…
Давайте разбираться дальше.
…
С самого начала я принял вас за разработчика, критикующего решение.
Ну раз вы выступаете в роли пользователя — это меняет дело.
Пользователя надо холить и лилеять 🙂
Какой шаблон отчета нужно добавить, чтобы он отвечал вашим требованиям?
Можете нарисовать макет и разместить тут?
спасибо за отчет
спасибо за статью.
Добрый Вечер, скачал ваш отчет, и немного не понял.
У меня только 1 вариант отчета, а не все 6ть как у вас на картинке.
Можно мне все 6ть?
(51) Alek81, ага, в тексте 6 вариантов отчета, а в публикации только 1. Автор, непорядок!
(52) the1, сделайте себе столько вариантов, сколько хотите 🙂 Это же просто!
(53) конечно просто)) Но разговор ведь не о том…
Напишите пожалуйста на бюджетке будет работать?
(56)У меня дней в периоде отрицательное число (ЗУП 2.5 базовая), это как так получилось?
Ничосебе автор расписал подробную инструкцию..
Не каждый бы так заморочился.
Немного смущает слово»внедрение» применительно к одному единственному отчету на двух регистрах, но наверное так сейчас принято (давно тут не был).
Раньше когда я начинал внедрением называли установку 1с на несколько десятков пользователей с доработкой под нужды заказчика.
Немного позже внедрением стали называть и установку программы из коробки на 1 рабочее место.
И вот сейчас внедрение — это написание отчета.
Да еще и с рецензиями на этот отчет.
Если сейчас так то я мегавнедренец.
Я таких отчетов по 3 штуки в неделю делаю и во внешние отчеты и обработки складываю.
Огромное спасибо автору! Впервые вижу так подробно разложенный код доработки-очень помогло в написании собственной!
(58)
Про «внедрение» отчета.
Такие отчеты создавал аки конвейер много лет. А потом решил провести инвентаризацию созданных отчетов опросив заказчиков (руководители подразделений).
И вот какие пироги получились: 1/3 всех отчетов благополучно забыта по разным причинам (был нужен один раз срочно для отправки наверх или был нужен женщине с особым пониманием процессов, затем она ушла в декрет, и т.д.), еще 1/3 отчетов пользователи опасаются пользоваться т.к. не верят цифрам или бояться спросить почему цифры именно такие. В сухом остатке ГРУБО 1/3 отчетов прижилось.
Для себя решил, что разрабатывать ЛЮБОЙ отчет/обработку/печ формы и тем более отдельный БЛОК буду СТРОГО с соблюдением нескольких примитивных правил (в идеале приблизиться к пром стандартам, но часто они излишни):
1) утвержденное и согласованное с причастными подразделениями ТЗ — на этом этапе отваливается 1/3 идиотских или поверхностно проработанных обращений;
2) личное общение (в любой форме) с исполнителями заказчика с многократным повторением вопроса ЗАЧЕМ ? — часто выясняется, что можно сделать по-другому и более эффективно;
3) ОБЯЗАТЕЛЬНО жестко описывать и документировать НЕ ТОЛЬКО саму логику формирования данных отчета, НО ВСЕХ, еще раз ВСЕХ настроек отчета. ДА! Для каждой настройки отчета я пишу: кто заказчик, где ее используют, из какиких документов тянуться данные и какие подразделения ответственные за эти данные.
Т.е. на выходе я получаю КАЧЕСТВЕННОЕ описание отчета и его настроек.
Результат.
Количество задач на разработку отчетов снизилось. Однако, те задачи, которые остались стали иметь ПРИНЦИПИАЛЬНО другой уровень погружения в процессы заказчиков. Отчеты превратились, образно говоря из ржавых столовых ножей, в элегантные самурайские мечи, которыми бойцы каждый день могут с удовольствием пользоваться.
надо посмотреть