При работе в программе 1С:Зарплата и управление персоналом (ЗУП) 3.1 пользователи нередко сталкиваются с критическим сбоем при заполнении или расчете документа НачислениеЗарплаты. Проблема проявляется в виде системного сообщения: «Преобразование значения к типу Булево не может быть выполнено». В этой ситуации расчет прерывается, и документ остается незаполненным. Давайте подробно разберем причины этой ошибки, способы ее локализации с помощью отладчика и методы окончательного решения.
Для начала проанализируем ситуацию. Ошибка «Преобразование значения к типу Булево...» в среде 1С:Предприятие практически всегда означает, что в коде программы используется логическая операция (например, Если...Тогда, И, ИЛИ, НЕ), но переменная, участвующая в этой операции, содержит не логическое значение Истина или Ложь, а что-то иное — чаще всего Неопределено или NULL.
В контексте последних релизов ЗУП (начиная с 3.1.30.х и 3.1.31.х) данная ошибка приобрела массовый характер. Рассмотрим подробнее техническую сторону. Ошибка локализуется в общем модуле УчетНДФЛ. Проанализируем конкретную строку кода, на которую указывает стек вызовов:
СтрокаДоход.ДоходДругойРасчет = Не СтрокаДоход.ДоходТекущегоРасчета Или СтрокаДоход.ДоходАванса;
В этой конструкции программа пытается вычислить значение для поля ДоходДругойРасчет. Если в данных сотрудника поле ДоходТекущегоРасчета или ДоходАванса не было инициализировано (равно NULL), платформа не может применить к нему оператор Не или Или, что и приводит к аварийному завершению работы.
Выясним причину, почему стандартное сообщение об ошибке иногда выглядит «укороченным» и не дает понимания, где именно произошел сбой. В современных конфигурациях расчет зарплаты часто выполняется в фоновом задании (длительная операция). Чтобы увидеть полный стек вызовов, выполним следующие действия:
НачислениеЗарплаты, в процедуре, где вызывается ВызватьИсключение.УчетНДФЛ или Обработка.МенеджерРасчетаЗарплаты.Посмотрим на пример информативного стека вызовов, который помогает точно определить виновника:
{ОбщийМодуль.УчетНДФЛ.Модуль(7783)}:СтрокаДоход.ДоходДругойРасчет = Не СтрокаДоход.ДоходТекущегоРасчета Или СтрокаДоход.ДоходАванса;
{Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(14411)}:НДФЛ = УчетНДФЛ.РассчитатьНалогПоОсновнойСтавке(...);
{ОбщийМодуль.РасчетЗарплатыРасширенный.Модуль(2247)}:МенеджерРасчета.РассчитатьЗарплату;
Если мы видим в стеке упоминание УчетНДФЛ.Модуль и операцию преобразования к Булево — мы нашли корень проблемы.
Часто техническая ошибка в коде провоцируется «грязными» данными в информационной базе. Разберем, какие именно данные могут приводить к возникновению NULL в таблицах НДФЛ:
Премия, Материальная помощь или Доход в натуральной форме. Если эти документы были созданы, но рассчитаны некорректно, они могут оставлять пустые поля в регистре сведений Данные о доходах для расчета НДФЛ (или внутренних временных таблицах менеджера расчета).Существует три основных пути решения данной проблемы, в зависимости от ваших возможностей доступа к конфигурации.
Фирма «1С» признала данную ошибку (код ошибки 70081395). Самый правильный и безопасный способ — проверить наличие патчей. Пройдем по шагам:
EF_70081395 (или аналогичный для вашего релиза). После его установки ошибка в модуле УчетНДФЛ будет устранена путем добавления проверки на пустые значения.Если конфигурация «на замке», а патч по какой-то причине недоступен, попробуем метод исключения:
НачислениеЗарплаты не по всей организации, а по отдельным подразделениям.Если у вас есть возможность вносить изменения в код (конфигурация снята с поддержки), мы можем самостоятельно обезопасить проблемный участок кода. Разберем пример исправления:
Вместо оригинальной строки:
СтрокаДоход.ДоходДругойРасчет = Не СтрокаДоход.ДоходТекущегоРасчета Или СтрокаДоход.ДоходАванса;
Напишем более отказоустойчивый вариант с использованием функции Булево() или явной проверкой на Истина:
ТекущийРасчет = ?(ТипЗнч(СтрокаДоход.ДоходТекущегоРасчета) = Тип("Булево"), СтрокаДоход.ДоходТекущегоРасчета, Ложь);
ДоходАванса = ?(ТипЗнч(СтрокаДоход.ДоходАванса) = Тип("Булево"), СтрокаДоход.ДоходАванса, Ложь);
СтрокаДоход.ДоходДругойРасчет = Не ТекущийРасчет Или ДоходАванса;
Этот код гарантирует, что даже если в данных окажется NULL, программа воспримет его как Ложь и продолжит выполнение без критической ошибки.
В процессе анализа темы вы могли заметить обсуждение функции КраткоеПредставлениеОшибки. Начиная с версии платформы 8.3.17, глобальный контекст рекомендует использовать объект ОбработкаОшибок. Однако, как показала практика (и сообщения на форумах), замена КраткоеПредставлениеОшибки(ИнформацияОбОшибке) на ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке) никак не влияет на саму ошибку преобразования к Булево. Это лишь изменение способа вывода текста сообщения. Сама проблема лежит глубже — в логике обработки данных НДФЛ, и исправлять нужно именно инициализацию переменных в модулях расчета.
Подведем итог: если вы столкнулись с этой ошибкой в ЗУП 3.1.30/31, первым делом проверьте наличие патча EF_70081395. Это решит проблему в 99% случаев без необходимости ручного вмешательства в код или мучительного поиска «битого» сотрудника.