При тестировании новых алгоритмов, исправлении исторических ошибок или программной обработке данных в 1С:Зарплата и Управление Персоналом 3.1 разработчики часто сталкиваются с необходимостью изменить записи в регистрах сведений ПлановыеНачисления и ПлановыеНачисленияИнтервальный. Однако система всячески сопротивляется прямому редактированию: при попытке открыть запись нас «выбрасывает» в документ-регистратор, а интервальный регистр и вовсе кажется заблокированным. Разберем по шагам, почему так происходит, выясним причину блокировок и проанализируем, как правильно вносить изменения в эти критически важные механизмы системы.
Для начала рассмотрим саму структуру регистра ПлановыеНачисления. Этот регистр сведений является подчиненным регистратору. Это означает, что записи в нем не существуют сами по себе — они жестко привязаны к документу, который их сформировал (например, «Прием на работу», «Кадровый перевод», «Изменение оплаты труда»).
Когда вы пытаетесь отредактировать строку прямо в списке регистра (нажав F2), платформа 1С автоматически открывает документ-регистратор, так как с точки зрения архитектуры системы изменять такие данные следует только путем перепроведения или редактирования исходного документа. Прямое изменение данных в списке для таких регистров недоступно.
Иногда при написании собственной обработки для корректировки набора записей регистра мы сталкиваемся с ошибкой записи или отказом в доступе. Даже если у пользователя установлены полные права, платформа может блокировать транзакцию. Выясним причину этой проблемы. Чаще всего блокировка вызвана механизмом Дата запрета редактирования.
Если вы пишете обработку, которая должна точечно исправить записи в закрытом периоде, вам потребуется обойти этот запрет программно. Рассмотрим, как это сделать с помощью свойства ОбменДанными.Загрузка:
НаборЗаписей = РегистрыСведений.ПлановыеНачисления.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
// Вносим необходимые изменения
Запись.Размер = НовыйРазмерНачисления;
КонецЦикла;
// Отключаем проверки платформы, включая дату запрета редактирования
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
Обратите внимание: установка ОбменДанными.Загрузка = Истина отключает не только проверку даты запрета, но и контроль логики проведения (проверку дублей, полноты заполнения измерений и т.д.). Используйте этот метод с максимальной осторожностью.
Теперь проанализируем регистр ПлановыеНачисленияИнтервальный. Интервальные регистры в ЗУП 3.1 были внедрены для существенного ускорения работы отчетов и расчетов. Они содержат «свернутые» и подготовленные интервалы действия начислений.
Почему этот регистр не правится напрямую? Ответ кроется в логике системы: данные в интервальных регистрах автоматически генерируются на основе записей основных регистров. Если вы программно изменили записи в регистре ПлановыеНачисления, вам необходимо инициировать обновление интервального регистра. Посмотрим на пример кода, как это делается правильно:
// МассивСотрудников должен содержать ссылки на сотрудников, по которым были изменения
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СотрудникСсылка);
// Вызываем типовой метод для обновления интервалов
ИнтервальныеРегистрыСведений.ОбновитьИнтервалыРегистровСотрудников(МассивСотрудников);
Если вы попытаетесь редактировать интервальный регистр отдельной обработкой в отрыве от основного, при любом следующем кадровом документе по этому сотруднику система просто перепишет ваши изменения, заново сформировав интервалы из основного регистра.
Рассмотрим альтернативный, более "безопасный" вариант исправления данных, который часто рекомендуют при разборе полетов. Это использование стандартного документа Перенос данных.
При работе с плановыми начислениями в документе «Перенос данных» учтите, что создание новой записи с теми же измерениями, что и у оригинального кадрового документа, может создать конфликт (движения-двойники). Поэтому исправлять лучше созданием записей, сторнирующих старые и устанавливающих новые значения, либо аккуратной программной очисткой движений конкретного документа-ошибки и вводом нового "Переноса данных".
Проанализируем еще одну скрытую проблему программного изменения записей. В ЗУП 3.1 активно используется механизм отслеживания изменений для автоматического перерасчета зарплаты. Если вы изменили данные напрямую в регистре ПлановыеНачисления через НаборЗаписей, система не зарегистрирует так называемый «инцидент перерасчета».
В результате при начислении зарплаты за текущий месяц программа может рассчитать сотрудника по старым правилам, опираясь на внутренний кэш и вспомогательные таблицы. Чтобы этого избежать, после программной корректировки регистров необходимо зарегистрировать необходимость перерасчета. Сделать это можно в разделе «Зарплата» -> «Сервис» -> «Перерасчеты», добавив нужного сотрудника вручную, либо программно вызвав регистрацию перерасчета для данного физического лица.
Подведем итоги совместной работы над проблемой. Чтобы корректно изменить данные плановых начислений:
ОбменДанными.Загрузка = Истина только в крайних случаях.