Как исправить ошибку «Поле объекта не обнаружено (Показатель7)» при расчете отпуска в 1С:ЗУП 3

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

При расчете отпусков, больничных листов или других межрасчетных документов в программе 1С:Зарплата и управление персоналом 3 (КОРП/ПРОФ) пользователи иногда сталкиваются с неожиданным аварийным завершением работы программы. На экран выводится системное сообщение об ошибке следующего вида:

{ОбщийМодуль.ИсправлениеДокументовРасчетЗарплаты.Модуль(711)}: Поле объекта не обнаружено (Показатель7) НовыйПерерасчет["Показатель" + НомерПоказателя] = Выборка.Показатель;

Индекс показателя в тексте ошибки может отличаться — часто фигурирует Показатель7, Показатель10 и так далее. Давайте подробно разберем, почему возникает этот сбой, проанализируем внутренние механизмы работы платформы и рассмотрим по шагам все возможные способы решения данной проблемы.

---

Причина 1: Пустой реквизит «ИдентификаторСтроки» при переносе данных

Это самая распространенная причина сбоя, которая особенно часто проявляется в информационных базах, куда данные переносились из старых версий (например, 1С:Зарплата и Кадры 7.7 или 1С:ЗУП 2.5), либо создавались программно с помощью сторонних обработок загрузки.

Давайте разберем внутреннюю логику конфигурации. В 1С:ЗУП 3 регистр расчета Начисления связан с регистром сведений ЗначенияПоказателейНачислений с помощью уникального служебного реквизита ИдентификаторСтроки. Этот реквизит представляет собой уникальный ключ связи (обычно это GUID или специальный числовой идентификатор), который сопоставляет конкретную строку начисленной зарплаты с набором показателей, использованных при ее расчете.

Когда вы рассчитываете отпуск в текущем периоде, система автоматически запускает механизмы проверки и перерасчета прошлых периодов (если были обнаружены какие-то изменения). При анализе прошлых периодов запрос программы пытается сопоставить начисления и показатели по ключу связи. Если при переносе данных из 7.7 реквизит ИдентификаторСтроки остался незаполненным или заполнился некорректно, связь между таблицами ломается. Программа «теряется» в цикле сопоставления строк, счетчик показателей сбивается, уходит далеко за пределы допустимого максимума и пытается записать значение в несуществующую колонку (например, Показатель7).

Как решить проблему:

Необходимо найти документы Перенос данных за прошлые периоды, которые попадают в расчетный период среднего заработка для отпуска или в период потенциального перерасчета, и заполнить в них поле ИдентификаторСтроки. Сделать это вручную в интерфейсе невозможно, так как это поле скрыто. Потребуется написать простую обработку. Рассмотрим пример кода на встроенном языке 1С, который может решить эту задачу:


