При работе в программе 1С:Зарплата и управление персоналом 8 (редакция 3) пользователи могут столкнуться с критической ошибкой при попытке рассчитать или распечатать Больничный лист с причиной нетрудоспособности «Несчастный случай на производстве» или «Профзаболевание». Ошибка сопровождается системным сообщением: «Преобразование значения к типу Число не может быть выполнено».
В этой статье мы подробно разберем причины возникновения данной проблемы, проанализируем программный код, вызывающий сбой, и рассмотрим несколько вариантов решения: от официальных патчей до самостоятельной правки конфигурации.
Проблема локализована в общем модуле УчетПособийСоциальногоСтрахованияКлиентСервер. При расчете среднего заработка программа обращается к коллекции предельных величин базы страховых взносов по годам. Рассмотрим строку кода, на которой происходит остановка:
Итог = Итог + ПараметрыРасчета.ПредельныеВеличиныПоГодам.Получить(Год);
Метод Получить(Год) ищет в соответствии значение лимита для конкретного расчетного года. Если по какой-то причине (например, замена лет или специфика расчета пособия по несчастному случаю) данные за этот год не были проинициализированы, метод возвращает значение Неопределено. В языке 1С попытка сложения числа с типом Неопределено невозможна и приводит к аварийному завершению операции.
Особенно часто это проявляется при расчете несчастных случаев (НС), так как алгоритм их расчета отличается от обычных заболеваний. Для НС не применяется ограничение по предельной базе ФСС за год, а используется ограничение максимальным размером ежемесячной страховой выплаты, умноженным на четыре. Однако программный код в некоторых релизах ошибочно пытается проверить и стандартные лимиты.
Если вы пытаетесь найти место ошибки в конфигураторе, важно помнить, что расчет и печать форм часто выполняются в фоновых заданиях. Рассмотрим, как правильно настроить отладку:
Только после этого отладчик сможет остановиться на строке с ошибкой ВызватьИсключение в модулях длительных операций, что позволит вам увидеть реальный текст ошибки, передаваемый с сервера.
Данная проблема официально признана фирмой 1С (зарегистрирована под номером 70058190). Если у вас есть доступ к обновлениям, это самый правильный путь решения.
Проанализируем доступные варианты исправления:
EF_70058190 через раздел Администрирование — Обслуживание — Обновление программы — Установленные исправления (патчи). Если патч доступен для вашей версии, программа предложит его установить автоматически.Если возможность немедленного обновления отсутствует, мы можем внести исправление в код самостоятельно. Нам необходимо гарантировать, что вместо Неопределено в расчет будет передано число (0).
Рассмотрим пример корректировки в функции МаксимальныйСреднедневнойЗаработокДляОплатыПособияПоМатеринству (которая часто вызывается и при других расчетах пособий) или непосредственно в месте суммирования лимитов.
Найдем цикл обхода годов и добавим проверку на заполненность значения:
Для каждого РасчетныйГод Из ГодыПредельныхВеличин Цикл
ПредельнаяВеличина = ПараметрыРасчета.ПредельныеВеличиныПоГодам.Получить(РасчетныйГод);
// Добавляем проверку, чтобы избежать ошибки преобразования
Если ЗначениеЗаполнено(ПредельнаяВеличина) Тогда
СуммаОграничений = СуммаОграничений + ПредельнаяВеличина;
Иначе
// Если значение не найдено, считаем его равным 0
СуммаОграничений = СуммаОграничений + 0;
КонецЕсли;
КонецЦикла;
Аналогичную правку стоит внести в функцию СреднийДневнойЗаработокФСС в общем модуле УчетПособийСоциальногоСтрахования. Проанализируем ситуацию: если флаг ПрименятьПредельнуюВеличину установлен в Ложь (что характерно для несчастных случаев), программа может пропустить инициализацию коллекции предельных величин. Чтобы этого избежать, можно принудительно вызывать инициализацию данных параметров, даже если ограничения базы не применяются.
Функция СреднийДневнойЗаработокФСС(ПараметрыРасчета) Экспорт
// Формируем структуру предельных величин в любом случае
ГодыПредельныхВеличин = УчетПособийСоциальногоСтрахованияКлиентСервер.ГодыПредельныхВеличин(ПараметрыРасчета);
ПараметрыРасчета.ПредельныеВеличиныПоГодам = ПредельнаяВеличинаБазыСтраховыхВзносов(ГодыПредельныхВеличин);
Возврат УчетПособийСоциальногоСтрахованияКлиентСервер.СреднийЗаработокФСС(ПараметрыРасчета);
КонецФункции
Часто после исправления ошибки в самом документе Больничный лист, она продолжает возникать при попытке сформировать печатную форму «Расчет пособия к листку нетрудоспособности». Это происходит потому, что при печати запускается отдельный механизм формирования данных, который заново выполняет расчетные процедуры.
Выясним причину: модуль управления печатью вызывает фоновое задание, которое обращается к тем же общим модулям УчетПособийСоциальногоСтрахования. Если вы внесли исправления только локально в форму документа, печать работать не будет. Важно вносить правки именно в общие модули, чтобы изменения затронули все механизмы системы.
Помимо правок кода, рекомендуем проверить актуальность классификаторов в программе. Рассмотрим шаги для проверки:
Иногда ошибка «исчезает» сама собой после ручного перезаполнения данных о заработке в табличной части среднего заработка документа Больничный лист, так как это инициирует обновление структуры ПараметрыРасчета и может подтянуть недостающие ключи в коллекцию предельных величин.
Подведем итог: наиболее стабильным решением является установка патча EF_70058190, так как он комплексно решает проблему во всех затронутых модулях, включая печатные формы, не требуя снятия конфигурации с поддержки.