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

28.04.15

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

См. также

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8802    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 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    16139    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

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

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

18.07.2022    7241    quazare    8    

109

Хитрости СКД. Часть 3

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

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

28.05.2022    9293    milkers    11    

94

Модули общего назначения - готовые полезные функции и процедуры конфигураций на БСП

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

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

25.04.2022    14973    quazare    11    

138

Несколько простых приемов для удобной работы в конфигураторе

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

Простая и удобная среда разработки 1С:Предприятия позволяет практически любому человеку начать работать под капотом 1С - в конфигураторе. Время идет, новички становятся программистами, специалистами, а об удобных приемах работы узнают годами, по ходу своего карьерного пути. А здорово было бы, если бы все знали удобные приемы в начале своего пути? Эти несколько приемов будут полезны новичкам, так как они затрагивают ту область работы, с которой приходится сталкиваться в начале карьеры.

12.11.2021    17462    acces969    95    

148
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. karpik666 3760 28.04.15 04:37 Сейчас в теме
А вы в курсе, что есть разные виды стажа? И то, что если сотрудник берет административку, то она не учитывается в стаже? В общем, простой разностью дат это не решается, откройте зуп и посмотрите там, как вычисляется стаж. Понятно, что изобрели велосипед, так велосипед, ведь должен работать с точки зрения законодательства.
2. trest30 41 28.04.15 06:09 Сейчас в теме
(1) karpik666, Это все понятно, просто здесь описан сам алгоритм нахождения разности дат, и эта функция может применяться в зависимости от Ваших потребностей и условий расчета..
milov.aleksey; +1 Ответить
3. karpik666 3760 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,
как складывать несколько периодов стажа. как округлять дни в месяцы.
Ну иожно как вариант из конечную дату расчета сдвинуть назад на количество дней разрыва стажа...
Оставьте свое сообщение