Как исправить ошибку «Поле объекта не обнаружено (параметрыРасчетаПособияПоНетрудоспособности)» в 1С:ЗУП 8.3?

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

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

Выясняем техническую причину ошибки

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


Процедура РассчитатьПособиеПоНетрудоспособности(СтрокиРасчета, ДополнительныеПараметры, ПрименяетсяСторнирование = Истина) Экспорт
    
    ПараметрыОплаты = ДополнительныеПараметрыРасчетаПособияПоНетрудоспособности();
    ЗаполнитьЗначенияСвойств(ПараметрыОплаты, ДополнительныеПараметры.ПараметрыРасчетаПособияПоНетрудоспособности);

Обратим внимание на вторую строку исполняемого кода процедуры. Здесь программа пытается напрямую обратиться к свойству структуры через точку: ДополнительныеПараметры.ПараметрыРасчетаПособияПоНетрудоспособности. В этот момент и происходит критическая остановка.

Дело в том, что начиная с версии ЗУП 3.1.5, разработчики 1С перенесли тяжелые расчетные операции в фоновые задания (механизм длительных операций). При заполнении документа начисления запускается фоновый процесс на сервере, в который передается структура данных под названием ДополнительныеПараметры. В определенных сценариях (например, когда система пытается автоматически пересчитать прошлые периоды по сотрудникам) вызывающий алгоритм формирует эту структуру без ключа ПараметрыРасчетаПособияПоНетрудоспособности. Программа пытается прочитать отсутствующее свойство напрямую, не находит его и выдает ошибку.

Почему помогает «обходной путь» с кадровым переводом?

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

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

Метод 1. Очистка очереди перерасчетов (Быстрое решение для пользователя)

Самый простой и эффективный способ вернуть программу в рабочее состояние без изменения кода и кадровой истории — это очистить зависшие запросы на перерасчет. Разберем этот процесс по шагам:

  1. Перейдем в раздел меню Зарплата.
  2. В блоке Сервис найдем и откроем пункт Перерасчеты.
  3. Перед нами откроется список сотрудников, по которым система зарегистрировала необходимость пересчитать прошлые периоды.
  4. Найдем в списке сотрудников, из-за которых прерывается заполнение документа начисления.
  5. Выделим эти строки курсором и нажмем кнопку Отменить (или просто удалим их из списка кнопкой Del).
  6. Вернемся в документ «Начисление зарплаты и взносов» и попробуем снова нажать кнопку Заполнить.

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

Метод 2. Исправление кода через расширение (Решение для программиста)

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

Для этого создадим расширение конфигурации, добавим в него общий модуль УчетПособийСоциальногоСтрахования и переопределим процедуру РассчитатьПособиеПоНетрудоспособности с помощью аннотации &Вместо:


&Вместо("РассчитатьПособиеПоНетрудоспособности")
Процедура ИСПР_РассчитатьПособиеПоНетрудоспособности(СтрокиРасчета, ДополнительныеПараметры, ПрименяетсяСторнирование = Истина)
    
    ПараметрыОплаты = ДополнительныеПараметрыРасчетаПособияПоНетрудоспособности();
    
    // Проверяем наличие ключа в структуре перед обращением к нему
    Если ДополнительныеПараметры.Свойство("ПараметрыРасчетаПособияПоНетрудоспособности") Тогда
        ЗаполнитьЗначенияСвойств(ПараметрыОплаты, ДополнительныеПараметры.ПараметрыРасчетаПособияПоНетрудоспособности);
    КонецЕсли;
    
    // Продолжаем стандартное выполнение алгоритма
    ...
КонецПроцедуры

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

Метод 3. Очистка кэша базы данных 1С

Иногда ошибки, связанные с фоновыми заданиями и длительными операциями, возникают из-за некорректного кэширования метаданных платформой 1С. Особенно часто это происходит после динамического обновления конфигурации («на лету»). Проанализируем действия по очистке кэша:

  1. Закроем все запущенные сеансы работы с базой данных 1С.
  2. Откроем окно запуска 1С:Предприятия.
  3. Выберем нашу информационную базу в списке, нажмем кнопку Изменить, скопируем путь к базе и удалим ее из списка.
  4. Нажмем кнопку Добавить, пропишем имя базы заново и укажем скопированный путь. При этой процедуре папка с локальным кэшем для этой базы создается заново с чистого листа.
  5. Если база работает в клиент-серверном варианте, рекомендуется также перезапустить службу сервера 1С:Предприятия для сброса серверного кэша вызовов фоновых заданий.

Метод 4. Обновление конфигурации

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

Своевременное обновление программы позволит вам навсегда забыть об этой проблеме и гарантирует корректную работу всех механизмов расчета социальных пособий.

← На главную