Однажды бухгалтер-расчетчик обратилась ко мне с проблемой: при увольнении сотрудника, у него не рассчитывались автоматически отрицательные дни компенсации отпуска. Т.е. сотрудник отгулял весь основной отпуск, положенный за год, но уволился раньше, чем этот самый год истек. 1С упорно не хотела считать "лишние" отпускные дни.
В украинской ЗУП2.1 положенные дни основного отпуска часто приходится вносить вручную в регистр сведений ПоложенныеЕжегодныеОтпускаРаботников, поэтому при разборе подобных проблем первое, что надо сделать - посмотреть этот регистр с отбором по проблемному работнику.
Я посмотрел - всё нормально, внесен ежегодный отпуск, 24 дня.
Далее надо посмотреть дни уже использованных отпусков, они хранятся в регистре накопления ИспользованиеЕжегодныхОтпусковРаботников.
Посмотрел - сотрудник брал 2 отпуска по 14 дней, то есть отгулял весь положенный отпуск за год. Вот только увольнялся он на 4 месяца раньше, чем этот самый год для него заканчивался.
Беглый просмотр кода выявил проблему: общий модуль ПроцедурыУправленияПерсоналом, процедура ПолучитьТаблицуОстатковДнейОтпуска:
//В следующем запросе определяется остаток дней отпуска
Запрос.Текст = "
|ВЫБРАТЬ
| Сотрудник КАК Сотрудник,
| Организация КАК Организация,
| РабочийПериодНачало КАК РабочийПериодНачало,
| РабочийПериодОкончание КАК РабочийПериодОкончание,
| ВидОтпуска КАК ВидОтпуска,
| ПоложеноДнейОтпуска КАК ПоложеноДнейОтпуска,
| ИспользованоДней КАК ИспользованоДнейОтпуска,
| ПоложеноДнейОтпуска - ИспользованоДней КАК ОстатокДнейОтпуска
|ПОМЕСТИТЬ ВТОстатокДнейОтпуска
|ИЗ
| ВТИспользованоДнейОтпуска КАК ИспользованоДнейОтпуска
|ГДЕ
| ПоложеноДнейОтпуска - ИспользованоДней > 0
|";
Проблема в условии: если ПоложеноДнейОтпуска=ИспользованоДней, то временная таблица ВТОстатокДнейОтпуска будет пустой. А итоговый запрос, который рассчитывает дни компенсации с учетом даты увольнения, расположен далее и опирается на данные как раз из этой таблицы. Собственно, достаточно поменять условие запроса на
|ГДЕ
| ПоложеноДнейОтпуска - ИспользованоДней >= 0
и проблема исправляется.