При расчете отпусков, больничных листов или других межрасчетных документов в программе 1С:Зарплата и управление персоналом 3 (КОРП/ПРОФ) пользователи иногда сталкиваются с неожиданным аварийным завершением работы программы. На экран выводится системное сообщение об ошибке следующего вида:
{ОбщийМодуль.ИсправлениеДокументовРасчетЗарплаты.Модуль(711)}: Поле объекта не обнаружено (Показатель7) НовыйПерерасчет["Показатель" + НомерПоказателя] = Выборка.Показатель;
Индекс показателя в тексте ошибки может отличаться — часто фигурирует Показатель7, Показатель10 и так далее. Давайте подробно разберем, почему возникает этот сбой, проанализируем внутренние механизмы работы платформы и рассмотрим по шагам все возможные способы решения данной проблемы.
---
Это самая распространенная причина сбоя, которая особенно часто проявляется в информационных базах, куда данные переносились из старых версий (например, 1С:Зарплата и Кадры 7.7 или 1С:ЗУП 2.5), либо создавались программно с помощью сторонних обработок загрузки.
Давайте разберем внутреннюю логику конфигурации. В 1С:ЗУП 3 регистр расчета Начисления связан с регистром сведений ЗначенияПоказателейНачислений с помощью уникального служебного реквизита ИдентификаторСтроки. Этот реквизит представляет собой уникальный ключ связи (обычно это GUID или специальный числовой идентификатор), который сопоставляет конкретную строку начисленной зарплаты с набором показателей, использованных при ее расчете.
Когда вы рассчитываете отпуск в текущем периоде, система автоматически запускает механизмы проверки и перерасчета прошлых периодов (если были обнаружены какие-то изменения). При анализе прошлых периодов запрос программы пытается сопоставить начисления и показатели по ключу связи. Если при переносе данных из 7.7 реквизит ИдентификаторСтроки остался незаполненным или заполнился некорректно, связь между таблицами ломается. Программа «теряется» в цикле сопоставления строк, счетчик показателей сбивается, уходит далеко за пределы допустимого максимума и пытается записать значение в несуществующую колонку (например, Показатель7).
Как решить проблему:
Необходимо найти документы Перенос данных за прошлые периоды, которые попадают в расчетный период среднего заработка для отпуска или в период потенциального перерасчета, и заполнить в них поле ИдентификаторСтроки. Сделать это вручную в интерфейсе невозможно, так как это поле скрыто. Потребуется написать простую обработку. Рассмотрим пример кода на встроенном языке 1С, который может решить эту задачу:
// Пример программного исправления пустых идентификаторов в документах "Перенос данных"
Процедура ИсправитьИдентификаторыСтрок() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПереносДанных.Ссылка КАК Ссылка
|ИЗ
| Документ.ПереносДанных КАК ПереносДанных
|ГДЕ
| ПереносДанных.Проведен = ИСТИНА";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
Модифицирован = Ложь;
// Перебираем табличную часть "Начисления"
Для Каждого СтрокаНачисления Из ДокОбъект.Начисления Цикл
Если Не ЗначениеЗаполнено(СтрокаНачисления.ИдентификаторСтроки) Тогда
// Генерируем новый уникальный идентификатор строки
СтрокаНачисления.ИдентификаторСтроки = Новый УникальныйИдентификатор();
Модифицирован = Истина;
EndЕсли;
КонецЦикла;
// Записываем и проводим документ при наличии изменений
Если Модифицирован Тогда
Попытка
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Успешно исправлен документ: " + Строка(ДокОбъект));
Исключение
Сообщить("Ошибка записи документа " + Строка(ДокОбъект) + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
После запуска подобной обработки и восстановления связей в старых периодах расчет текущего отпуска пройдет без ошибок.
---
Если перенос данных не выполнялся, а ошибка все равно воспроизводится, проанализируем используемые формулы начислений. В платформе 1С и метаданных конфигурации ЗУП 3 заложено жесткое архитектурное ограничение: в документах и регистрах под хранение показателей выделено ровно 6 колонок (от Показатель1 до Показатель6).
Если продвинутый расчетчик или внедренец настроил сложную пользовательскую формулу расчета, в которой задействовано 7 и более показателей (например: ТарифнаяСтавка * ВремяВЧасах * Коэффициент1 * Коэффициент2 * Доплата1 * Доплата2 * КоэффициентРегиона), система при попытке рассчитать и записать такое начисление попытается обратиться к свойству Показатель7. Так как этого реквизита физически нет в метаданных, программа выдаст ошибку Поле объекта не обнаружено (Показатель7).
Как решить проблему:
---
Иногда ошибка возникает при попытке провести документы-исправления или при вводе вытесняющих документов (например, когда создается Больничный лист поверх ранее введенного документа Отсутствие (болезнь, прогул, неявка)).
Выясним причину этого поведения: если исходный документ отсутствия захватывал выходные дни сотрудника, а документ-исправление или больничный лист вводится строго на рабочие дни, алгоритмы сопоставления строк и распределения показателей в перерасчетах могут дать сбой. В результате система пытается перераспределить показатели старого периода, сбивается в цикле и пытается сослаться на несуществующий Показатель7.
Как решить проблему:
Проанализируем пересекающиеся периоды. Временным решением является корректировка дат в исходном документе отсутствия. Попробуем временно изменить дату начала или окончания в исходном документе «Отсутствие», чтобы исключить наложение периодов на выходные дни, провести документ расчета («Больничный лист» или «Отпуск»), а затем вернуть корректные даты обратно.
---
Если ошибка вызвана внутренним несовершенством новых механизмов оптимизации расчета (которые разработчики активно внедряли в версиях 3.1.9 и последующих), можно использовать специальный инструмент платформы, временно отключающий новые алгоритмы сопоставления.
Как решить проблему:
Выполнять расчет зарплаты без оптимизации.Установка этой константы заставляет программу использовать старые, более медленные, но проверенные и более устойчивые к ошибкам структуры данных алгоритмы расчета. Это позволяет успешно провести документ без изменения кода конфигурации или ручной правки регистров.
---
Мы подробно рассмотрели все известные причины возникновения ошибки Поле объекта не обнаружено (Показатель7) при расчете отпуска в 1С:ЗУП 3. В первую очередь рекомендуем проверить базу на наличие пустых значений ИдентификаторСтроки после переноса данных из 7.7. Если этот шаг не помог, проанализируйте сложность формул начислений и при необходимости используйте константу отключения оптимизации расчетов.