Имя: Пароль:
1C
1С v8
БСП (или ERP) как посчитать количество часов за период с учетом времени?
0 pvase
 
28.01.20
13:08
Здравствуйте. Надо посчитать количество рабочих часов и минут (ну или секунд, а потом разделить на 60 и 3600) по пятидневке 8-часовому рабочему дню, например между такими периодами 24.01.2020 16:45:38 и 28.01.2020 10:28:35 в типовой конфигуапрции ERP, а лучше в БСП. Подскажите как такое реализовать или может где подсмотреть как уже реализовано. Спасибо.
1 Волшебник
 
модератор
28.01.20
13:10
Посчитай первый день, потом полные дни и последний день периода.
2 pvase
 
28.01.20
13:22
(1) Спасибо. Я пытаюсь понять какие объекты использовать. Есть такой объект как "Календарь" в БСП, но что-то не могу понять как его использовать, но в ERP есть еще "ГрафикиРаботыСотрудников" он вроде больше подойлет, но опять же не пойму как по нему посчитать количество рабочиъ часов за период.
3 polosov
 
28.01.20
13:37
Функция ОпределитьДату(ДатаНач, ЧислоДней, ПроизводственныйКалендарь)
    
    Запрос = Новый  Запрос;
    Запрос.УстановитьПараметр("ДатаНач",             ДатаНач);
    Запрос.УстановитьПараметр("ЧислоДней",           ЧислоДней);
    Запрос.УстановитьПараметр("РабочийДень",         Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий);
    Запрос.УстановитьПараметр("ПредпраздничныйДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
    Запрос.УстановитьПараметр("ПроизводственныйКалендарь", ПроизводственныйКалендарь);
    
    Если ЧислоДней > 0 Тогда
        Запрос.Текст = "
        |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + ЧислоДней + "
        |    РегламентированныйПроизводственныйКалендарь.Дата
        |ИЗ
        |    РегистрСведений.ДанныеПроизводственногоКалендаря КАК РегламентированныйПроизводственныйКалендарь
        |ГДЕ РегламентированныйПроизводственныйКалендарь.ПроизводственныйКалендарь = &ПроизводственныйКалендарь
        |    И    РегламентированныйПроизводственныйКалендарь.Дата > &ДатаНач
        |     И (РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень
        |      ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень)
        |";
        
    Иначе
        ЧислоДней = -ЧислоДней;
        
        Запрос.Текст = "
        |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + ЧислоДней + "
        |    РегламентированныйПроизводственныйКалендарь.Дата
        |ИЗ
        |    РегистрСведений.ДанныеПроизводственногоКалендаря КАК РегламентированныйПроизводственныйКалендарь
        |ГДЕ РегламентированныйПроизводственныйКалендарь.ПроизводственныйКалендарь = &ПроизводственныйКалендарь
        |    И РегламентированныйПроизводственныйКалендарь.Дата < &ДатаНач
        |     И (РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень
        |      ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень)
        |УПОРЯДОЧИТЬ ПО
        |    Дата УБЫВ
        |";
        
    КонецЕсли;
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Количество() = ЧислоДней Тогда
        Пока Выборка.Следующий() Цикл
            ТекДата = Выборка.Дата;
        КонецЦикла;
        Возврат ТекДата;
    КонецЕсли;
    
    Возврат Неопределено;
    
КонецФункции
4 polosov
 
28.01.20
13:38
Переделай по себя