ОБСУЖДЕНИЕ

ПОМОГИТЕ РАСЧИТАТЬ СТАЖ РАБОТЫ!

13 ответов 8,1 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Уважаемые. ПОМОГИТЕ ПОЖАЛУЙСТА. Стаж работы высчитывается совершенно не верно. Какая то ошибка внутри процедуры, не могу понять. Пожалуйста помогите, посоветуйте что-нибудь, очень жду. Вот весь модуль:

Перем ИтогоЛет;
Перем ИтогоМесяцев, СуммаМесяцев;
Перем ИтогоДней, СуммаДней;


Процедура ПериодыНачДатаПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Периоды.ТекущиеДанные;

ОбщегоНазначения.РазобратьРазностьДат(СтрокаТабличнойЧасти.КонДата, СтрокаТабличнойЧасти.НачДата, СтрокаТабличнойЧасти.Лет, СтрокаТабличнойЧасти.Месяцев, СтрокаТабличнойЧасти.Дней);

СуммаДней = СуммаДней + СтрокаТабличнойЧасти.Дней;
ИтогоДней = СуммаДней - (Цел(СуммаДней /30))*30;
СуммаМесяцев = Цел(СуммаДней /30)+ СтрокаТабличнойЧасти.Месяцев;
ИтогоМесяцев = СуммаМесяцев - (Цел(СуммаМесяцев /12))*12;
ИтогоЛет = Цел(СуммаМесяцев /12) + СтрокаТабличнойЧасти.Лет;//+Лет2+Лет3+Лет4+Лет5+Лет6+Лет7+Лет8+Лет9+Лет10+Лет11+Лет12+Лет13+Лет14+Лет15;
ЭлементыФормы.ИтоговаяСтрока.Заголовок = " Итого: "+ ИтогоЛет + " лет, " + ИтогоМесяцев + " месяцев, "+ ИтогоДней + " дней." ;

КонецПроцедуры

Процедура ПериодыКонДатаПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Периоды.ТекущиеДанные;

ОбщегоНазначения.РазобратьРазностьДат(СтрокаТабличнойЧасти.КонДата, СтрокаТабличнойЧасти.НачДата, СтрокаТабличнойЧасти.Лет, СтрокаТабличнойЧасти.Месяцев, СтрокаТабличнойЧасти.Дней);

СуммаДней = СуммаДней + СтрокаТабличнойЧасти.Дней;
ИтогоДней = СуммаДней - (Цел(СуммаДней /30))*30;
СуммаМесяцев = Цел(СуммаДней /30)+ СтрокаТабличнойЧасти.Месяцев;
ИтогоМесяцев = СуммаМесяцев - (Цел(СуммаМесяцев /12))*12;
ИтогоЛет = Цел(СуммаМесяцев /12) + СтрокаТабличнойЧасти.Лет;//+Лет2+Лет3+Лет4+Лет5+Лет6+Лет7+Лет8+Лет9+Лет10+Лет11+Лет12+Лет13+Лет14+Лет15;
ЭлементыФормы.ИтоговаяСтрока.Заголовок = " Итого: "+ ИтогоЛет + " лет, " + ИтогоМесяцев + " месяцев, "+ ИтогоДней + " дней." ;

КонецПроцедуры

ИтогоДней = 0;
ИтогоМесяцев = 0;
ИтогоЛет = 0;
СуммаДней = 0;
СуммаМесяцев = 0;
 

Вложения

  • ____.jpg
    ____.jpg
    378,9 КБ · Просмотры: 589
  • ____2.jpg
    ____2.jpg
    381,4 КБ · Просмотры: 354
Итоги у тебя считаются абсолютно правильно. 201 месяц ( по формуле у тебя в месяце 30 дней) в строке это и есть 16 лет и девять месяцев.
А вот в строке непонятка - 116 месяцев это тебе рассчитало или руками забил?
 
Итоги у тебя считаются абсолютно правильно. 201 месяц ( по формуле у тебя в месяце 30 дней) в строке это и есть 16 лет и девять месяцев.
А вот в строке непонятка - 116 месяцев это тебе рассчитало или руками забил?
Всмысле 201 месяц? Что то я ничего не понимаю.
Это само всё так расчитало.
 
у тебя года от месяцев считаются
ИтогоЛет = Цел(СуммаМесяцев /12)

как проверить правильность:
переводим года и дни в месяцы
строка таб части
7 лет - это 7*12 = 84 месяца, плюс 116 месяцев + 1 месяц (это 30 дней) всего 201 месяц
Итог
16 лет - 16*12 = 192 месяца + 9 месяцев = 201 месяц

