Регламентные задания: коротко и ясно о детальных расписаниях
Как программно создать регламентное задание и добавить детальные расписания для него.
- Описание
- Подробнее
Описание
Столкнувшись с проблемой, аналогичной https://forum.infostart.ru/forum9/topic144288/, и не найдя решения на просторах инета, одни вопросы на эту тему, решил восполнить этот пробел.
Итак, для работы с расписаниями регламентного задания в 1С используется объект РасписаниеРегламентногоЗадания.
Для интерактивного редактирования расписания предусмотрен диалог ДиалогРасписанияРегламентногоЗадания, который позволяет задать какое угодно расписание:
Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); // создаем диалог
Если Диалог.ОткрытьМодально() Тогда // открываем, настраиваем
Расписание = Диалог.Расписание; //получаем расписание и дальше делаем с ним что угодно
КонецЕсли;
Но что делать если мы хотим задавать расписание полностью программно? У объекта РасписаниеРегламентногоЗадания есть свойство ДетальныеРасписанияДня типа Массив объектов типа (сюрприз!) РасписаниеРегламентногоЗадания. Казалось бы, добавляем в это свойство необходимые интервалы и дело в шляпе. Но вот тут как раз и кроется подвох. Обычно, когда пытаются программно заполнить детальные расписания делают что-то наподобие такого:
// пример как не надо:
Расписание = Новый РасписаниеРегламентногоЗадания; // создаем расписание
ЗаполнитьЗначенияСвойств(Расписание, <ДеталиРасписания>);//заполняем свойства
Расписание.ДетальныеРасписанияДня = Новый Массив; // задаем новый массив детальных расписаний, иногда это опускают
РасписаниеДт = Новый РасписаниеРегламентногоЗадания; //создаем интервал
ЗаполнитьЗначенияСвойств(РасписаниеДт, <ДеталиИнтервала1>);//заполняем свойства
Расписание.ДетальныеРасписанияДня.Добавить(РасписаниеДт); // добавляем интервал в детальное расписание
РасписаниеДт = Новый РасписаниеРегламентногоЗадания; //создаем еще один интервал
ЗаполнитьЗначенияСвойств(РасписаниеДт, <ДеталиИнтервала2>);//заполняем свойства
Расписание.ДетальныеРасписанияДня.Добавить(РасписаниеДт); // добавляем второй интервал в детальное расписание
На первый взгляд все логично, все правильно — запускаем, проверяем, но… не работает! Детальные расписания не создаются.
Как обычно, дьявол кроется в деталях, для того чтобы корректно задать детальное расписание, необходимо создать отдельный массив, заполнить его, и только потом присвоить свойству ДетальныеРасписанияДня расписания:
//пример как надо:
Расписание = Новый РасписаниеРегламентногоЗадания; // создаем расписание
МоеДетальноеРасписание = Новый Массив; // ключевой момент, если сделать Расписание.ДетальныеРасписанияДня = Новый Массив(), и добавлять интервалы туда - то кина не будет
РасписаниеДт = Новый РасписаниеРегламентногоЗадания; //создаем первый интервал
ЗаполнитьЗначенияСвойств(РасписаниеДт, <ДеталиИнтервала1>);//заполняем свойства
МоеДетальноеРасписание.Добавить(РасписаниеДт); // добавляем в массив
РасписаниеДт = Новый РасписаниеРегламентногоЗадания; //создаем второй интервал
ЗаполнитьЗначенияСвойств(РасписаниеДт, <ДеталиИнтервала2>);//заполняем свойства
МоеДетальноеРасписание.Добавить(РасписаниеДт); // добавляем в массив
Расписание.ДетальныеРасписанияДня = МоеДетальноеРасписание; //присваиваем детальные расписания дня
Казалось бы различия незначительны, но фатальны. Аналогично, кстати, следуют поступать и с параметрами регзадания: не добавлять их непосредственно в свойство Параметры, а заполнить отдельный массив и потом уже присвоить его свойству.
Кроме того, при задании свойств детального расписания следует помнить, что:
Расписание может содержать только значения следующих свойств: ВремяНачала, ВремяКонца, ВремяЗавершения, ИнтервалЗавершения, ПериодПовтораВТечениеДня, ПаузаПовтора. Если задано свойство ДетальныеРасписанияДня, то основное расписание не должно содержать вышеперечисленные свойства.
Ну и напоследок под катом полный пример создания регзадания с детальным расписанием и параметрами: