После обновления конфигурации 1С:Управление производственным предприятием (УПП) с версии 1.3.241.1 до 1.3.242.3, а также в версии 1.3.243.1, многие пользователи столкнулись с критической ошибкой при попытке провести документы "НачислениеЗарплатыРаботникамОрганизаций". Эта проблема препятствует корректному расчету и выплате заработной платы, что делает невозможным дальнейшую работу с системой и сдачу отчетности. В данном материале мы подробно разберем симптомы этой ошибки, выясним ее причину, предложим пошаговое решение путем ручной корректировки кода, а также укажем версию, в которой разработчики 1С официально исправили данную проблему.
Основным проявлением проблемы является невозможность проведения большинства документов "НачислениеЗарплатыРаботникамОрганизаций". При попытке провести документ, как новые, так и уже существующие, система выдает сообщение об ошибке следующего содержания:
{Документ.НачислениеЗарплатыРаботникамОрганизаций.МодульОбъекта(15043)}: ЗаполнитьЗначенияСвойств(СтруктураНДФЛКЗачету,ВыборкаПоНДФЛКЗачету);
по причине:
Недопустимое значение параметра (параметр номер '1')
Это сообщение указывает на то, что в строке 15043 (номер строки может незначительно отличаться в разных релизах, но суть ошибки остается той же) модуля объекта документа НачислениеЗарплатыРаботникамОрганизаций функция ЗаполнитьЗначенияСвойств() была вызвана с некорректным первым параметром. В нашем случае, этим параметром является переменная СтруктураНДФЛКЗачету.
Когда мы сталкиваемся с подобной ошибкой, первым шагом всегда является использование отладчика. Давайте разберем, как мы можем провести диагностику:
НачислениеЗарплатыРаботникамОрганизаций. Установим точку останова непосредственно на строке, указанной в сообщении об ошибке: ЗаполнитьЗначенияСвойств(СтруктураНДФЛКЗачету,ВыборкаПоНДФЛКЗачету);.СтруктураНДФЛКЗачету. Мы обнаружим, что ее значение равно Неопределено. Это критически важная информация, так как функция ЗаполнитьЗначенияСвойств() ожидает в качестве первого параметра объект типа Структура (или Соответствие), а не Неопределено. Именно это и вызывает ошибку "Недопустимое значение параметра".После того как мы выяснили, что переменная СтруктураНДФЛКЗачету принимает значение Неопределено, нашей задачей становится понять, почему она не была корректно инициализирована. Внимательное изучение кода вокруг строки 15043 позволяет нам выявить следующую логическую ошибку, допущенную разработчиками в данных релизах:
Переменная СтруктураНДФЛКЗачету должна быть инициализирована как новая структура со списком необходимых полей перед использованием в функции ЗаполнитьЗначенияСвойств(). Строка инициализации выглядит так:
СтруктураНДФЛКЗачету = Новый Структура("НДФЛКЗачетуУчтено,НДФЛСПревышенияКЗачетуУчтено,НДФЛСПревышенияКЗачетуУчтено18,НДФЛСПревышенияКЗачетуУчтено20,НДФЛСПревышенияКЗачетуУчтено22");
Однако в проблемных версиях эта строка располагалась вне цикла, который обрабатывает данные по физическим лицам. В частности, она находилась до цикла Пока ВыборкаПоНДФЛуд.СледующийПоЗначениюПоля("ФизЛицо") Цикл. Если при определенных условиях (например, для конкретного сотрудника отсутствуют данные, влияющие на расчет НДФЛ, или логика выборки приводит к тому, что цикл не выполняется для первой итерации или не срабатывает инициализация), этот участок кода, инициализирующий структуру, мог быть пропущен, или же переменная могла быть объявлена, но не присвоена, оставаясь в состоянии Неопределено. Когда затем предпринималась попытка использовать эту "неопределенную" переменную в функции ЗаполнитьЗначенияСвойств(), возникала ошибка.
Самым быстрым и эффективным способом устранения этой ошибки до выхода официального патча является ручная корректировка кода в модуле объекта документа. Этот подход требует внесения изменений в конфигурацию, поэтому перед началом работ обязательно создайте резервную копию вашей информационной базы.
Конфигурация УПП, как правило, находится на поддержке. Чтобы внести изменения в модуль объекта документа, нам необходимо временно снять его с поддержки или отредактировать с сохранением возможности обновления:
Теперь, когда модуль открыт для редактирования, приступим к изменению кода:
НачислениеЗарплатыРаботникамОрганизаций найдем строку, содержащую вызов функции ЗаполнитьЗначенияСвойств(СтруктураНДФЛКЗачету,ВыборкаПоНДФЛКЗачету);. Она находится примерно на строке 15043, но лучше ориентироваться по тексту.СтруктураНДФЛКЗачету. Искомая строка выглядит так:
СтруктураНДФЛКЗачету = Новый Структура("НДФЛКЗачетуУчтено,НДФЛСПревышенияКЗачетуУчтено,НДФЛСПревышенияКЗачетуУчтено18,НДФЛСПревышенияКЗачетуУчтено20,НДФЛСПревышенияКЗачетуУчтено22");
Пока ВыборкаПоНДФЛуд.СледующийПоЗначениюПоля("ФизЛицо") Цикл
СтруктураНДФЛКЗачету, которая находится перед циклом, и вставить ее внутрь этого цикла, сразу после строки Пока ВыборкаПоНДФЛуд.СледующийПоЗначениюПоля("ФизЛицо") Цикл.Пример кода до изменений (упрощенно):
// ... какой-то код перед циклом ...
// Строка, которая вызывает ошибку, если цикл не выполняется или пропускает инициализацию
СтруктураНДФЛКЗачету = Новый Структура("НДФЛКЗачетуУчтено,НДФЛСПревышенияКЗачетуУчтено,НДФЛСПревышенияКЗачетуУчтено18,НДФЛСПревышенияКЗачетуУчтено20,НДФЛСПревышенияКЗачетуУчтено22");
Пока ВыборкаПоНДФЛуд.СледующийПоЗначениюПоля("ФизЛицо") Цикл
// ... другой код внутри цикла ...
// Здесь СтруктураНДФЛКЗачету уже должна быть инициализирована
ЗаполнитьЗначенияСвойств(СтруктураНДФЛКЗачету, ВыборкаПоНДФЛКЗачету);
// ...
КонецЦикла;
// ...
Пример кода после изменений:
// ... какой-то код перед циклом ...
Пока ВыборкаПоНДФЛуд.СледующийПоЗначениюПоля("ФизЛицо") Цикл
// Инициализация структуры перенесена сюда,
// чтобы она гарантированно создавалась для каждого физлица в цикле
СтруктураНДФЛКЗачету = Новый Структура("НДФЛКЗачетуУчтено,НДФЛСПревышенияКЗачетуУчтено,НДФЛСПревышенияКЗачетуУчтено18,НДФЛСПревышенияКЗачетуУчтено20,НДФЛСПревышенияКЗачетуУчтено22");
// ... другой код внутри цикла ...
// Теперь СтруктураНДФЛКЗачету гарантированно будет структурой
ЗаполнитьЗначенияСвойств(СтруктураНДФЛКЗачету, ВыборкаПоНДФЛКЗачету);
// ...
КонецЦикла;
// ...
После внесения этих изменений, сохраните модуль объекта и обновите конфигурацию базы данных (меню "Конфигурация" -> "Обновить конфигурацию базы данных"). Теперь документы "НачислениеЗарплатыРаботникамОрганизаций" должны проводиться без ошибок.
Разработчики фирмы "1С" были проинформированы об этой ошибке. Как показали обсуждения на форумах и ответы службы поддержки, проблема была признана и устранена в последующих версиях конфигурации.
Официальное исправление данной ошибки появилось в версии УПП 1.3.244.1. Пользователи, которые обновили свою конфигурацию до этой версии, подтверждают, что проблема с проведением документов "НачислениеЗарплатыРаботникамОрганизаций" была решена, и ручная корректировка кода больше не требуется.
Даже после исправления основной ошибки, будь то ручная корректировка или обновление до версии 1.3.244.1, рекомендуем выполнить следующие дополнительные проверки:
Мы подробно рассмотрели проблему с ошибкой "Недопустимое значение параметра" в документе "НачислениеЗарплатыРаботникамОрганизаций", которая возникла после обновления УПП до версий 1.3.242.3 и 1.3.243.1. Выяснили, что причиной является некорректное расположение строки инициализации структуры СтруктураНДФЛКЗачету, что приводит к ее значению Неопределено при вызове функции ЗаполнитьЗначенияСвойств(). Мы предоставили детальную инструкцию по ручному исправлению этой ошибки и подтвердили, что официальное решение доступно в версии 1.3.244.1. Всегда помните о важности резервного копирования и тестирования изменений в копии базы данных.