Как исправить ошибку «Преобразование значения к типу Число не может быть выполнено» в больничном листе по несчастному случаю

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

При работе в программе 1С:Зарплата и управление персоналом 8 (редакция 3) пользователи могут столкнуться с критической ошибкой при попытке рассчитать или распечатать Больничный лист с причиной нетрудоспособности «Несчастный случай на производстве» или «Профзаболевание». Ошибка сопровождается системным сообщением: «Преобразование значения к типу Число не может быть выполнено».

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

Анализ причины возникновения ошибки

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

Итог = Итог + ПараметрыРасчета.ПредельныеВеличиныПоГодам.Получить(Год);

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

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

Подключение отладчика для диагностики фоновых заданий

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

  1. Откройте конфигуратор и перейдите в меню Отладка — Настройка отладки.
  2. Убедитесь, что установлены флажки для отладки на сервере.
  3. Перейдите в меню Отладка — Подключение.
  4. В открывшемся окне нажмите кнопку Автоматическое подключение.
  5. Установите флажок напротив пункта Фоновые задания.

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

Способ 1: Официальное решение (Патчи и обновления)

Данная проблема официально признана фирмой 1С (зарегистрирована под номером 70058190). Если у вас есть доступ к обновлениям, это самый правильный путь решения.

Проанализируем доступные варианты исправления:

  1. Установка патча: Проверьте наличие патча EF_70058190 через раздел Администрирование — Обслуживание — Обновление программы — Установленные исправления (патчи). Если патч доступен для вашей версии, программа предложит его установить автоматически.
  2. Обновление конфигурации: Ошибка исправлена в следующих версиях ЗУП 3.1:
    • 3.1.27.90 и выше
    • 3.1.23.833 и выше

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

Если возможность немедленного обновления отсутствует, мы можем внести исправление в код самостоятельно. Нам необходимо гарантировать, что вместо Неопределено в расчет будет передано число (0).

Рассмотрим пример корректировки в функции МаксимальныйСреднедневнойЗаработокДляОплатыПособияПоМатеринству (которая часто вызывается и при других расчетах пособий) или непосредственно в месте суммирования лимитов.

Найдем цикл обхода годов и добавим проверку на заполненность значения:


Для каждого РасчетныйГод Из ГодыПредельныхВеличин Цикл 
    ПредельнаяВеличина = ПараметрыРасчета.ПредельныеВеличиныПоГодам.Получить(РасчетныйГод);
    
    // Добавляем проверку, чтобы избежать ошибки преобразования
    Если ЗначениеЗаполнено(ПредельнаяВеличина) Тогда   
        СуммаОграничений = СуммаОграничений + ПредельнаяВеличина;
    Иначе
        // Если значение не найдено, считаем его равным 0
        СуммаОграничений = СуммаОграничений + 0;
    КонецЕсли;
КонецЦикла;

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


Функция СреднийДневнойЗаработокФСС(ПараметрыРасчета) Экспорт
    // Формируем структуру предельных величин в любом случае
    ГодыПредельныхВеличин = УчетПособийСоциальногоСтрахованияКлиентСервер.ГодыПредельныхВеличин(ПараметрыРасчета);
    ПараметрыРасчета.ПредельныеВеличиныПоГодам = ПредельнаяВеличинаБазыСтраховыхВзносов(ГодыПредельныхВеличин);
    
    Возврат УчетПособийСоциальногоСтрахованияКлиентСервер.СреднийЗаработокФСС(ПараметрыРасчета);
КонецФункции

Проблема при печати расчетных листков и справок

Часто после исправления ошибки в самом документе Больничный лист, она продолжает возникать при попытке сформировать печатную форму «Расчет пособия к листку нетрудоспособности». Это происходит потому, что при печати запускается отдельный механизм формирования данных, который заново выполняет расчетные процедуры.

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

Рекомендации по заполнению данных

Помимо правок кода, рекомендуем проверить актуальность классификаторов в программе. Рассмотрим шаги для проверки:

  1. Перейдите в раздел Настройки — Редактирование законодательных значений.
  2. Проверьте раздел Предельная величина базы страховых взносов.
  3. Убедитесь, что за расчетные годы (текущий и два предыдущих) суммы лимитов установлены корректно.

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

Подведем итог: наиболее стабильным решением является установка патча EF_70058190, так как он комплексно решает проблему во всех затронутых модулях, включая печатные формы, не требуя снятия конфигурации с поддержки.

← На главную