При выполнении конвертации данных из конфигурации «Зарплата и Кадры 7.7» в «Зарплата и Управление Персоналом 3» на этапе загрузки XML-файла через обработку УниверсальныйОбменДаннымиXML специалисты нередко сталкиваются с аварийным завершением транзакции. Ошибка возникает при записи документа Перенос данных с префиксом ЗП_СЗФСС и сопровождается системным сообщением:
Ошибка записи объекта: Запись с такими ключевыми полями существует! : ДанныеОВремениДляРасчетаСреднегоФСС
Разберем подробнее причины возникновения этого конфликта ключевых полей, проанализируем структуру регистра и рассмотрим проверенные практические способы обхода и устранения данной проблемы.
Для того чтобы понять природу ошибки, сопоставим архитектуру учета рабочего времени в ЗиК 7.7 и ЗУП 3:
Сотрудники с разными табельными номерами. Расчет заработной платы и учет отработанного времени ведутся по каждому элементу раздельно.Данные о времени для расчета среднего (ФСС) главным измерением выступает ФизическоеЛицо, а не Сотрудник (в отличие от регистра Данные о времени для расчета среднего (общий)).ФизическоеЛицо, ГоловнаяОрганизация и расчетный Период (месяц). При выгрузке данных за один и тот же месяц (например, июль 2013 года) алгоритм правил обмена формирует в одном документе Перенос данных две строки для одного физического лица — от основного места работы и от совместительства. При выполнении метода Записать() платформа 1С:Предприятие 8 фиксирует дублирование ключевых полей в одном наборе и прерывает загрузку.Наиболее надежным решением без ручной переработки программного кода является использование промежуточной конфигурации. В релизах ветки ЗУП 3.0 алгоритмы загрузки и структура правил были более лояльны к данным ЗиК 7.7, чем в первых релизах ветки ЗУП 3.1.
Разберем по шагам последовательность действий:
3.0.25.144).Если ошибка происходит на периодах трех- или четырехлетней давности (например, перенос выполняется в 2016–2017 годах, а сбой происходит на данных за июль 2013 года), имеет смысл проанализировать целесообразность переноса этих сведений.
Для расчета пособий по нетрудоспособности законодательно требуются сведения только за два календарных года, предшествующих году наступления страхового случая. Для отпусков расчетный период составляет 12 месяцев. Данные за 2013 год при расчете пособий в 2016–2017 годах уже не используются.
В настройках правил выгрузки из ЗиК 7.7 ограничим период среза данных для расчета среднего заработка: перенесем начисления и время только с 2014 или 2015 года. Это полностью исключит конфликтные исторические записи из выгрузки и сократит время миграции.
Если необходимо перенести данные именно за спорный период напрямую в целевую базу, скорректируем набор записей. Проанализируем два технических варианта:
Перенос данных с номером ЗП_СЗФСС за проблемный месяц. В табличной части регистра сведений ДанныеОВремениДляРасчетаСреднегоФСС найдем строки по проблемному сотруднику. Объединим значения числовых ресурсов (отработанные дни, исключаемые периоды) в одну строку, а вторую дублирующую строку удалим из узла XML.ПереносДанных в обработчике ПослеЗагрузки можно добавить программную свертку таблицы движений перед ее записью в базу.Посмотрим на пример программной свертки движений:
НаборДвижений = Объект.Движения.ДанныеОВремениДляРасчетаСреднегоФСС;
Если НаборДвижений.Количество() > 0 Тогда
ТаблицаДвижений = НаборДвижений.Выгрузить();
ТаблицаДвижений.Свернуть("ФизическоеЛицо, ГоловнаяОрганизация, Период", "ОтработаноДней, ДнейБолезниУходаЗаДетьми");
НаборДвижений.Загрузить(ТаблицаДвижений);
КонецЕсли;
При комплексном переносе данных нередко возникает следующая ошибка:
Ошибка при вызове метода контекста (Записать): Не удалось изменить подчиненное подразделение... Возможно, подразделение редактируется другим пользователем
Эта ситуация обусловлена логикой работы обработчика ПриЗаписи справочника ПодразделенияОрганизаций в общем модуле ЗарплатаКадры. При изменении параметров головного подразделения система пытается каскадно обновить подчиненные подразделения, что приводит к конфликту взаимных блокировок в рамках одной общей транзакции обмена.
Для устранения этой ошибки выполним следующие действия:
УниверсальныйОбменДаннымиXML на вкладке параметров загрузки установим количество объектов в одной транзакции равным 1. Это снимет удержание блокировок над подчиненными строками справочника при итерационной записи и позволит иерархии подразделений загрузиться без взаимных коллизий.