// Пример программного исправления пустых идентификаторов в документах "Перенос данных"
Процедура ИсправитьИдентификаторыСтрок() Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ПереносДанных.Ссылка КАК Ссылка
        |ИЗ
        |	Документ.ПереносДанных КАК ПереносДанных
        |ГДЕ
        |	ПереносДанных.Проведен = ИСТИНА";
        
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
        Модифицирован = Ложь;
        
        // Перебираем табличную часть "Начисления"
        Для Каждого СтрокаНачисления Из ДокОбъект.Начисления Цикл
            Если Не ЗначениеЗаполнено(СтрокаНачисления.ИдентификаторСтроки) Тогда
                // Генерируем новый уникальный идентификатор строки
                СтрокаНачисления.ИдентификаторСтроки = Новый УникальныйИдентификатор();
                Модифицирован = Истина;
            EndЕсли;
        КонецЦикла;
        
        // Записываем и проводим документ при наличии изменений
        Если Модифицирован Тогда
            Попытка
                ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
                Сообщить("Успешно исправлен документ: " + Строка(ДокОбъект));
            Исключение
                Сообщить("Ошибка записи документа " + Строка(ДокОбъект) + ": " + ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

После запуска подобной обработки и восстановления связей в старых периодах расчет текущего отпуска пройдет без ошибок.

---

Причина 2: Жесткое ограничение платформы на количество показателей в формуле

Если перенос данных не выполнялся, а ошибка все равно воспроизводится, проанализируем используемые формулы начислений. В платформе 1С и метаданных конфигурации ЗУП 3 заложено жесткое архитектурное ограничение: в документах и регистрах под хранение показателей выделено ровно 6 колонок (от Показатель1 до Показатель6).

Если продвинутый расчетчик или внедренец настроил сложную пользовательскую формулу расчета, в которой задействовано 7 и более показателей (например: ТарифнаяСтавка * ВремяВЧасах * Коэффициент1 * Коэффициент2 * Доплата1 * Доплата2 * КоэффициентРегиона), система при попытке рассчитать и записать такое начисление попытается обратиться к свойству Показатель7. Так как этого реквизита физически нет в метаданных, программа выдаст ошибку Поле объекта не обнаружено (Показатель7).

Как решить проблему:

  1. Проанализируем формулы видов расчета, которые используются у сотрудника в текущем и прошлых месяцах.
  2. Если в какой-то из формул используется 7 или более показателей, эту формулу необходимо упростить.
  3. Для обхода ограничения разобьем расчет на два этапа:
    • Создадим вспомогательное начисление (например, с назначением «Доход в натуральной форме»), в котором предварительно рассчитаем часть показателей и зафиксируем промежуточный результат.
    • В основном начислении используем уже готовый результат вспомогательного начисления вместо индивидуальных показателей, тем самым уложившись в лимит до 6 показателей в одной формуле.

---

Причина 3: Наложение документов и некорректные периоды перерасчета

Иногда ошибка возникает при попытке провести документы-исправления или при вводе вытесняющих документов (например, когда создается Больничный лист поверх ранее введенного документа Отсутствие (болезнь, прогул, неявка)).

Выясним причину этого поведения: если исходный документ отсутствия захватывал выходные дни сотрудника, а документ-исправление или больничный лист вводится строго на рабочие дни, алгоритмы сопоставления строк и распределения показателей в перерасчетах могут дать сбой. В результате система пытается перераспределить показатели старого периода, сбивается в цикле и пытается сослаться на несуществующий Показатель7.

Как решить проблему:

Проанализируем пересекающиеся периоды. Временным решением является корректировка дат в исходном документе отсутствия. Попробуем временно изменить дату начала или окончания в исходном документе «Отсутствие», чтобы исключить наложение периодов на выходные дни, провести документ расчета («Больничный лист» или «Отпуск»), а затем вернуть корректные даты обратно.

---

Причина 4: Временный обход через настройки оптимизации расчета

Если ошибка вызвана внутренним несовершенством новых механизмов оптимизации расчета (которые разработчики активно внедряли в версиях 3.1.9 и последующих), можно использовать специальный инструмент платформы, временно отключающий новые алгоритмы сопоставления.

Как решить проблему:

  1. Перейдем в главное меню программы и откроем «Функции для технического специалиста» (в старых версиях этот пункт назывался «Все функции»).
  2. В открывшемся дереве объектов найдем раздел Константы.
  3. Найдем константу с именем Выполнять расчет зарплаты без оптимизации.
  4. Установим для этой константы значение Истина (поставим галочку).
  5. Попробуем снова заполнить и рассчитать проблемный документ отпуска.

Установка этой константы заставляет программу использовать старые, более медленные, но проверенные и более устойчивые к ошибкам структуры данных алгоритмы расчета. Это позволяет успешно провести документ без изменения кода конфигурации или ручной правки регистров.

---

Резюме

Мы подробно рассмотрели все известные причины возникновения ошибки Поле объекта не обнаружено (Показатель7) при расчете отпуска в 1С:ЗУП 3. В первую очередь рекомендуем проверить базу на наличие пустых значений ИдентификаторСтроки после переноса данных из 7.7. Если этот шаг не помог, проанализируйте сложность формул начислений и при необходимости используйте константу отключения оптимизации расчетов.

← На главную