При работе в конфигурации 1С:Зарплата и управление персоналом 3.1 (ЗУП) технические специалисты и расчетчики часто сталкиваются с ситуацией, когда значение периодического показателя в документе «Начисление зарплаты и взносов» определяется неверно. Например, сотрудник в течение месяца перемещается между подразделениями, и в одном из них ему положена доплата, а в другом — нет. Однако система упорно применяет одно и то же значение (часто максимальное или последнее введенное) ко всем периодам месяца, игнорируя кадровые изменения.
В этой статье мы подробно разберем, почему так происходит, изучим внутренние механизмы платформы 1С и выясним, как исправить логику работы интервальных регистров, чтобы расчет стал корректным.
Рассмотрим конкретную ситуацию. В системе настроено начисление «Доплата за работу в ночное время». Для расчета используется сложная формула, учитывающая стандартный процент доплаты и дополнительный показатель, который зависит от подразделения:
(СтоимостьЧаса / 100 * (ПроцентДоплатыЗаРаботуВНочноеВремя + ПроцентДоплатыЗаРаботуВНочноеВремяДополнительно)) * ВремяВЧасах
Предположим, в течение июля у сотрудника меняется подразделение:
По логике вещей, программа должна рассчитать три строки. Однако на практике мы часто видим, что во всех трех периодах система устанавливает значение показателя равным 60. Давайте разберемся, в чем кроется причина такого поведения.
Для ускорения расчетов в современных версиях ЗУП 3.1 (начиная с ветки 3.1.14) используются специализированные интервальные регистры сведений. Одним из ключевых является регистр Значения периодических показателей расчета зарплаты сотрудников (интервальный).
Проанализируем ситуацию с технической точки зрения. Когда мы проводим документ «Кадровый перевод» или «Изменение оплаты труда», данные попадают в обычные регистры сведений, а затем система автоматически генерирует записи в интервальных регистрах. В этих регистрах есть служебный флаг ПустойИнтервал.
Выясним важный нюанс: для системы 1С существует огромная разница между «Значение равно 0» и «Значение не задано».
Если в штатном расписании или при приеме сотрудника на работу данный показатель не был инициализирован (даже с нулевым значением), то при последующем кадровом переводе, где значение меняется на 60, система создает запись в интервальном регистре. Но для периодов, где значение должно быть 0, запись получает флаг ПустойИнтервал = Истина. При расчете зарплаты типовой запрос выбирает данные из этого регистра и отсекает записи с этим флагом. В результате алгоритм вытеснения интервалов видит «пустоту» и «растягивает» на нее последнее известное ненулевое значение.
Чтобы восстановить корректный расчет, нам необходимо убедиться, что у показателя есть «точка входа» в историю данных сотрудника. Рассмотрим алгоритм исправления ситуации.
Проанализируем настройки штатного расписания. Если вы ведете историю изменений штатного расписания, откройте документ «Утверждение штатного расписания» или «Изменение штатного расписания». Убедитесь, что для позиции, которую занимает сотрудник, данный показатель добавлен в список начислений или показателей, даже если его значение равно нулю. Если показателя там нет, система не считает его «назначенным», что и приводит к формированию пустого интервала при временных переводах.
Рассмотрим документы, которыми регистрировалось начало работы сотрудника. Если это «Начальная штатная расстановка» или «Прием на работу», проверьте вкладку с показателями. Попробуйте выполнить следующие действия:
Если кадровые переводы не помогают «разорвать» некорректный интервал, проанализируем возможность использования документа «Изменение оплаты труда». В отличие от кадрового перевода, этот документ более жестко фиксирует набор показателей на определенную дату. Создайте документ на дату начала периода, где показатель должен быть равен 0, и явно укажите это значение. Затем создайте еще один документ на дату, когда значение должно стать 60.
Если стандартные действия не помогают, необходимо заглянуть «под капот» системы. Проанализируем состояние регистра Значения периодических показателей расчета зарплаты сотрудников (интервальный). Сделать это можно через меню «Функции для технического специалиста» (ранее «Все функции»).
Если мы видим, что записи в регистре все еще содержат ПустойИнтервал = Истина для периодов, где должен быть 0, это означает, что цепочка документов нарушена. В ЗУП 3.1 существует скрытая обработка «Заполнение интервальных регистров». Она позволяет принудительно пересчитать данные в интервальных таблицах на основе первичных записей. Запуск этой обработки часто устраняет программные ошибки, когда интервалы «залипают» после множественных правок документов «задним числом».
Проанализируем ситуацию, когда в базе присутствуют расширения. Даже если доработка кажется незначительной (например, добавляет реквизит в документ «Данные для расчета зарплаты»), она может косвенно влиять на механизм записи в регистры сведений. Для чистоты эксперимента выполните следующие действия:
Если после отключения расширения расчет стал верным, значит, в коде расширения есть перехватчики (ПередЗаписью или ПриЗаписи), которые нарушают логику формирования интервалов.
Чтобы окончательно убедиться в причине ошибки, мы можем воспользоваться консолью запросов. Проанализируем типовой запрос, который использует система при расчете. Обратите внимание на условие выборки из интервального регистра:
ВЫБРАТЬ
ИнтервальныйРегистр.Сотрудник,
ИнтервальныйРегистр.Значение,
ИнтервальныйРегистр.ДатаНачала,
ИнтервальныйРегистр.ДатаОкончания
ИЗ
РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный КАК ИнтервальныйРегистр
ГДЕ
ИнтервальныйРегистр.Сотрудник = &Сотрудник
И НЕ ИнтервальныйРегистр.ПустойИнтервал
Как мы видим, условие НЕ ИнтервальныйРегистр.ПустойИнтервал является ключевым. Если запись помечена как пустая, она просто не попадет в выборку, и расчетный механизм возьмет значение из предыдущего или соседнего интервала, что и приводит к появлению числа 60 там, где должен быть 0.
Подведем итог. Чтобы расчет в 1С:ЗУП 3.1 корректно «видел» нулевые значения показателя, необходимо:
Такой системный подход гарантирует, что каждый день работы сотрудника будет оплачен в точном соответствии с его кадровыми перемещениями и установленными значениями показателей.