Переход с устаревшей конфигурации «1С:Зарплата и Кадры 7.7» (ЗиК) на современную «1С:Зарплата и Управление Персоналом 3.1» (ЗУП) — это важный шаг для любой организации. Однако этот процесс часто сопровождается техническими сложностями. Типичный пример такой проблемы: перенос данных прошел успешно и без видимых ошибок, но при первой же попытке рассчитать заработную плату за месяц система выдает аварийное сообщение.
В этой статье мы подробно разберем, почему возникает ошибка «Деление на 0» в формуле расчета оклада по часам, откуда берется загадочный <Объект не найден> вместо сотрудника в документах начисления и как пошагово решить эти проблемы с помощью системных механизмов и программного кода.
Давайте проанализируем ситуацию, с которой сталкиваются многие специалисты при переходе. В процессе расчета начисления по тарифной ставке или окладу программа выдает ошибку следующего вида:
«При расчете начисления "Оплата по окладу (по часам)" возникла ошибка: Деление на 0. Формула, используемая при расчете: Оклад * ВремяВЧасах / НормаЧасов»
При этом в диагностическом сообщении вместо имени конкретного сотрудника отображается битая ссылка вида <Объект не найден> (294:813660e32705893911e8e886b8106b0e). Давайте выясним истинные причины этого сбоя, которые кроются в архитектурных различиях платформ 1С v7.7 и 1С v8.3.
Появление битых ссылок (GUID) в документах начисления после переноса — частая проблема. Выделим основные причины ее возникновения:
Сотрудники новой базы ЗУП 3.1.Обычное тестирование и исправление (ТИИ) базы данных не всегда решает эту проблему, если ссылки ведут на закрытые прошлые периоды. Чтобы поврежденные записи сотрудников перестали попадать в расчет с ошибкой, выполним следующие действия:
Ошибка деления на ноль из-за пустого значения показателя НормаЧасов вызвана конфликтом идентификаторов в платформе 1С:Предприятие 8.3.
В конфигурации 1С:ЗУП 3.1 предопределенные элементы справочников (такие как показатель расчета зарплаты НормаЧасов или вид начисления Оплата по окладу (по часам)) жестко связаны с метаданными через свойство ИмяПредопределенныхДанных. При переносе данных из версии 7.7 специализированная обработка выгрузки может создать собственный (пользовательский) аналог показателя с тем же именем, не сопоставив его со встроенным предопределенным элементом.
В результате в базе образуются два одинаковых по названию показателя:
Формула начисления начинает ссылаться на этот созданный переносом пустой показатель. Соответственно, при расчете программа подставляет вместо нормы часов 0, что и приводит к аварийному завершению работы алгоритма расчета.
Рассмотрим несколько эффективных методов устранения дублирования данных в информационной базе.
Это самый безопасный и правильный способ слияния ошибочных элементов. Выполним его по шагам:
Показатели расчета зарплаты.Начисления, если начисление Оплата по окладу (по часам) также задвоилось.Иногда платформа блокирует удаление дублирующего показателя, считая его предопределенным из-за сбоев при переносе (свойство заполняется ошибочно). В такой ситуации признак предопределенности у ложного элемента можно снять программно. Для этого воспользуемся внешней консолью кода или групповой обработкой и выполним следующий bsl-код:
// Снятие признака предопределенности у ложного элемента
ЛожныйПоказательОбъект = СсылкаНаЛожныйПоказатель.ПолучитьОбъект();
ЛожныйПоказательОбъект.ИмяПредопределенныхДанных = "";
ЛожныйПоказательОбъект.Записать();
После выполнения данного кода ложный показатель потеряет связь с метаданными и станет обычным пользовательским элементом, который можно без труда пометить на удаление и заменить оригинальным элементом при помощи стандартной обработки.
Бывают случаи, когда рассчитать заработную плату необходимо срочно, а времени на детальный поиск и замену дубликатов в базе нет. Мы можем временно обезопасить расчетный механизм от деления на ноль, изменив формулу расчета начисления.
Для этого откроем настройки начисления Оплата по окладу (по часам) и отредактируем формулу:
Было:
Оклад * ВремяВЧасах / НормаЧасов
Изменим на безопасный вариант:
Оклад * ВремяВЧасах / Макс(НормаЧасов, 1)
Использование функции Макс гарантирует, что если показатель НормаЧасов по какой-то причине равен нулю, система подставит в знаменатель единицу. Это позволит завершить расчеты без критического сбоя, а после сдачи отчетности можно будет спокойно заняться очисткой базы от дубликатов.
Применяя описанные методы, вы сможете успешно завершить миграцию данных и избежать ошибок при расчете зарплаты в новой информационной базе «1С:ЗУП 3.1».