Почему в 1С:Бухгалтерии 3.0 некорректно начисляется зарплата в месяцах с больничными и отпусками?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

В практике работы с конфигурацией 1С:Бухгалтерия Предприятия 3.0 (включая версию КОРП) часто возникает ситуация, когда после ввода больничного листа в документе Начисление зарплаты за соответствующий месяц внезапно «пропадают» отработанные дни. Даже если сотрудник фактически работал часть месяца, программа при автоматическом заполнении может установить 0 дней и 0 часов. Особенно остро эта проблема проявляется после обновления релизов, когда механизмы контроля за рабочим временем становятся более строгими.

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

Анализ проблемы: почему «срезаются» дни

Рассмотрим типичную ситуацию: в одном месяце начислено за 22 дня, но после внесения больничного и нажатия кнопки Заполнить программа оставляет только 17 дней. В другом случае, как описывает автор темы, при наличии явных рабочих дней в табеле (например, 3 рабочих дня), программа и вовсе обнуляет результат. Почему так происходит?

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

Если в системе одновременно проведены два документа отклонения на один и тот же период (например, Отпуск и Больничный лист), программа может «дважды» вычесть одни и те же дни. В итоге получается математическая ошибка: Норма - ДниОтпуска - ДниБольничного = Отрицательное значение или Ноль. Программа не позволяет установить отрицательное время, поэтому в документе Начисление зарплаты мы видим пустые поля или нули.

Технический разбор: работа модуля расчета

Для того чтобы понять, как программа формирует данные для начисления, обратимся к программному коду. Основная логика распределения времени и расчета сумм сосредоточена в общем модуле РасчетЗарплатыДляНебольшихОрганизаций. Конкретно нас интересует процедура ЗаполнитьРезультатНачисления.

В процессе выполнения этой процедуры формируется так называемая ТаблицаВытеснений. Проанализируем, что в нее попадает:

  1. Программа собирает данные из регистров о всех начислениях, имеющих признак отклонения.
  2. К таким начислениям относятся: Оплата отпуска, Оплата больничного листа, Отпуск за свой счет, Болезнь без оплаты и другие.
  3. Если периоды этих начислений пересекаются, то в таблице вытеснений возникают дублирующиеся записи по датам.

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

Пошаговое решение проблемы

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

Шаг 1. Проверка пересечения периодов

Первым делом необходимо выяснить, не накладывается ли больничный на другой период отсутствия, например, на отпуск. В системе 1С:Бухгалтерия это критическая ситуация. Согласно трудовому законодательству (и правилам, действующим еще с 1930 года), отпуск должен быть продлен на количество дней болезни или перенесен. В программе это должно быть отражено физическим разделением периодов.

Шаг 2. Корректировка первичных документов

Если вы обнаружили, что Больничный лист пересекается с документом Отпуск, вам необходимо:

Шаг 3. Использование отчетов для диагностики

Для детального анализа того, какие именно записи «портят» расчет, рекомендуем сформировать отчет или просмотреть регистр накопления Начисления и удержания по сотрудникам. Важно смотреть не только период регистрации (месяц начисления), но и период действия (даты «с» и «по»).

Список видов расчета, которые нужно проверить на пересечение:

  1. Оплата отпуска
  2. Оплата больничного листа (включая часть за счет работодателя)
  3. Отпуск без оплаты
  4. Болезнь без оплаты

Особенности работы с отчетом «Табель»

Многие пользователи совершают ошибку, ориентируясь только на отчет Табель. Важно понимать: в БП 3.0 отчет «Табель» — это всего лишь визуальное представление данных, собранных из документов. Он может показывать корректные 3 дня явки («Я»), но если в регистрах за эти же 3 дня «висит» неоплачиваемая болезнь или пересекающийся отпуск, документ Начисление зарплаты приоритет отдаст отклонению и обнулит оплату.

Пример исправления ситуации в коде (для разработчиков)

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


// Пример логики анализа пересечений периодов
Для Каждого СтрокаОтклонения Из ТаблицаОтклонений Цикл
    Если СтрокаОтклонения.ДатаНачала >= ДатаНачалаБольничного 
       И СтрокаОтклонения.ДатаОкончания <= ДатаОкончанияБольничного Тогда
        // Необходимо исключить двойное вычитание этих дней из нормы
        Сообщить("Внимание: Обнаружено пересечение периодов!");
    КонецЕсли;
КонецЦикла;

Подведем итоги

Проблема «исчезающих» дней в 1С:Бухгалтерии 3.0 при расчете зарплаты чаще всего связана не с ошибкой релиза как таковой, а с ужесточением контроля за чистотой данных. Программа больше не позволяет «закрывать глаза» на наложение периодов отпуска и больничного.

Главное правило: один календарный день для сотрудника может быть либо рабочим, либо днем отклонения только одного вида. Как только вы устраните физическое наложение периодов в документах Отпуск и Больничный лист, автозаполнение в документе Начисление зарплаты начнет работать корректно, подтягивая оставшиеся рабочие дни в полном соответствии с производственным календарем.

← На главную