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