Имя: Пароль:
1C
 
УПП. Как получить рабочие дни из двух дат?
0 мистер игрек
 
18.06.09
08:38
Есть ли штатные средства УПП для получения рабочие дни из ДатаНач и ДатаКон ?
1 Ненавижу 1С
 
гуру
18.06.09
08:41
Да
2 Ненавижу 1С
 
гуру
18.06.09
08:42
Хотя твоей фразы я не совсем понял ))
3 мистер игрек
 
18.06.09
08:42
(1) Я имею ввиду готовые функции в общих модулях
4 quazare
 
18.06.09
08:42
Процедура РазобратьРазностьДат(ДатаОкончания, ДатаНачала, Лет, Месяцев, Дней) Экспорт
   
   Если Дата1 > Дата2 Тогда
       
       ВременнаяДата = Дата1;
       Если День(ВременнаяДата) < День(Дата2) Тогда
           Дней = (ВременнаяДата - ДобавитьМесяц(ВременнаяДата,-1))/86400;
           ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
       КонецЕсли;
       Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
           ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
           Месяцев = 12;
       КонецЕсли;
       Лет        = Макс(             Год(ВременнаяДата)        - Год(Дата2),    0);
       Месяцев    = Макс(Месяцев    + Месяц(ВременнаяДата)    - Месяц(Дата2),    0);
      Дней    = Макс(Дней        + День(ВременнаяДата)    - День(Дата2),    0);

Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) Тогда
           Дней = Дней + (День(КонецМесяца(Дата2)) - День(НачалоМесяца(Дата2))) - (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
       КонецЕсли;
       
   КонецЕсли;

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

вот с этим поиграйся
5 Ненавижу 1С
 
гуру
18.06.09
08:44
покури
ЗаполнениеДокументов.ЧислоРабочихДней(ДатаНач, ДатаКон)
6 kn
 
18.06.09
08:44
а какие по календарю или по графику работы?
7 мистер игрек
 
18.06.09
08:44
(4) Не тот, мне нужны именно рабочие дни производственного календаря
8 мистер игрек
 
18.06.09
08:46
(5) Скинешь? У меня нету такой функции :(
9 Ненавижу 1С
 
гуру
18.06.09
08:46
+(5) там как раз берет данные из РегистрСведений.РегламентированныйПроизводственныйКалендарь
10 Ненавижу 1С
 
гуру
18.06.09
08:47
(8) а ты где ищешь эту функцию?
11 мистер игрек
 
18.06.09
08:48
(10) Общий модуль "Заполнение документов"
12 Ненавижу 1С
 
гуру
18.06.09
08:48
(11) странно, ну лови:

// Функция возвращает число рабочих дней между заданными датами по регламентированному производственному календарю
//
//Параметры:
// ДатаНач      - начальная дата
// ДатаКон      - конечная дата
//
Функция ЧислоРабочихДней(ДатаНач, ДатаКон) Экспорт
   
   Запрос = Новый  Запрос;
   Запрос.УстановитьПараметр("ДатаНач",             ДатаНач);
   Запрос.УстановитьПараметр("ДатаКон",             ДатаКон);
   Запрос.УстановитьПараметр("РабочийДень",         Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий);
   Запрос.УстановитьПараметр("ПредпраздничныйДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
   
   Запрос.Текст = "
   |ВЫБРАТЬ
   |    ЕстьNull(СУММА(ВЫБОР
   |            КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень
   |                ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень
   |                ТОГДА 1
   |            ИНАЧЕ 0
   |        КОНЕЦ),0) КАК ЧислоРабочихДней
   |ИЗ
   |    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
   |ГДЕ
   |    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНач И &ДатаКон
   |    //РегламентированныйПроизводственныйКалендарь.Год = &Год";
   
   Выборка = Запрос.Выполнить().Выбрать();
   
   Если Выборка.Следующий() Тогда
       Возврат Выборка.ЧислоРабочихДней;
   КонецЕсли;
   
   Возврат 0;
   
КонецФункции

// Функция возвращает дату отстоящую на заданное количество рабочих дней от начальной в соответствии с
//регламентированным производственным календарем
//
//Параметры:
// ДатаНач      - начальная дата
// ЧислоДней    - количество рабочих дней, на которое искомая дата должна отстоять от начальной
//
Функция ОпределитьДату(ДатаНач, ЧислоДней) Экспорт
   
   Запрос = Новый  Запрос;
   Запрос.УстановитьПараметр("ДатаНач",             ДатаНач);
   Запрос.УстановитьПараметр("ЧислоДней",           ЧислоДней);
   Запрос.УстановитьПараметр("РабочийДень",         Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий);
   Запрос.УстановитьПараметр("ПредпраздничныйДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
   
   Если ЧислоДней > 0 Тогда
       Запрос.Текст = "
       |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + ЧислоДней + "
       |    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
       |ИЗ
       |    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
       |ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря > &ДатаНач
       |     И (РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень
       |      ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень)
       |";
       
   Иначе
       ЧислоДней = -ЧислоДней;
       
       Запрос.Текст = "
       |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + ЧислоДней + "
       |    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
       |ИЗ
       |    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
       |ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря < &ДатаНач
       |     И (РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень
       |      ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень)
       |УПОРЯДОЧИТЬ ПО
       |    ДатаКалендаря УБЫВ
       |";
       
   КонецЕсли;
   
   Выборка = Запрос.Выполнить().Выбрать();
   
   Если Выборка.Количество() = ЧислоДней Тогда
       Пока Выборка.Следующий() Цикл
           ТекДата = Выборка.ДатаКалендаря;
       КонецЦикла;
       Возврат ТекДата;
   КонецЕсли;
   
   Возврат Неопределено;
   
КонецФункции
13 мистер игрек
 
18.06.09
08:52
(12) спасибо
14 Stagor
 
18.06.09
09:44
круто!