Перенос данных из других конфигураций (например, из «1С:Бухгалтерии предприятия») в «1С:Зарплату и управление персоналом» (ЗУП 3.1) — это комплексный процесс, который нередко сопровождается техническими сбоями. Одной из наиболее распространенных и неприятных проблем является возникновение ошибки деления на ноль при попытке заполнить и рассчитать автоматический документ Начисление зарплаты и взносов.
Чаще всего система выдает предупреждение следующего вида:
При расчете начисления "Оплата по окладу" за январь 2018 для сотрудника *** возникла ошибка: Деление на 0. Формула, используемая при расчете: Оклад * ДоляНеполногоРабочегоВремени * ВремяВДнях / НормаДней
В этой ситуации очевидно, что показатель, находящийся в знаменателе математического выражения (в данном случае НормаДней), равен нулю. Но как быть, если визуально и производственный календарь, и графики работы сотрудников в базе заполнены? Давайте подробно, шаг за шагом, разберем причины этой неполадки и выясним, как вернуть систему в рабочее состояние.
Проанализируем механизм, который чаще всего активируется непосредственно в момент переноса данных из других баз. При переносе сведений система создает кадровые документы «задним числом» (например, документы переноса данных, начальную штатную расстановку или документы приема). Платформа 1С воспринимает эти действия как ретроспективные кадровые изменения и автоматически регистрирует необходимость перерасчетов за прошлые периоды (например, за весь предыдущий год).
Когда мы нажимаем кнопку Заполнить в текущем документе Начисление зарплаты и взносов, программа автоматически переходит на вкладку Доначисления, перерасчеты и пытается рассчитать зарплату за прошлые месяцы. Но поскольку графики работы за те старые периоды в новую базу не переносились или не заполнялись, показатель НормаДней для прошлых лет оказывается равным нулю. Это и вызывает фатальный сбой.
Рассмотрим, как это исправить:
Начисление зарплаты и взносов, полностью очистим его, перезаполним заново и проверим результат.Выясним техническую сторону переноса данных из двух и более баз (например, отдельно по ООО и по ИП). При импорте информации механизмы платформы сопоставляют справочники. Однако предопределенные показатели расчета зарплаты, такие как НормаДней, ВремяВДнях или Оклад, могут некорректно синхронизироваться, из-за чего в базе создаются их полные дубли.
В результате в формуле начисления Оплата по окладу может использоваться один показатель, а кадровые документы и графики фиксируют данные по другому (внешне абсолютно такому же) показателю. В момент расчета программа обращается к «пустому» показателю-дублю, считывает оттуда значение 0 и выдает ошибку деления.
Для исправления этой коллизии воспользуемся стандартным инструментом слияния дублирующихся элементов:
Показатели расчета зарплаты.Рассмотрим еще одну коварную ситуацию. Открывая справочник Графики работы сотрудников, мы можем видеть красивую заполненную сетку часов. Однако на физическом уровне в базе данных СУБД (или в файловой таблице) данные в регистре сведений Параметры графиков работы могут отсутствовать из-за того, что перенос выполнил прямую запись объектов без вызова встроенных процедур заполнения.
Чтобы принудительно инициализировать расчет времени на уровне платформы, выполним следующие шаги:
Для технических специалистов и программистов полезно локализовать проблему отсутствия записей в регистре с помощью простого запроса. Мы можем запустить его в консоли запросов, чтобы быстро выявить графики, по которым нет физических записей параметров времени на нужный год:
ВЫБРАТЬ
Графики.Ссылка КАК ГрафикРаботы,
Параметры.Год КАК Год,
Параметры.Месяц КАК Месяц
ИЗ
Справочник.ГрафикиРаботыСотрудников КАК Графики
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПараметрыГрафиковРаботы КАК Параметры
ПО Графики.Ссылка = Параметры.ГрафикРаботы
И Параметры.Год = 2018
ГДЕ
Параметры.ГрафикРаботы ЕСТЬ NULL
Если этот запрос возвращает строки, значит, указанные графики действительно требуют принудительного перезаполнения и сохранения в интерфейсе программы.
Часто пользователи путают факт существования графика в системе и факт его привязки к конкретному сотруднику. При переносе данных кадровые документы (например, Прием на работу или Начальная штатная расстановка) могли быть записаны с пустым полем графика работы либо с ссылкой на старый, неиспользуемый график.
Проанализируем ситуацию: если у сотрудника в его кадровой истории не зафиксирован график работы на текущий месяц расчета, программа не сможет определить для него норму дней (она будет равна нулю). Соответственно, при расчете оклада возникнет ошибка деления на ноль.
Для диагностики и исправления этой ситуации выполним следующие действия:
Сотрудники.Кадровый перевод или Начальная штатная расстановка).Программисты могут быстро проверить наличие сотрудников с незаполненными графиками работы в регистре кадровой истории с помощью следующего запроса:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
КадроваяИстория.Организация КАК Организация,
КадроваяИстория.ГрафикРаботы КАК ГрафикРаботы
ИЗ
Справочник.Сотрудники КАК Сотрудники
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&Период, ) КАК КадроваяИстория
ПО Сотрудники.Ссылка = КадроваяИстория.Сотрудник
ГДЕ
КадроваяИстория.ГрафикРаботы = ЗНАЧЕНИЕ(Справочник.ГрафикиРаботыСотрудников.ПустаяСсылка)
ИЛИ КадроваяИстория.ГрафикРаботы ЕСТЬ NULL
В процессе переноса данных из нескольких конфигураций статус сотрудников может быть перенесен с ошибками. Например, сотрудники, находящиеся в отпуске по уходу за ребенком до 1.5 или 3 лет, или давно уволенные работники могут определиться программой как активные сотрудники, работающие на окладе.
При автозаполнении документа Начисление зарплаты и взносов они попадают в общую таблицу. Программа пытается рассчитать им начисление Оплата по окладу. Но так как эти сотрудники фактически не работают, у них нет планового рабочего времени, их норма рабочих дней в текущем периоде равна нулю, что опять же приводит к делению на ноль.
Решить эту проблему можно так:
Отпуск по уходу за ребенком или Увольнение, которые приостанавливают плановые начисления по окладу.Таким образом, мы детально разобрали все возможные причины возникновения ошибки деления на ноль в программе 1С:ЗУП 3.1 после переноса данных. Последовательное выполнение предложенных шагов поможет вам быстро локализовать неисправность, исправить поврежденные данные и успешно завершить расчет заработной платы.