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