При переходе на новые релизы программы 1С:Зарплата и управление персоналом 3.1 (особенно при переходе с ветки 3.1.5 на 3.1.6 и выше) многие технические специалисты сталкиваются с досадной ошибкой. В процессе выполнения обработчиков обновления система прерывается с сообщением: «Запись с такими ключевыми полями существует: Параметры периодов стажа ПФР...». Далее обычно следует перечисление организации, физического лица, даты начала периода и регистратора.
Эта проблема носит массовый характер и связана с глубоким изменением архитектуры хранения данных для отчетности в ПФР (теперь СФР). Разберем по шагам, почему это происходит и как нам вместе справиться с этой ситуацией, чтобы успешно завершить обновление базы.
Проанализируем ситуацию: в версии 3.1.6 разработчики 1С радикально пересмотрели механизм формирования данных для формы СЗВ-СТАЖ. Был оптимизирован регистр сведений ПараметрыПериодовСтажаПФР. При обновлении конфигурации запускается специальная процедура, которая пытается пересчитать все прошлые периоды стажа сотрудников и записать их в этот регистр в новом формате.
Конфликт возникает из-за того, что в исходных данных (документах-регистраторах) уже содержатся избыточные или противоречивые записи. Механизм обновления пытается записать в регистр строку, которая по ключевым полям (Организация, ФизическоеЛицо, ДатаНачала, Регистратор) полностью совпадает с уже созданной в этой же транзакции записью. Система управления базами данных (СУБД) или сама платформа 1С блокируют это действие, так как нарушается уникальность записей регистра.
Рассмотрим подробнее основные источники «грязных» данных:
Перенос данных с кодами ПФР или РКЛ. Часто при переносе возникают дубли строк, которые «старая» версия ЗУП 3.1 игнорировала, а «новая» обработка обновления пытается превратить в уникальные записи.Прежде чем что-то исправлять, нам нужно точно определить, какая именно запись вызывает сбой. Для этого воспользуемся консолью запросов. Нам необходимо найти записи в регистре Параметры периодов стажа ПФР, которые имеют одинаковые ключевые поля.
Рассмотрим пример запроса, который поможет выявить дубли:
ВЫБРАТЬ
ПараметрыПериодовСтажаПФР.Организация,
ПараметрыПериодовСтажаПФР.ФизическоеЛицо,
ПараметрыПериодовСтажаПФР.ДатаНачала,
ПараметрыПериодовСтажаПФР.Регистратор,
КОЛИЧЕСТВО(*) КАК КоличествоДублей
ИЗ
РегистрСведений.ПараметрыПериодовСтажаПФР КАК ПараметрыПериодовСтажаПФР
СГРУППИРОВАТЬ ПО
ПараметрыПериодовСтажаПФР.Организация,
ПараметрыПериодовСтажаПФР.ФизическоеЛицо,
ПараметрыПериодовСтажаПФР.ДатаНачала,
ПараметрыПериодовСтажаПФР.Регистратор
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
После выполнения этого запроса мы получим список «проблемных» сотрудников и документов-регистраторов. Если запрос в самом регистре ничего не возвращает (такое бывает, если ошибка вылетает в момент записи новых данных обработчиком), следует проанализировать источник данных — документы Перенос данных.
Как показывает практика, в 90% случаев корень зла таится в документах переноса. Проанализируем ситуацию: если в тексте ошибки указан регистратор Перенос данных ПФР..., откроем этот документ. Нам нужно перейти в таблицу, соответствующую регистру сведений о стаже.
Алгоритм действий:
Важный момент: Иногда дублирование происходит не внутри одного документа, а между двумя разными документами «Перенос данных», созданными на одну и ту же дату. В этом случае нужно решить, какой из документов является приоритетным, и устранить пересечение периодов.
Если документов с дублями слишком много (база большая, перенос был выполнен некорректно), ручная правка может занять вечность. В таком случае мы можем прибегнуть к программному методу очистки.
Поскольку регистр ПараметрыПериодовСтажаПФР является производным (он заполняется на основании кадровых документов и данных о начислениях), его можно полностью очистить перед запуском обработчиков обновления. При выполнении обновления система сама заново сформирует записи в этом регистре, основываясь на «первичке».
Для этого можно использовать простую внешнюю обработку со следующим кодом:
НаборЗаписей = РегистрыСведений.ПараметрыПериодовСтажаПФР.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
После очистки регистра запустите процесс обновления снова. В большинстве случаев процедура ОбновитьДанныеРегистра отработает корректно, создав уже правильные, уникальные записи.
Если предыдущие шаги не помогли, возможно, в базе нарушена ссылочная целостность. Выясним, нет ли в системе «фантомных» записей. Для этого перед обновлением крайне желательно выполнить стандартные процедуры обслуживания:
chdbfl.exe (для файловых баз), чтобы проверить физическую целостность таблиц.Это позволит удалить ссылки на удаленные документы, которые могут мешать корректной работе регистра ПараметрыПериодовСтажаПФР.
Ошибка при обновлении на ЗУП 3.1.6 — это не приговор, а следствие «грязных» исторических данных. Основная стратегия борьбы заключается в поиске дублей в документах переноса или полной очистке проблемного регистра перед обновлением. Помните, что перед любыми манипуляциями с данными (особенно программной очисткой регистров) создание резервной копии базы данных обязательно!
Проанализировав ситуацию и применив один из вышеперечисленных методов, мы сможем успешно преодолеть этап обновления и предоставить пользователям доступ к актуальным формам отчетности.