Почему в ЗУП 3.1 смещаются периоды в регистрах и как правильно получать данные?

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

При разработке в конфигурации Зарплата и Управление Персоналом 3.1 многие разработчики сталкиваются с тем, что периоды записей в регистрах не совпадают с датой документа. Попытки «угадать» нужное время с помощью вычитания секунд или суток приводят к ошибкам в печатных формах и отчетах. Давайте разберемся, почему так происходит и как правильно получать данные, чтобы они были актуальными и корректными.

Суть проблемы «сдвига» периодов

Важно понимать, что ЗУП 3.1 — это сложная система, где время документа не всегда является моментом актуальности записи. Чтобы обеспечить правильный расчет вытесняющих начислений и приоритетов, платформа использует специфическую логику записи в регистры. Период записи может быть намеренно смещен, чтобы система могла корректно выстроить хронологию событий внутри одной секунды. Поэтому использование конструкции ДатаДокумента - 1 — это путь к ошибкам, так как вы не знаете, куда именно «втиснула» запись система.

Решение №1: Использование объекта Граница

Если вам нужно получить состояние данных на момент непосредственно перед проведением документа, не пытайтесь манипулировать секундами. Используйте стандартный механизм платформы — объект Граница. Он позволяет четко указать, включать ли текущий момент времени в выборку.

Рассмотрим пример правильного получения данных:


Момент = Новый МоментВремени(ДокументСсылка.Дата, ДокументСсылка);
ГраницаНаМомент = Новый Граница(Момент, ВидГраницы.Исключая);
// Теперь используем эту границу в запросе к виртуальным таблицам регистров

Используя ВидГраницы.Исключая, вы гарантированно получите данные «на вчера» относительно записи этого документа, избегая непредсказуемых сдвигов времени.

Решение №2: Использование публичного API

В ЗУП 3.1 категорически не рекомендуется обращаться к регистрам напрямую, минуя прикладные модули. Разработчики 1С предусмотрели специальные функции, которые инкапсулируют всю логику расчетов. Когда вам нужно узнать, например, текущие начисления сотрудника, используйте специализированные методы.

Разберем использование модуля КадровыйУчетРасширенный для получения актуальных данных:


// Первый вызов: получаем данные без учета текущего документа
РезультатБезДокумента = КадровыйУчетРасширенный.ТекущиеНачисленияСотрудника(Сотрудник, Дата, Неопределено);

// Второй вызов: получаем данные с учетом текущего документа (исключая его)
РезультатСДокументом = КадровыйУчетРасширенный.ТекущиеНачисленияСотрудника(Сотрудник, Дата, ДокументСсылка);

Этот подход избавляет вас от необходимости разбираться, куда и почему сместилась запись. Функция сама проанализирует контекст и вернет корректные значения.

Решение №3: Работа с регистрами плановых начислений

Аналогичная логика применима и к регистрам сведений. Если вам нужно получить данные до и после регистратора для анализа изменений, воспользуйтесь паттерном двойного вызова функций, аналогичных тем, что представлены в модуле РасчетЗарплатыРасширенный.

Проанализируем алгоритм:

  1. Выполняем первый запрос к данным, не передавая регистратор — так мы видим состояние системы «чистым», как если бы документа не было.
  2. Выполняем второй запрос, передавая в качестве параметра Регистратор текущий документ — система сама обработает свои внутренние приоритеты записей.
  3. Сравниваем полученные результаты, чтобы вычислить «дельту» (разницу) изменений.

Такой подход не «завалит СУБД», а напротив, обеспечит стабильность ваших доработок. Помните: ЗУП 3.1 — это система с высокой плотностью данных, и использование публичных методов — единственный способ гарантировать корректную работу печатных форм и отчетов.

Заключение: основные правила разработки

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

← На главную