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

Тема в разделе "1C и всё что с ней связано", создана пользователем -, 11 сен 2009.

  1. Гость

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

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


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

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

    СуммаДней = СуммаДней + СтрокаТабличнойЧасти.Дней;
    ИтогоДней = СуммаДней - (Цел(СуммаДней /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 КБ
      Просмотров:
      29
    • ____2.jpg
      Размер файла:
      381,4 КБ
      Просмотров:
      26
  2. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Итоги у тебя считаются абсолютно правильно. 201 месяц ( по формуле у тебя в месяце 30 дней) в строке это и есть 16 лет и девять месяцев.
    А вот в строке непонятка - 116 месяцев это тебе рассчитало или руками забил?
     
  3. Гость

    Всмысле 201 месяц? Что то я ничего не понимаю.
    Это само всё так расчитало.
     
  4. puh14

    puh14 Well-Known Member
    1C Team

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

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

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

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    ИтогоДней и ИтогоМесяцев у тебя считаются правильно (с поправкой на погрешность в 5-6 дней за год и 1-2 дня за месяц),
    а в таблицу попадают какие-то другие данные
    puh14 правильно предложил считать по дням
     
  7. Гость

    Спачибо vbs. Мда что же мне делать тогда??? Как считать по дням понятия не имею (до чего я новичок). Может подскажите.
     
  8. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    А календарь как устроен, представляешь ?
     
  9. Гость

    Да, представляю. А вот как это реализовать в 1С не представляю)))
     
  10. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Добавь к числу дней по дню за високосные года, раздели на 365, потом переведи в месяцы остаток, останутся от 1 до 27 (если последний месяц февраль невисокосного года) или 28,29(30)
    К 1С алгоритм если и имеет отношение, то весьма косвенное
     
  11. puh14

    puh14 Well-Known Member
    1C Team

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

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

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

    puh14 Well-Known Member
    1C Team

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

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

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Заинтересовался - а ларчик-то просто открывался, даже неполные рабочие месяцы в днях выводит (запросто может быть больше 31, и ведь блин верно - месяца то неполные!)

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

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

    КонецЕсли;
    КонецПроцедуры
    не - не так просто... надо еще доделать


    поправил.теперь вроде всё
     
Загрузка...
Похожие Темы - ПОМОГИТЕ РАСЧИТАТЬ СТАЖ
  1. limbra
    Ответов:
    3
    Просмотров:
    44
  2. NylevoiChelovek
    Ответов:
    4
    Просмотров:
    102
  3. Ruska132
    Ответов:
    37
    Просмотров:
    303
  4. gURaBA_N
    Ответов:
    7
    Просмотров:
    147
  5. uxbmw3w
    Ответов:
    0
    Просмотров:
    64

Поделиться этой страницей