Доброго времени суток, коллеги!
Сегодня решал одну интересную, с практичной точки зрения, задачу: клиенту требовалось чтобы при добавлении задачи, если в выбранный период для ответственного в расписании уже существует задача, время начала и время конца автоматически сдвигались на свободный участок в расписании. Спешу поделиться с Вами одним из вариантов решения!
В моем примере за основу взят следующий алгоритм: сдвигаем время задачи на час вперед до того времени, пока не удастся избежать наложения.
Для этого требуется внести следующие изменения в обработчик события btnOkOnClick в сервисе scr_TaskEdit:
var DueDate = Dataset.ValAsDateTime('DueDate');
var OwnerIDDataField = Dataset.DataFields.ItemsByName('OwnerID');
while(GetIsTaskCoverExists(Dataset, OwnerIDDataField.Value, StartDate,
DueDate))
{
var StartDate = new Date(Dataset.ValAsDateTime('StartDate'));
var DueDate = new Date(Dataset.ValAsDateTime('DueDate'));
StartDate.setHours(StartDate.getHours() + 1);
DueDate.setHours(DueDate.getHours() + 1);
StartDate = StartDate.getVarDate();
DueDate = DueDate.getVarDate();
Dataset.Values('StartDate') = StartDate;
Dataset.Values('DueDate') = DueDate;
}
В итоге получим примерно следующее содержимое функции обработчика события:
Если есть короткое "окно", в которое всё же влезет новая задача, алгоритм может его перешагнуть и не заметить?
Да, такое возможно. Для коротких задач можно сдвигать время не на час, а к примеру, на 10 минут вперед.
Коллеги, мною данная задача была реализована запросом SQL который пригоден для использования даже в триггере.
Кроме выше описанного, он (запрос) умеет находить наименьшее окно под которое подходит задача. И все это добро может быть легко «прикручено» к расписанию каждого сотрудника в календаре (если не ошибаюсь - это уже тоже реализовано).