При настройке новых видов начислений в программе 1С:Зарплата и управление персоналом 3.1 пользователи и администраторы иногда сталкиваются с ситуацией, когда визуально правильная формула приводит к аварийному завершению работы программы или выдает системную ошибку при попытке её проверки или записи. Рассмотрим одну из самых специфических ошибок, возникающих на уровне программного кода общего модуля, и разберем, как правильно выстроить логику расчета, чтобы избежать проблем в будущем.
Разберем ситуацию, когда при сохранении формулы или её проверке система выдает следующее сообщение:
{ОбщийМодуль.РасчетЗарплатыРасширенныйФормы.Модуль(3642)}: Поле объекта не обнаружено (Показатель2)
СтрокаПриемник["Показатель" + Сч] = Показатель.Показатель;
Проанализируем, что происходит в этот момент внутри системы. Программа считывает текст формулы и пытается «разобрать» её на составляющие части — показатели. Для каждого найденного в формуле показателя (например, Оклад, Секретность, ПроцентНадбавки) система создает колонку в динамической структуре данных (таблице или строке-приемнике), присваивая им внутренние имена: Показатель1, Показатель2, Показатель3 и так далее.
Ошибка «Поле объекта не обнаружено (Показатель2)» означает, что алгоритм парсинга формулы определил наличие второго показателя, но когда дело дошло до обращения к свойствам этого объекта в коде, структура СтрокаПриемник не смогла предоставить доступ к этому полю. Выясним причину: чаще всего это происходит из-за нарушения ссылочной целостности или наличия дублей показателей в справочнике Показатели расчета зарплаты.
Рассмотрим наиболее вероятный сценарий. Если информационная база была получена путем переноса данных из версии 2.5 или в результате некорректного объединения конфигураций, в справочнике показателей могут появиться два элемента с одинаковыми именами или идентификаторами. Например, может существовать системный (предопределенный) показатель Оклад и его «двойник», созданный пользователем или при переносе.
Проанализируем алгоритм исправления этой проблемы:
Посмотрим на формулу, которую пытался реализовать автор вопроса: (Оклад + Оклад * Секретность). На первый взгляд она логична, но с точки зрения методологии 1С:ЗУП 3.1 она является «опрометчивой хотелкой».
Выясним, почему прямое использование показателя Оклад в произвольных формулах может привести к неверным результатам:
Оклад в формуле может подтянуть либо значение на начало месяца, либо на конец, либо вызвать конфликт при попытке системы усреднить это значение.Для корректного расчета надбавок, которые зависят от оклада или совокупности начислений (ФОТ), в программе предусмотрен специальный механизм — РасчетнаяБаза. Разберем по шагам, как настроить начисление правильно:
РасчетнаяБаза * ПроцентСекретности / 100 (или иную логику, использующую базу).Оплата по окладу, Оплата по окладу (по часам) и другие начисления, которые составляют основу для расчета.Преимущество этого метода в том, что система 1С:ЗУП автоматически рассчитает базу с учетом всех кадровых перестановок, вытеснений (больничных, отпусков) и пересчетов. Если оклад изменился 10-го числа, РасчетнаяБаза сама соберет суммы по двум разным периодам действия оклада и предоставит в формулу корректный итог.
Если после устранения дублей и корректировки формулы ошибка Поле объекта не обнаружено (Показатель2) сохраняется, проанализируем состояние кэша и целостность базы данных.
Очистка кэша:
Часто формы настроек «запоминают» ошибочные связи показателей. Рекомендуем удалить базу из списка запуска и добавить её заново или запустить 1С с параметром /ClearCache. Это заставит систему перестроить динамические формы расчета зарплаты.
Тестирование и исправление: В некоторых случаях проблема кроется в «битых» ссылках в таблицах расчета. Выполним следующие действия в Конфигураторе:
Подводя итог, отметим, что стабильная работа формул в ЗУП 3.1 зависит от чистоты справочника показателей и соблюдения методики использования расчетной базы. Использование конструкции РасчетнаяБаза вместо прямого указания Оклад — это не просто рекомендация, а стандарт разработки, гарантирующий точность начислений в любых кадровых ситуациях. Если же вы столкнулись с программной ошибкой в общем модуле, первым делом проверьте базу на наличие дублей предопределенных элементов.