Как исправить ошибку «Деление на 0» и «Объект не найден» в 1С:ЗУП 3.1 после переноса из ЗиК 7.7?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

Переход с устаревшей конфигурации «1С:Зарплата и Кадры 7.7» (ЗиК) на современную «1С:Зарплата и Управление Персоналом 3.1» (ЗУП) — это важный шаг для любой организации. Однако этот процесс часто сопровождается техническими сложностями. Типичный пример такой проблемы: перенос данных прошел успешно и без видимых ошибок, но при первой же попытке рассчитать заработную плату за месяц система выдает аварийное сообщение.

В этой статье мы подробно разберем, почему возникает ошибка «Деление на 0» в формуле расчета оклада по часам, откуда берется загадочный <Объект не найден> вместо сотрудника в документах начисления и как пошагово решить эти проблемы с помощью системных механизмов и программного кода.

Симптомы проблемы и анализ причин

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

«При расчете начисления "Оплата по окладу (по часам)" возникла ошибка: Деление на 0. Формула, используемая при расчете: Оклад * ВремяВЧасах / НормаЧасов»

При этом в диагностическом сообщении вместо имени конкретного сотрудника отображается битая ссылка вида <Объект не найден> (294:813660e32705893911e8e886b8106b0e). Давайте выясним истинные причины этого сбоя, которые кроются в архитектурных различиях платформ 1С v7.7 и 1С v8.3.

Часть 1. Разбираемся с «<Объект не найден>» для сотрудника

Появление битых ссылок (GUID) в документах начисления после переноса — частая проблема. Выделим основные причины ее возникновения:

  1. Использование рекомендованного (краткого) переноса данных. При выборе этого варианта в новую базу переносятся только активно работающие сотрудники на дату начала учета. Однако в регистры переноса данных (например, для расчета среднего заработка за прошлые периоды) могут попасть записи по уже уволенным сотрудникам, физические лица которых не были созданы в справочнике Сотрудники новой базы ЗУП 3.1.
  2. Нарушение ссылочной целостности в исходной базе ЗиК 7.7. Если в старой базе существовали «сиротские» записи в периодических реквизитах или кадровой истории (например, элемент справочника физических лиц был удален напрямую без контроля ссылок), правила конвертации переносят эту несуществующую ссылку как есть, генерируя «пустой» GUID в новой информационной базе.
  3. Нетиповые доработки в ЗиК 7.7. Измененные алгоритмы и нетиповые документы старой системы часто некорректно сопоставляются стандартными правилами обмена.

Обычное тестирование и исправление (ТИИ) базы данных не всегда решает эту проблему, если ссылки ведут на закрытые прошлые периоды. Чтобы поврежденные записи сотрудников перестали попадать в расчет с ошибкой, выполним следующие действия:

  1. Перейдем в раздел Зарплата — Сервис — Перерасчеты.
  2. Проанализируем список зарегистрированных перерасчетов. Часто там висят требования пересчитать прошлые периоды (например, за 2018 год и ранее) по несуществующим сотрудникам.
  3. Выделим все устаревшие строки и полностью очистим (удалим) зарегистрированные автоматические перерасчеты. Это исключит битые ссылки из текущих расчетов.

Часть 2. Почему возникает деление на 0 и удваиваются показатели?

Ошибка деления на ноль из-за пустого значения показателя НормаЧасов вызвана конфликтом идентификаторов в платформе 1С:Предприятие 8.3.

В конфигурации 1С:ЗУП 3.1 предопределенные элементы справочников (такие как показатель расчета зарплаты НормаЧасов или вид начисления Оплата по окладу (по часам)) жестко связаны с метаданными через свойство ИмяПредопределенныхДанных. При переносе данных из версии 7.7 специализированная обработка выгрузки может создать собственный (пользовательский) аналог показателя с тем же именем, не сопоставив его со встроенным предопределенным элементом.

В результате в базе образуются два одинаковых по названию показателя:

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

Часть 3. Способы исправления дублей показателей и начислений

Рассмотрим несколько эффективных методов устранения дублирования данных в информационной базе.

Метод А. Использование типовой обработки «Поиск и замена дублей»

Это самый безопасный и правильный способ слияния ошибочных элементов. Выполним его по шагам:

  1. Откроем меню Функции для технического специалиста (или перейдем в раздел Администрирование — Обслуживание — Корректировка данных).
  2. Найдем и запустим обработку Поиск и замена дублей.
  3. В поле «Искать в:» выберем справочник Показатели расчета зарплаты.
  4. В качестве критериев поиска укажем совпадение по наименованию.
  5. В списке найденных дублей обратим внимание на значки элементов. Истинный предопределенный элемент платформы помечен сине-зеленым кружком. Нам нужно назначить его в качестве Оригинала.
  6. Элемент, созданный переносом (без кружка), назначим как Дубль.
  7. Нажмем кнопку Выполнить замену. Система автоматически перенаправит все формулы во всех начислениях и кадровых документах на правильный предопределенный показатель.
  8. Повторим аналогичную процедуру для плана видов расчета Начисления, если начисление Оплата по окладу (по часам) также задвоилось.

Метод Б. Программное снятие предопределенности у ложного дубля

Иногда платформа блокирует удаление дублирующего показателя, считая его предопределенным из-за сбоев при переносе (свойство заполняется ошибочно). В такой ситуации признак предопределенности у ложного элемента можно снять программно. Для этого воспользуемся внешней консолью кода или групповой обработкой и выполним следующий bsl-код:


// Снятие признака предопределенности у ложного элемента
ЛожныйПоказательОбъект = СсылкаНаЛожныйПоказатель.ПолучитьОбъект();
ЛожныйПоказательОбъект.ИмяПредопределенныхДанных = "";
ЛожныйПоказательОбъект.Записать();

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

Метод В. Временный обход ошибки через модификацию формулы

Бывают случаи, когда рассчитать заработную плату необходимо срочно, а времени на детальный поиск и замену дубликатов в базе нет. Мы можем временно обезопасить расчетный механизм от деления на ноль, изменив формулу расчета начисления.

Для этого откроем настройки начисления Оплата по окладу (по часам) и отредактируем формулу:

Было:

Оклад * ВремяВЧасах / НормаЧасов

Изменим на безопасный вариант:

Оклад * ВремяВЧасах / Макс(НормаЧасов, 1)

Использование функции Макс гарантирует, что если показатель НормаЧасов по какой-то причине равен нулю, система подставит в знаменатель единицу. Это позволит завершить расчеты без критического сбоя, а после сдачи отчетности можно будет спокойно заняться очисткой базы от дубликатов.

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

← На главную