26 июня 2015 г.

1С Вычесть рабочие дни на основе ПК (НеВЗапросе)



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

  Период=ЗапросКалендаря.Выполнить().Выбрать();
  ДваМесяцаРабочихДней=Новый Массив;
  Пока Период.Следующий() Цикл
   ДваМесяцаРабочихДней.Добавить(Период.ДатаКалендаря);
  КонецЦикла; 
КонецПроцедуры

//Использование
Процедура ПолучитьТриДняНазад()
 ОткатитьНазадНа=3;//3 дня
 Сообщить(НачалоДня(ДваМесяцаРабочихДней[ДваМесяцаРабочихДней.Количество()-ОткатитьНазадНа-1]))
КонецПроцедуры


//Вариант самой 1С (нашел в форме отбора просроченных заказов)
Процедура ДниПросрочки()
 ОткатитьНазадНа=3;//3 дня
 //Пытаемся учитывать только рабочие дни по календарю
 ПолучитьДаты = Новый Запрос;
  ПолучитьДаты.Текст = 
  "ВЫБРАТЬ РАЗРЕШЕННЫЕ
  | РегламентированныйПроизводственныйКалендарь.Год
  |ИЗ
  | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
  |ГДЕ
  | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачГода И &КонГода";
  
 ПолучитьДаты.УстановитьПараметр("НачГода",НачалоГода(ТекущаяДата()));
 ПолучитьДаты.УстановитьПараметр("КонГода",КонецГода(ТекущаяДата()));
 
 ПолучилиДаты = ПолучитьДаты.Выполнить();
 Если ПолучилиДаты.Пустой() Тогда
   ТребуемаяДатаОплаты=НачалоДня(ТекущаяДата()-24*60*60*ОткатитьНазадНа);
   //ТребуемаяДатаОтгрузки=НачалоДня(ТекущаяДата()-24*60*60*ОткатитьНазадНа);
  Иначе
   ТребуемаяДатаОплаты=ЗаполнениеДокументов.ОпределитьДату(НачалоДня(ТекущаяДата()),-ОткатитьНазадНа);
   //ТребуемаяДатаОтгрузки=ЗаполнениеДокументов.ОпределитьДату(НачалоДня(ТекущаяДата()),-ОткатитьНазадНа);
 КонецЕсли;
 Сообщить(ТребуемаяДатаОплаты);
КонецПроцедуры


//КалендарныеДни - функция, разберетесь сами
Функция ПолучитьДень(ИсходнаяДата, КоличествоПрибавляемыхДней)
 
 Запрос = Новый Запрос("
 |ВЫБРАТЬ 
 |ДОБАВИТЬКДАТЕ(&ИсходнаяДата, ДЕНЬ, &Количество) как Дата");

 Запрос.УстановитьПараметр("ИсходнаяДата", ИсходнаяДата); 
 Запрос.УстановитьПараметр("Количество", КоличествоПрибавляемыхДней); 
 Возврат Запрос.Выполнить().Выгрузить()[0].Дата; 
КонецФункции 

Комментариев нет:

Отправить комментарий