Усё правильно, усё сходится. Если в дни перевести эффект будет тот-же.

Если ты хочешь чтобы совсем всё корректно было, лучше считай по дням - а то у тебя в феврале 30 дней. Так как у тебя написано конечно проще считать - вполне работоспособно.
 
Усё правильно, усё сходится. Если в дни перевести эффект будет тот-же.
Спасибо puh14. Дак как мне можно сделать так чтобы он корректно показывал, то есть количество месяцев показывал к примеру не 116, а по правильному максимум до 12 (их в году 12), количество дней показывал максимум до 31. ???
 
ИтогоДней и ИтогоМесяцев у тебя считаются правильно (с поправкой на погрешность в 5-6 дней за год и 1-2 дня за месяц),
а в таблицу попадают какие-то другие данные
puh14 правильно предложил считать по дням
 
ИтогоДней и ИтогоМесяцев у тебя считаются правильно (с поправкой на погрешность в 5-6 дней за год и 1-2 дня за месяц),
а в таблицу попадают какие-то другие данные
puh14 правильно предложил считать по дням
Спачибо vbs. Мда что же мне делать тогда??? Как считать по дням понятия не имею (до чего я новичок). Может подскажите.
 
А календарь как устроен, представляешь ?
 
Добавь к числу дней по дню за високосные года, раздели на 365, потом переведи в месяцы остаток, останутся от 1 до 27 (если последний месяц февраль невисокосного года) или 28,29(30)
К 1С алгоритм если и имеет отношение, то весьма косвенное
 
Как вариант можешь задать в полях ввода процедурку,проверяющюю по окончании ввода что кол-во месяцев не больше 12, дней - не больше 31, на годы ничего не надо. Неужто в трудовой так и написано - 116 месяцев?

или требуй при вводе строки задавать две даты - одна начала, друга - конца. По аналогии с итого делаешь процедурку, которая сама тебе заполняет сколько лет, месяцев, дней. А сами поля ввода сделай недоступными для ручного ввода.
 
Как вариант можешь задать в полях ввода процедурку,проверяющюю по окончании ввода что кол-во месяцев не больше 12, дней - не больше 31, на годы ничего не надо. Неужто в трудовой так и написано - 116 месяцев?

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

Мда, красиво звучит. Осталось только это попробывать реализовать, а главное понять как это всё сделать????
 
Блин - у тебя походу при вводе строки задавать две даты и так написано - только ты руками в месяцы не лазий - и всё хорошо будет.
Если такой эффект прет именно от ввода даты начала и даты конца, тогда подшамань примерно так ( в общюю процедуру лазить не будем);

Процедура ПериодыНачДатаПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Периоды.ТекущиеДанные;

ОбщегоНазначения.РазобратьРазностьДат(СтрокаТабличнойЧасти.КонДата, СтрокаТабличнойЧасти.НачДата, СтрокаТабличнойЧасти.Лет, СтрокаТабличнойЧасти.Месяцев, СтрокаТабличнойЧасти.Дней);

СуммаДней = СуммаДней + СтрокаТабличнойЧасти.Дней;
ИтогоДней = СуммаДней - (Цел(СуммаДней /30))*30;
СуммаМесяцев = Цел(СуммаДней /30)+ СтрокаТабличнойЧасти.Месяцев;
ИтогоМесяцев = СуммаМесяцев - (Цел(СуммаМесяцев /12))*12;
ИтогоЛет = Цел(СуммаМесяцев /12) + СтрокаТабличнойЧасти.Лет;//+Лет2+Лет3+Лет4+Лет5+Лет6+Лет7+Лет8+Лет9+Лет10+Лет11+Лет12+Лет13+Лет14+Лет15;
ЭлементыФормы.ИтоговаяСтрока.Заголовок = " Итого: "+ ИтогоЛет + " лет, " + ИтогоМесяцев + " месяцев, "+ ИтогоДней + " дней.";,

ДнейДляПересчета = Цел((((СтрокаТабличнойЧасти.КонДата - СтрокаТабличнойЧасти.НачДата)/60)/60)/24);// переводим всё в дни
СтрокаТабличнойЧасти.Лет = Цел(ДнейДЛяПересчета/365);//вычисляем сколько годиков целых
ДнейДляПересчета= ДнейДляПересчета - (СтрокаТабличнойЧасти.Лет*365); //Вычисляем сколько дней перевести в месяцы
СтрокаТабличнойЧасти.Месяцев= Цел(ДнейДляПересчета/30);
СтрокаТабличнойЧасти.Дней = ДнейДляПересчета - (СтрокаТабличнойЧасти.Месяцев*30);


