• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Guest
  • Дата начала
G

Guest

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

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


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

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

СуммаДней = СуммаДней + СтрокаТабличнойЧасти.Дней;
ИтогоДней = СуммаДней - (Цел(СуммаДней /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
    378,9 КБ · Просмотры: 482
  • ____2.jpg
    381,4 КБ · Просмотры: 258
P

puh14

Итоги у тебя считаются абсолютно правильно. 201 месяц ( по формуле у тебя в месяце 30 дней) в строке это и есть 16 лет и девять месяцев.
А вот в строке непонятка - 116 месяцев это тебе рассчитало или руками забил?
 
G

Guest

Итоги у тебя считаются абсолютно правильно. 201 месяц ( по формуле у тебя в месяце 30 дней) в строке это и есть 16 лет и девять месяцев.
А вот в строке непонятка - 116 месяцев это тебе рассчитало или руками забил?
Всмысле 201 месяц? Что то я ничего не понимаю.
Это само всё так расчитало.
 
P

puh14

у тебя года от месяцев считаются
ИтогоЛет = Цел(СуммаМесяцев /12)

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

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

Если ты хочешь чтобы совсем всё корректно было, лучше считай по дням - а то у тебя в феврале 30 дней. Так как у тебя написано конечно проще считать - вполне работоспособно.
 
G

Guest

Усё правильно, усё сходится. Если в дни перевести эффект будет тот-же.
Спасибо puh14. Дак как мне можно сделать так чтобы он корректно показывал, то есть количество месяцев показывал к примеру не 116, а по правильному максимум до 12 (их в году 12), количество дней показывал максимум до 31. ???
 
V

vbs

ИтогоДней и ИтогоМесяцев у тебя считаются правильно (с поправкой на погрешность в 5-6 дней за год и 1-2 дня за месяц),
а в таблицу попадают какие-то другие данные
puh14 правильно предложил считать по дням
 
G

Guest

ИтогоДней и ИтогоМесяцев у тебя считаются правильно (с поправкой на погрешность в 5-6 дней за год и 1-2 дня за месяц),
а в таблицу попадают какие-то другие данные
puh14 правильно предложил считать по дням
Спачибо vbs. Мда что же мне делать тогда??? Как считать по дням понятия не имею (до чего я новичок). Может подскажите.
 
V

vbs

А календарь как устроен, представляешь ?
 
V

vbs

Добавь к числу дней по дню за високосные года, раздели на 365, потом переведи в месяцы остаток, останутся от 1 до 27 (если последний месяц февраль невисокосного года) или 28,29(30)
К 1С алгоритм если и имеет отношение, то весьма косвенное
 
P

puh14

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

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

Guest

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

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

Мда, красиво звучит. Осталось только это попробывать реализовать, а главное понять как это всё сделать????
 
P

puh14

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

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

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

СуммаДней = СуммаДней + СтрокаТабличнойЧасти.Дней;
ИтогоДней = СуммаДней - (Цел(СуммаДней /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 дней, високосных годов не бывает) - по идее код процедурки с расчетом по дням ты можешь вытащить
из типовой конфы, там наверняка такое встречается ;-)
 
P

puh14

Заинтересовался - а ларчик-то просто открывался, даже неполные рабочие месяцы в днях выводит (запросто может быть больше 31, и ведь блин верно - месяца то неполные!)

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

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

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

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


поправил.теперь вроде всё
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!