При обновлении устаревающих, но все еще активно используемых конфигураций на платформе 1С:Предприятие пользователи и администраторы баз данных иногда сталкиваются с неожиданными критическими ошибками. Ярким примером является ситуация, возникшая после релиза обновления 2.0.66.111 для конфигурации «Бухгалтерия предприятия», редакция 2.0 (БП 2.0). При попытке провести документ Списание с расчетного счета (особенно при выплате заработной платы или перечислении налогов) система аварийно завершает работу, выдавая сообщение об ошибке в модуле менеджера регистра накопления НДФЛРасчетыСБюджетом.
В данной статье мы подробно разберем, почему возникает эта ошибка, проанализируем её технические причины, связанные с переносом кода из других конфигураций, и рассмотрим два практических способа решения проблемы: официальный (путем обновления конфигурации) и временный ручной (путем редактирования кода в конфигураторе).
Для начала проанализируем текст сообщения об ошибке, которое выводится на экран пользователя:
«Ошибка при выполнении обработчика - 'ПередЗаписью' по причине: {РегистрНакопления.НДФЛРасчетыСБюджетом.МодульМенеджера(27)}: Поле объекта не обнаружено (УчетнаяПолитикаПоНДФЛ)»
Давайте обратимся к конфигуратору и посмотрим, в каком месте кода происходит сбой. Проблемный участок находится в общем модуле или модуле менеджера регистра накопления НДФЛРасчетыСБюджетом:
Если ДобавлятьКарантинныеДни Тогда
СчитатьНерабочиеДниКарантинаРабочими = Новый Структура("ИгнорироватьДниС30МартаПо3Апреля, ИгнорироватьДниС4По30Апреля, ИгнорироватьДниС6По8Мая", Ложь, Ложь, Ложь);
ЗаполнитьЗначенияСвойств(СчитатьНерабочиеДниКарантинаРабочими, РегистрыСведений.УчетнаяПолитикаПоНДФЛ.Получить('20200101', Новый Структура("Организация", Организация)));
ВсеДни = РегистрыСведений.РегламентированныйПроизводственныйКалендарь.ДополнительныеНерабочиеДни;
// ... дальнейший код
КонецЕсли;
Рассмотрим подробнее данный фрагмент кода. Ошибка возникает на строке обращения к регистру сведений УчетнаяПолитикаПоНДФЛ. Но почему это происходит? Дело в том, что в конфигурации «Бухгалтерия предприятия 2.0» физически отсутствует регистр сведений с именем УчетнаяПолитикаПоНДФЛ. Все настройки, связанные с учетной политикой организаций по расчетам с персоналом и налогообложению, в этой старой редакции хранятся в общем регистре сведений УчетнаяПолитикаОрганизаций.
Разработчики фирмы 1С при подготовке антикризисного пакета обновлений в 2020 году (связанного с переносом сроков уплаты НДФЛ из-за карантинных нерабочих дней) скопировали программный код («копипаст») из более современной конфигурации «Бухгалтерия предприятия 3.0» (БП 3.0) или «Зарплата и управление персоналом 3» (ЗУП 3), где данный регистр существует. В результате этой невнимательности типовой релиз БП 2.0.66.111 вышел с синтаксической и логической ошибкой, которая делает невозможным проведение любых платежных документов, формирующих движения по НДФЛ.
Поскольку ошибка носила массовый характер и затрагивала абсолютно всех пользователей БП 2.0, фирма 1С оперативно зарегистрировала баг под номером 30173565. Практически сразу был выпущен исправленный релиз конфигурации.
Для полного и корректного устранения проблемы выполним следующие шаги:
.dt или копирование файла 1Cv8.1CD в безопасное место). Это обязательное правило перед любым обновлением!УчетнаяПолитикаОрганизаций) и исправили обращение к свойствам.F7) и запустим сеанс в режиме «Предприятие». Проверим проведение документа Списание с расчетного счета — ошибка должна исчезнуть.Бывают ситуации, когда конфигурация базы данных находится на доработке, сильно кастомизирована, снята с поддержки или у вас нет возможности оперативно установить релиз 2.0.66.112. В таком случае мы можем внести точечное изменение в код, чтобы восстановить работоспособность системы прямо сейчас.
Выясним логику работы проблемного участка: условие Если ДобавлятьКарантинныеДни Тогда проверяет необходимость расчета сдвигов сроков уплаты НДФЛ по карантинным нерабочим дням 2020 года. Если ваша организация в этот период работала в штатном режиме или вам не требуется данный расчет по особым правилам переноса сроков, эту ветку алгоритма можно безопасно отключить.
Проанализируем шаги по ручной корректировке кода:
ДобавлятьКарантинныеДни).Ложь. Заменим исходную строку:
Если ДобавлятьКарантинныеДни Тогда
на следующий вариант кода:
Если Ложь Тогда // Временная заглушка ошибки релиза 2.0.66.111
Если до КонецЕсли включительно), используя символы // в начале каждой строки:
// Если ДобавлятьКарантинныеДни Тогда
// СчитатьНерабочиеДниКарантинаРабочими = Новый Структура("ИгнорироватьДниС30МартаПо3Апреля...", Ложь...);
// ...
// КонецЕсли;
После выполнения этих манипуляций проведение банковских документов возобновится в штатном режиме. Как только у вас появится возможность полноценно обновить конфигурацию до релиза 2.0.66.112 или более нового, обязательно сделайте это. При обновлении типовые объекты автоматически вернутся на стандартную поддержку 1С, а ручные исправления будут заменены корректным заводским кодом.