В практике работы с конфигурацией 1С:Бухгалтерия Предприятия 3.0 (включая версию КОРП) часто возникает ситуация, когда после ввода больничного листа в документе Начисление зарплаты за соответствующий месяц внезапно «пропадают» отработанные дни. Даже если сотрудник фактически работал часть месяца, программа при автоматическом заполнении может установить 0 дней и 0 часов. Особенно остро эта проблема проявляется после обновления релизов, когда механизмы контроля за рабочим временем становятся более строгими.
В данной статье мы разберем технические и методологические причины такого поведения системы, проанализируем программный код, отвечающий за расчет, и найдем способы исправления этой ошибки.
Рассмотрим типичную ситуацию: в одном месяце начислено за 22 дня, но после внесения больничного и нажатия кнопки Заполнить программа оставляет только 17 дней. В другом случае, как описывает автор темы, при наличии явных рабочих дней в табеле (например, 3 рабочих дня), программа и вовсе обнуляет результат. Почему так происходит?
Проанализируем алгоритм работы программы. В отличие от 1С:ЗУП, где реализована сложная система приоритетов видов расчета (вытеснение по уровням), в 1С:Бухгалтерии используется упрощенная модель. Система определяет отработанное время путем вычитания периодов всех зарегистрированных отклонений из производственного календаря (нормы времени).
Если в системе одновременно проведены два документа отклонения на один и тот же период (например, Отпуск и Больничный лист), программа может «дважды» вычесть одни и те же дни. В итоге получается математическая ошибка: Норма - ДниОтпуска - ДниБольничного = Отрицательное значение или Ноль. Программа не позволяет установить отрицательное время, поэтому в документе Начисление зарплаты мы видим пустые поля или нули.
Для того чтобы понять, как программа формирует данные для начисления, обратимся к программному коду. Основная логика распределения времени и расчета сумм сосредоточена в общем модуле РасчетЗарплатыДляНебольшихОрганизаций. Конкретно нас интересует процедура ЗаполнитьРезультатНачисления.
В процессе выполнения этой процедуры формируется так называемая ТаблицаВытеснений. Проанализируем, что в нее попадает:
Оплата отпуска, Оплата больничного листа, Отпуск за свой счет, Болезнь без оплаты и другие.Проанализируем фрагмент логики, который может приводить к ошибке. Программа оперирует набором записей в регистре накопления Начисления и удержания по сотрудникам. Если за один и тот же день числится и отпуск, и больничный, то при расчете основного начисления (например, Оплата по окладу) оба этих периода будут исключены из рабочего времени.
Если вы столкнулись с тем, что программа некорректно заполняет рабочие дни при наличии больничного, выполните следующие действия:
Первым делом необходимо выяснить, не накладывается ли больничный на другой период отсутствия, например, на отпуск. В системе 1С:Бухгалтерия это критическая ситуация. Согласно трудовому законодательству (и правилам, действующим еще с 1930 года), отпуск должен быть продлен на количество дней болезни или перенесен. В программе это должно быть отражено физическим разделением периодов.
Если вы обнаружили, что Больничный лист пересекается с документом Отпуск, вам необходимо:
Отпуск.Данные оперативного учета рабочего времени сотрудников не было наложений «Б» (больничный) на «ОТ» (отпуск).Для детального анализа того, какие именно записи «портят» расчет, рекомендуем сформировать отчет или просмотреть регистр накопления Начисления и удержания по сотрудникам. Важно смотреть не только период регистрации (месяц начисления), но и период действия (даты «с» и «по»).
Список видов расчета, которые нужно проверить на пересечение:
Оплата отпускаОплата больничного листа (включая часть за счет работодателя)Отпуск без оплатыБолезнь без оплатыМногие пользователи совершают ошибку, ориентируясь только на отчет Табель. Важно понимать: в БП 3.0 отчет «Табель» — это всего лишь визуальное представление данных, собранных из документов. Он может показывать корректные 3 дня явки («Я»), но если в регистрах за эти же 3 дня «висит» неоплачиваемая болезнь или пересекающийся отпуск, документ Начисление зарплаты приоритет отдаст отклонению и обнулит оплату.
Если вы занимаетесь отладкой, обратите внимание на запрос в функции формирования таблицы времени. В некоторых случаях может потребоваться проверка наложения периодов внутри самой таблицы. Рассмотрим упрощенный пример того, как система должна анализировать пересечения (логическая модель):
// Пример логики анализа пересечений периодов
Для Каждого СтрокаОтклонения Из ТаблицаОтклонений Цикл
Если СтрокаОтклонения.ДатаНачала >= ДатаНачалаБольничного
И СтрокаОтклонения.ДатаОкончания <= ДатаОкончанияБольничного Тогда
// Необходимо исключить двойное вычитание этих дней из нормы
Сообщить("Внимание: Обнаружено пересечение периодов!");
КонецЕсли;
КонецЦикла;
Проблема «исчезающих» дней в 1С:Бухгалтерии 3.0 при расчете зарплаты чаще всего связана не с ошибкой релиза как таковой, а с ужесточением контроля за чистотой данных. Программа больше не позволяет «закрывать глаза» на наложение периодов отпуска и больничного.
Главное правило: один календарный день для сотрудника может быть либо рабочим, либо днем отклонения только одного вида. Как только вы устраните физическое наложение периодов в документах Отпуск и Больничный лист, автозаполнение в документе Начисление зарплаты начнет работать корректно, подтягивая оставшиеся рабочие дни в полном соответствии с производственным календарем.