Алгоритм расчета периодов

10.03.10

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

Вычисление периодов в формате ГГММДД. Вычисление дат по формуле Дата + ГГММДД.
Примечание: Даты передаем в виде 'ДД.ММ.ГГГГ', периоды - "ГГ-ММ-ДД".
Пользуйтесь.

 

//********************************************************
//Назначение: преобразует строку в число путем преобразования каждого символа
//по правилам преобразования типов
// <стр> - строка;
//
//Примечание:
//
Функция зпГлСтрокуВЧисло(стр) Экспорт
    стр1 = СокрЛП(стр);
    Чис1 = "";
    Для х = 1 По СтрДлина(стр1) Цикл
        Чис1 = Чис1 + Число(Сред(стр1,х,1));
    КонецЦикла;
    Чис = Число(Чис1);
    Возврат Чис;
КонецФункции // зпГлСтрокуВЧисло(стр)
//********************************************************
// Функция зпГлВычислитьСрок(Аргум1,Аргум2="",Парам=777)
// <Аргум1> - Дата1 или Срок1
// <Аргум2> - Дата2 или Срок2
// <Срок> - Период в формате ГГ-ММ-ДД
// Параметры: '0' - ЗнВозврата = Дата2-Дата1 - вичислить период между датами в формате ГГ-ММ-ДД
//         '-1' - ЗнВозврата = Дата1-Срок - вычесть период
//         '1' - ЗнВозврата = Дата1+Срок - добавить период
//         Иначе ЗнВозврата = Правильный срок
//         'П' - ЗнВозврата = Правильный срок прописью
//         'К' - ЗнВозврата = Правильный срок прописью краткий формат
//         '+' - ЗнВозврата = Срок1+Срок2 - сложить периоды
////////         '-' - ЗнВозврата = Срок1-Срок2 - вычесть периоды
//
// Примечание: Ст.241-1 КЗоТ Украины
//
Функция зпГлВычислитьСрок(Аргум1,Аргум2="",Парам="") Экспорт
    Перем ЗнВозврата;

    Если (Парам=0) Тогда
        Дата1 = Мин(Дата(Аргум1),Дата(Аргум2));
        Дата2 = Макс(Дата(Аргум1),Дата(Аргум2));

        Мес = (ДатаГод(Дата2) - ДатаГод(Дата1))*12 + (ДатаМесяц(Дата2) - ДатаМесяц(Дата1));
        Дни = ДатаЧисло(Дата2) - ДатаЧисло(Дата1);

        Если (Дни < 0) Тогда
            Мес = Мес - 1;
            Дни = Дни + ДатаЧисло(КонМесяца(Дата1));
        КонецЕсли;
        Если (Дни >= ДатаЧисло(КонМесяца(Дата2))) и (Дата2 = КонМесяца(Дата2)) Тогда
            Мес = Мес + 1;
            Дни = 0;
        КонецЕсли;

        Лет = Цел(Мес/12);
        Мес = Мес - Лет*12;

        ЗнВозврата = Формат(Лет,"Ч(0)2.0")+"-"+Формат(Мес,"Ч(0)2.0")+"-"+Формат(Дни,"Ч(0)2.0");
    ИначеЕсли (Число(Парам)*Число(Парам)=1) Тогда
        Дата1 = Дата(Аргум1);
        Аргум2 = зпГлВычислитьСрок(Аргум2);
        Срок = Аргум2;

        Мес = Число(Лев(Срок,2))*12 + Число(Сред(Срок,4,2));
        Дни = Число(Прав(Срок,2));

        Дата2 = ДобавитьМесяц(Дата1,Парам*Мес);

        Если (Дата1 = КонМесяца(Дата1)) Тогда
            Дни = Мин(ДатаЧисло(КонМесяца(Дата2)) - 1, Дни);
        ИначеЕсли (Дни >= ДатаЧисло(КонМесяца(Дата2))*((1-Парам)/2) - Парам*ДатаЧисло(Дата2)) Тогда
            Дни = Мин(ДатаЧисло(КонМесяца(ДобавитьМесяц(Дата2,1))) - 1, Дни);
        КонецЕсли;

        ЗнВозврата = Дата2 + Парам*Дни;
    Иначе
        Если (Найти(Парам, "+") > 0) Тогда
            Срок1 = зпГлСтрокуВЧисло(СтрЗаменить(Аргум1+".","-",""))/10;
            Срок2 = зпГлСтрокуВЧисло(СтрЗаменить(Аргум2+".","-",""))/10;

            Дни = Срок1%100 + Срок2%100;
            Мес = Цел((Срок1%10000 + Срок2%10000 - Дни)/1000);
            Лет = Цел(Срок1/10000) + Цел(Срок2/10000);

            Мес = Мес + Цел(Дни/30);
            Дни = Дни%30;
            Лет = Лет + Цел(Мес/12);
            Мес = Мес%12;
        Иначе
            Срок = зпГлСтрокуВЧисло(СтрЗаменить(Аргум1+".","-",""))/10;
            Мес = Цел(Срок/100) - Цел(Срок/10000)*(100-12);
            Дни = Мин(Срок - Цел(Срок/100)*100, 30);
            Лет = Цел(Мес/12);
            Мес = Мес - Лет*12;
        КонецЕсли;

        Если (Найти(Парам, "П") > 0) Тогда
            ЗнВозврата = "років "+Лет+", місяців "+Мес+", днів "+Дни;
        ИначеЕсли (Найти(Парам, "К") > 0) Тогда
            ЗнВозврата = ""+Лет+"р."+Мес+"м."+Дни+"д.";
        Иначе
            ЗнВозврата = Формат(Лет,"Ч(0)2.0")+"-"+Формат(Мес,"Ч(0)2.0")+"-"+Формат(Дни,"Ч(0)2.0");
        КонецЕсли;
    КонецЕсли;

    Возврат ЗнВозврата;
КонецФункции //


См. также

Универсальные функции Программист Платформа 1С v7.7 Россия Абонемент ($m)

В библиотеку собраны различные функции по работе с документами, журналами, типами данных, строками, датой и временем, таблицами значений, Excel, файлами, XML, JSON, Http-сервисами, SMTP серверами и т.п.

1 стартмани

22.12.2023    1371    14    user706545_kseg1971    0    

5

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Получение реквизитов контрагентов из 1С:Контрагент для старых конфигураций под 1с 7.7.

25.04.2022    2339    zhenyat    7    

8

Универсальные функции Программист Платформа 1С v7.7 Россия Бесплатно (free)

Функция выводит таблицу значений в табличный документ. (v7.7) Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.

30.06.2021    5138    Zoltan_Black    11    

2

Универсальные функции Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Установка принтера по умолчанию в 1С 7.7. Обработка может быть полезна в том случае, когда нужно установить принтер по умолчанию, а доступа к рабочему столу нет (например, терминальный режим без рабочего стола или remoteApp)

1 стартмани

13.02.2019    13933    4    alsen    3    

5

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 1С:Комплексная 7.7 Абонемент ($m)

Предлагается набор функций 1с 7.7 для формирования строки json стандартными средствами.

1 стартмани

10.12.2018    10766    malovandrey    7    

19

Универсальные функции Работа с интерфейсом Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

В статье дано описание создания индикатора на форме в среде разработки 1С:Предприятие 7.7 исключительно типовыми средствами.

1 стартмани

27.09.2016    18887    2    HAMMER_59    6    

2
Оставьте свое сообщение