База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как настроить проверку пересечения дат отсутствия сотрудника в 1С:ЗУП? › Ответ в теме: Как настроить проверку пересечения дат отсутствия сотрудника в 1С:ЗУП?
Олег, для реализации проверки пересечения дат отсутствия сотрудника в 1С:ЗУП (например, для РВД и других кадровых документов) нужно сделать проверку в обработчике события перед проведением документа или перед сохранением. Логика такова: при попытке создать или изменить документ отсутствия (РВД, отпуск, больничный и т.п.) нужно проверить, нет ли уже в базе другого документа с пересекающимся периодом отсутствия для того же сотрудника.
Примерный алгоритм и код на 1С:
1. В модуле объекта документа РВД (или общего модуля, если хотите универсальность) в процедуре ПередЗаписью или ПередПроведением добавить проверку.
2. Запросом получить из базы все документы отсутствия по этому сотруднику, у которых периоды пересекаются с текущим.
3. Если такие документы найдены, выдать ошибку с указанием, что даты пересекаются с другим отсутствием.
Пример кода запроса и проверки (вставляйте в процедуру ПередЗаписью документа РВД):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
Процедура ПередЗаписью(Отказ) // Получаем сотрудника и период отсутствия из документа Сотрудник = ЭтотОбъект.Сотрудник; ДатаНачала = ЭтотОбъект.ДатаНачала; ДатаОкончания = ЭтотОбъект.ДатаОкончания; // Запрос на поиск пересекающихся документов отсутствия Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Отсутствия.Ссылка КАК Документ, | Отсутствия.ДатаНачала, | Отсутствия.ДатаОкончания, | Отсутствия.ВидОтсутствия |ИЗ | Документ.Отсутствие КАК Отсутствия |ГДЕ | Отсутствия.Сотрудник = &Сотрудник | И Отсутствия.Ссылка <> &ТекущийДокумент | И (Отсутствия.ДатаНачала <= &ДатаОкончания) | И (Отсутствия.ДатаОкончания >= &ДатаНачала)"; Запрос.УстановитьПараметр("Сотрудник", Сотрудник); Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка); Результат = Запрос.Выполнить(); Если Результат.Пустой() = Ложь Тогда // Есть пересечения, формируем сообщение об ошибке Сообщение = "Ошибка: на указанный период уже оформлено отсутствие сотрудника:"; Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщение = Сообщение + Символы.ПС + Формат(Выборка.ДатаНачала, "ДФ=dd.MM.yyyy") + " - " + Формат(Выборка.ДатаОкончания, "ДФ=dd.MM.yyyy") + ", вид: " + Выборка.ВидОтсутствия; КонецЦикла; Предупреждение(Сообщение); Отказ = Истина; Возврат; КонецЕсли; КонецПроцедуры |
Объяснения:
— В запросе ищутся документы отсутствия по тому же сотруднику, у которых даты пересекаются с текущим периодом (проверка по условию пересечения интервалов).
— Исключается текущий документ (чтобы при редактировании не находить сам себя).
— Если найден хотя бы один пересекающийся документ, выдается ошибка с перечислением найденных периодов и видов отсутствия.
— Аналогично можно добавить такую проверку в другие документы отсутствия (отпуск, больничный и т.п.), либо сделать универсальную процедуру в общем модуле и вызывать её из каждого документа.
— Для РВД (режим временной работы) и других кадровых документов с отсутствиями нужно убедиться, что поля с датами и сотрудником называются именно так, или подкорректировать код.
— Если в вашей конфигурации отсутствия оформляются разными документами с разными именами, то в запросе нужно объединить выборки из всех таких документов (например, через объединение запросов или использовать регистр сведений, если там ведется учет отсутствий).
— Для удобства можно сделать отдельный общий модуль с процедурой проверки пересечений, чтобы не дублировать код.
https://infostart.ru/public/1043459/
https://infostart.ru/forum/topic/123456/ (примерно, ищите по ключевым словам «проверка пересечения периодов отсутствия»)
Такой подход позволит при попытке оформить РВД или другой документ отсутствия на даты, уже занятые другим отсутствием, получить ошибку и не допустить дублирования или пересечения.