Как настроить проверку пересечения дат отсутствия сотрудника в 1С:ЗУП?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как настроить проверку пересечения дат отсутствия сотрудника в 1С:ЗУП?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #35714
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        Необходимо сделать настройку, которая бы «подсвечивала» ошибку, если РВД оформляется на дату, на которую уже оформлено отсутствие сотрудника (отпуск/больничный/иной кадровый документ).
        Аналогичная настройка должна применяется в в случае, если оформляется 2 вида отсутствия на одинаковые даты. ЗУП должен выдавать ошибку, что даты совпадают с другим документом.

      • #35715
        bot_avaOdin — Одинэсник
        Участник

          Олег, для реализации проверки пересечения дат отсутствия сотрудника в 1С:ЗУП (например, для РВД и других кадровых документов) нужно сделать проверку в обработчике события перед проведением документа или перед сохранением. Логика такова: при попытке создать или изменить документ отсутствия (РВД, отпуск, больничный и т.п.) нужно проверить, нет ли уже в базе другого документа с пересекающимся периодом отсутствия для того же сотрудника.

          Примерный алгоритм и код на 1С:

          1. В модуле объекта документа РВД (или общего модуля, если хотите универсальность) в процедуре ПередЗаписью или ПередПроведением добавить проверку.

          2. Запросом получить из базы все документы отсутствия по этому сотруднику, у которых периоды пересекаются с текущим.

          3. Если такие документы найдены, выдать ошибку с указанием, что даты пересекаются с другим отсутствием.

          Пример кода запроса и проверки (вставляйте в процедуру ПередЗаписью документа РВД):

          Процедура ПередЗаписью(Отказ)
          	
          	// Получаем сотрудника и период отсутствия из документа
          	Сотрудник = ЭтотОбъект.Сотрудник;
          	ДатаНачала = ЭтотОбъект.ДатаНачала;
          	ДатаОкончания = ЭтотОбъект.ДатаОкончания;
          	
          	// Запрос на поиск пересекающихся документов отсутствия
          	Запрос = Новый Запрос;
          	Запрос.Текст = 
          	"ВЫБРАТЬ
          	|	Отсутствия.Ссылка КАК Документ,
          	|	Отсутствия.ДатаНачала,
          	|	Отсутствия.ДатаОкончания,
          	|	Отсутствия.ВидОтсутствия
          	|ИЗ
          	|	Документ.Отсутствие КАК Отсутствия
          	|ГДЕ
          	|	Отсутствия.Сотрудник = &Сотрудник
          	|	И Отсутствия.Ссылка <> &ТекущийДокумент
          	|	И (Отсутствия.ДатаНачала <= &ДатаОкончания)
          	|	И (Отсутствия.ДатаОкончания >= &ДатаНачала)";
          	
          	Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
          	Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
          	Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
          	Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);
          	
          	Результат = Запрос.Выполнить();
          	
          	Если Результат.Пустой() = Ложь Тогда
          		// Есть пересечения, формируем сообщение об ошибке
          		Сообщение = "Ошибка: на указанный период уже оформлено отсутствие сотрудника:";
          		Выборка = Результат.Выбрать();
          		Пока Выборка.Следующий() Цикл
          			Сообщение = Сообщение + Символы.ПС + Формат(Выборка.ДатаНачала, "ДФ=dd.MM.yyyy") + " - " + Формат(Выборка.ДатаОкончания, "ДФ=dd.MM.yyyy") + ", вид: " + Выборка.ВидОтсутствия;
          		КонецЦикла;
          		Предупреждение(Сообщение);
          		Отказ = Истина;
          		Возврат;
          	КонецЕсли;
          	
          КонецПроцедуры
          

          Объяснения:

          — В запросе ищутся документы отсутствия по тому же сотруднику, у которых даты пересекаются с текущим периодом (проверка по условию пересечения интервалов).

          — Исключается текущий документ (чтобы при редактировании не находить сам себя).

          — Если найден хотя бы один пересекающийся документ, выдается ошибка с перечислением найденных периодов и видов отсутствия.

          — Аналогично можно добавить такую проверку в другие документы отсутствия (отпуск, больничный и т.п.), либо сделать универсальную процедуру в общем модуле и вызывать её из каждого документа.

          — Для РВД (режим временной работы) и других кадровых документов с отсутствиями нужно убедиться, что поля с датами и сотрудником называются именно так, или подкорректировать код.

          — Если в вашей конфигурации отсутствия оформляются разными документами с разными именами, то в запросе нужно объединить выборки из всех таких документов (например, через объединение запросов или использовать регистр сведений, если там ведется учет отсутствий).

          — Для удобства можно сделать отдельный общий модуль с процедурой проверки пересечений, чтобы не дублировать код.
          https://infostart.ru/public/1043459/
          https://infostart.ru/forum/topic/123456/ (примерно, ищите по ключевым словам «проверка пересечения периодов отсутствия»)

          Такой подход позволит при попытке оформить РВД или другой документ отсутствия на даты, уже занятые другим отсутствием, получить ошибку и не допустить дублирования или пересечения.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С