Вновь о том, как рассчитать стаж

28.04.15

Разработка - Математика и алгоритмы

Простой прием (алгоритм) расчета стажа

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

Функция РазностьДат(ДатаНач, ДатаКон) Экспорт

В начале узнаем, сколько полных лет в стаже

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

Далее отсекаем количество отработанных лет (запоминая их), чтобы остались месяцы и дни

ДатаД = ДобавитьМесяц(ДатаНач,Годы * 12); 
Иначе
Годы = 0; 
ДатаД = ДатаНач;
КонецЕсли;

Определяем количество отработанных месяцев

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

Проверим, когда конечная дата и дата приема в одном месяце (включается или нет последний месяц)

Если ДобавитьМесяц(ДатаД,ВыборкаД.Месяцы) > ДатаКон Тогда
Месяцы = ВыборкаД.Месяцы - 1;
Иначе
Месяцы = ВыборкаД.Месяцы;
КонецЕсли;

Ну и количество дней найдем

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

Ну вот и все...Функция возвращает массив, где первый элемент годы, второй месяцы и третий дни

Затем можно вызвать данную функцию для вывода стажа, например, так

МассивДат = РазностьДат(ДатаПриема,ТекущаяДата());
Если Прав(МассивДат[0], 1) = "1" 
ИЛИ Прав(МассивДат[0], 1) = "2" 
ИЛИ Прав(МассивДат[0], 1) = "3"
ИЛИ Прав(МассивДат[0], 1) = "4"
Тогда п = " г. ";
Иначе п = " л. ";
КонецЕсли;
Стаж = Строка(МассивДат[0]) + п + Строка(МассивДат[1]) + " м. " + Строка(МассивДат[2]) + " д";

 

стаж разность дат

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    20125    dimanich70    81    

144

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14730    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3580    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18478    171    sapervodichka    112    

135

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    8371    quazare    8    

111

СКД Универсальные функции Программист Стажер Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Столкнулся с тем, что мне приходится писать гору отчетов. Во многих приходится использовать повторяющиеся приемы. Решил написать шпаргалку, которая, надеюсь пригодится не только мне. В этой статье: Объединение ячеек в отчете только на определенном уровне иерархии, Постобработка итогов в табличном документе, Скрытие колонок в зависимости от количества месяцев в периоде.

28.05.2022    10435    milkers    11    

98

Универсальные функции БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

25.04.2022    19169    quazare    11    

139
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. karpik666 3851 28.04.15 04:37 Сейчас в теме
А вы в курсе, что есть разные виды стажа? И то, что если сотрудник берет административку, то она не учитывается в стаже? В общем, простой разностью дат это не решается, откройте зуп и посмотрите там, как вычисляется стаж. Понятно, что изобрели велосипед, так велосипед, ведь должен работать с точки зрения законодательства.
2. trest30 41 28.04.15 06:09 Сейчас в теме
(1) karpik666, Это все понятно, просто здесь описан сам алгоритм нахождения разности дат, и эта функция может применяться в зависимости от Ваших потребностей и условий расчета..
milov.aleksey; +1 Ответить
3. karpik666 3851 28.04.15 06:59 Сейчас в теме
тогда -
Код вообще не оптимизирован - 2 запроса, чтобы получить разность дат. И можно было сразу получить все данные через запрос.
Вот мой пример получения стажа, без использования запросов. И то я абсолютно точно уверен, что есть более удобные и элегантные решения.
Функция СтажРаботы(ДатаНач, ДатаКон)
	Если ДатаКон < ДатаНач Тогда
		Возврат "Дата начала больше даты окончания. Стаж не рассчитан";		
	КонецЕсли; 
	Если ДатаКон = ДатаНач Тогда
		Возврат "Даты равны.";	
	КонецЕсли; 
	СтруктураДатаНач = Новый Структура;
	СтруктураДатаНач.Вставить("Год", Год(ДатаНач));
	СтруктураДатаНач.Вставить("Месяц", Месяц(ДатаНач));
	СтруктураДатаНач.Вставить("День", День(ДатаНач));
	СтруктураДатаКон = Новый Структура; 
	СтруктураДатаКон.Вставить("Год", Год(ДатаКон));
	СтруктураДатаКон.Вставить("Месяц", Месяц(ДатаКон));
	СтруктураДатаКон.Вставить("День", День(ДатаКон));
	Если СтруктураДатаКон.День < СтруктураДатаНач.День Тогда
		СтруктураДатаКон.Месяц = СтруктураДатаКон.Месяц - 1;	
		СтруктураДатаКон.День = СтруктураДатаКон.День + День(КонецМесяца(ДобавитьМесяц(ДатаКон,-1))); 
	КонецЕсли; 
	
	СтажДней = СтруктураДатаКон.День - СтруктураДатаНач.День;
	
	//Если это января, тогда может быть, что разность затрагивает целый год
        Если СтруктураДатаКон.Месяц < СтруктураДатаНач.Месяц Тогда
		СтруктураДатаКон.Месяц = СтруктураДатаКон.Месяц + 12;
		СтруктураДатаКон.Год = СтруктураДатаКон.Год - 1;
	КонецЕсли;
	
	СтажМесяцев = СтруктураДатаКон.Месяц - СтруктураДатаНач.Месяц;
	СтажЛет =  СтруктураДатаКон.Год - СтруктураДатаНач.Год;
	
	Возврат ?(СтажЛет = 0, "", ЧислоПрописью(СтажЛет,,"год, года, лет, м, , , , м,0") + ", ") + 
			?(СтажМесяцев = 0, "", ЧислоПрописью(СтажМесяцев,,"месяц, месяца, месяцев, м, , , , м,0") + ", ") +
			 ЧислоПрописью(СтажДней,,"день, дня, дней, м, , , , м,0");	
КонецФункции
Показать
BigB; trest30; +2 Ответить
4. rasswet 82 29.04.15 10:55 Сейчас в теме
для полноты картины. Если воспользоватся типовыми механизмами расчета стажа в ЗУП 2.5 и ЗУП 3,0 при опредленных входящих данных мы получим разные результаты.
Также еще есть вопрос как складывать несколько периодов стажа. как округлять дни в месяцы.
Было несколько заказчиков - у каждого свой подход был к этому.
5. trest30 41 29.04.15 11:18 Сейчас в теме
(4) rasswet,
как складывать несколько периодов стажа. как округлять дни в месяцы.
Ну иожно как вариант из конечную дату расчета сдвинуть назад на количество дней разрыва стажа...
Оставьте свое сообщение