КонецПроцедуры

Процедура ПериодыКонДатаПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Периоды.ТекущиеДанные;

ОбщегоНазначения.РазобратьРазностьДат(СтрокаТабличнойЧасти.КонДата, СтрокаТабличнойЧасти.НачДата, СтрокаТабличнойЧасти.Лет, СтрокаТабличнойЧасти.Месяцев, СтрокаТабличнойЧасти.Дней);

СуммаДней = СуммаДней + СтрокаТабличнойЧасти.Дней;
ИтогоДней = СуммаДней - (Цел(СуммаДней /30))*30;
СуммаМесяцев = Цел(СуммаДней /30)+ СтрокаТабличнойЧасти.Месяцев;
ИтогоМесяцев = СуммаМесяцев - (Цел(СуммаМесяцев /12))*12;
ИтогоЛет = Цел(СуммаМесяцев /12) + СтрокаТабличнойЧасти.Лет;//+Лет2+Лет3+Лет4+Лет5+Лет6+Лет7+Лет8+Лет9+Лет10+Лет11+Лет12+Лет13+Лет14+Лет15;
ЭлементыФормы.ИтоговаяСтрока.Заголовок = " Итого: "+ ИтогоЛет + " лет, " + ИтогоМесяцев + " месяцев, "+ ИтогоДней + " дней.";

ДнейДляПересчета = Цел((((СтрокаТабличнойЧасти.КонДата - СтрокаТабличнойЧасти.НачДата)/60)/60)/24);// переводим всё в дни
СтрокаТабличнойЧасти.Лет = Цел(ДнейДЛяПересчета/365);//вычисляем сколько годиков целых
ДнейДляПересчета= ДнейДляПересчета - (СтрокаТабличнойЧасти.Лет*365); //Вычисляем сколько дней перевести в месяцы
СтрокаТабличнойЧасти.Месяцев= Цел(ДнейДляПересчета/30);
СтрокаТабличнойЧасти.Дней = ДнейДляПересчета - (СтрокаТабличнойЧасти.Месяцев*30);

КонецПроцедуры

ИтогоДней = 0;
ИтогоМесяцев = 0;
ИтогоЛет = 0;
СуммаДней = 0;
СуммаМесяцев = 0;

По идее именно это у тебя должна делать процедура
ОбщегоНазначения.РазобратьРазностьДат(СтрокаТабличнойЧасти.КонДата, СтрокаТабличнойЧасти.НачДата, СтрокаТабличнойЧасти.Лет, СтрокаТабличнойЧасти.Месяцев, СтрокаТабличнойЧасти.Дней);
Покажь её код - даже интересно, кто там так нашаманил.

Я написал по аналогии с твоим расчетом ( в месяце 30 дней, високосных годов не бывает) - по идее код процедурки с расчетом по дням ты можешь вытащить
из типовой конфы, там наверняка такое встречается ;-)
 
Заинтересовался - а ларчик-то просто открывался, даже неполные рабочие месяцы в днях выводит (запросто может быть больше 31, и ведь блин верно - месяца то неполные!)

Код:
Процедура РазностьДат(ДатаНачала,ДатаКонца,Лет,Месяцев,Дней)

Лет = Год(ДатаКонца) - Год(ДатаНачала);
Если Лет = 0 Тогда
Месяцев =Месяц(ДатаКонца) -Месяц(ДатаНачала);
Если Месяцев = 0 тогда
Дней = День(датаКонца)- День(ДатаНачала);
Иначе
Дней = (День(КонецМесяца(датаНачала)) - День(ДатаНачала)) +(День(датаКонца) - День(НачалоМесяца(датаКонца)));
КонецЕсли;
Иначе
Месяцев =Месяц(ДатаКонца) + (12 - Месяц(ДатаНачала));
Если Месяцев >=12 Тогда
Месяцев = Месяцев -12;
Иначе
Лет = Лет -1;
КонецЕсли;
Дней = (День(КонецМесяца(датаНачала)) - День(ДатаНачала)) +(День(датаКонца) - День(НачалоМесяца(датаКонца)));

КонецЕсли;
КонецПроцедуры

не - не так просто... надо еще доделать


поправил.теперь вроде всё