Как исправить ошибку «Запись с такими ключевыми полями существует» при переносе данных из ЗиК 7.7 в ЗУП 3?

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

При выполнении конвертации данных из конфигурации «Зарплата и Кадры 7.7» в «Зарплата и Управление Персоналом 3» на этапе загрузки XML-файла через обработку УниверсальныйОбменДаннымиXML специалисты нередко сталкиваются с аварийным завершением транзакции. Ошибка возникает при записи документа Перенос данных с префиксом ЗП_СЗФСС и сопровождается системным сообщением:

Ошибка записи объекта: Запись с такими ключевыми полями существует! : ДанныеОВремениДляРасчетаСреднегоФСС

Разберем подробнее причины возникновения этого конфликта ключевых полей, проанализируем структуру регистра и рассмотрим проверенные практические способы обхода и устранения данной проблемы.

Анализ причины: почему возникает конфликт измерений регистра

Для того чтобы понять природу ошибки, сопоставим архитектуру учета рабочего времени в ЗиК 7.7 и ЗУП 3:

  1. Разделение сотрудников в ЗиК 7.7. Если работник трудится как основной сотрудник и одновременно как внутренний совместитель, в 7.7 создаются два независимых элемента справочника Сотрудники с разными табельными номерами. Расчет заработной платы и учет отработанного времени ведутся по каждому элементу раздельно.
  2. Специфика регистра ФСС в ЗУП 3. Согласно Федеральному закону № 255-ФЗ, пособия по временной нетрудоспособности и материнству рассчитываются исходя из всех выплат физлицу у одного страхователя, а не по отдельным рабочим местам. Поэтому в регистре сведений Данные о времени для расчета среднего (ФСС) главным измерением выступает ФизическоеЛицо, а не Сотрудник (в отличие от регистра Данные о времени для расчета среднего (общий)).
  3. Конфликт ключа записи. Ключевыми полями набора записей в подчиненном регистратору регистре сведений являются документ-регистратор и все измерения: ФизическоеЛицо, ГоловнаяОрганизация и расчетный Период (месяц). При выгрузке данных за один и тот же месяц (например, июль 2013 года) алгоритм правил обмена формирует в одном документе Перенос данных две строки для одного физического лица — от основного места работы и от совместительства. При выполнении метода Записать() платформа 1С:Предприятие 8 фиксирует дублирование ключевых полей в одном наборе и прерывает загрузку.

Способ 1. Обход через промежуточную загрузку в релиз ЗУП 3.0 с обновлением

Наиболее надежным решением без ручной переработки программного кода является использование промежуточной конфигурации. В релизах ветки ЗУП 3.0 алгоритмы загрузки и структура правил были более лояльны к данным ЗиК 7.7, чем в первых релизах ветки ЗУП 3.1.

Разберем по шагам последовательность действий:

  1. Развернем чистую информационную базу конфигурации редакции 3.0 (например, стабильный релиз 3.0.25.144).
  2. Запустим штатную обработку переноса данных и выполним загрузку выгруженного из ЗиК 7.7 XML-файла. На данном релизе документы переноса данных формируются без прерывания транзакции.
  3. После успешной загрузки выполним тестирование и исправление информационной базы.
  4. Выполним штатное обновление конфигурации с редакции 3.0 до целевого релиза редакции 3.1. При обновлении встроенные обработчики обновления информационной базы самостоятельно выполнят корректную реструктуризацию регистров и свернут дублирующиеся данные.

Способ 2. Ограничение периода выгрузки данных для расчета среднего

Если ошибка происходит на периодах трех- или четырехлетней давности (например, перенос выполняется в 2016–2017 годах, а сбой происходит на данных за июль 2013 года), имеет смысл проанализировать целесообразность переноса этих сведений.

Для расчета пособий по нетрудоспособности законодательно требуются сведения только за два календарных года, предшествующих году наступления страхового случая. Для отпусков расчетный период составляет 12 месяцев. Данные за 2013 год при расчете пособий в 2016–2017 годах уже не используются.

В настройках правил выгрузки из ЗиК 7.7 ограничим период среза данных для расчета среднего заработка: перенесем начисления и время только с 2014 или 2015 года. Это полностью исключит конфликтные исторические записи из выгрузки и сократит время миграции.

Способ 3. Сворачивание строк в обработчике правил или ручная корректировка XML

Если необходимо перенести данные именно за спорный период напрямую в целевую базу, скорректируем набор записей. Проанализируем два технических варианта:

  1. Корректировка в текстовом редакторе. Откроем сформированный файл выгрузки XML в продвинутом редакторе. Найдем секцию документа Перенос данных с номером ЗП_СЗФСС за проблемный месяц. В табличной части регистра сведений ДанныеОВремениДляРасчетаСреднегоФСС найдем строки по проблемному сотруднику. Объединим значения числовых ресурсов (отработанные дни, исключаемые периоды) в одну строку, а вторую дублирующую строку удалим из узла XML.
  2. Сворачивание таблицы движений в правилах обмена. В конфигурации «Конвертация данных» для правила конвертации объекта (ПКО) документа ПереносДанных в обработчике ПослеЗагрузки можно добавить программную свертку таблицы движений перед ее записью в базу.

Посмотрим на пример программной свертки движений:


НаборДвижений = Объект.Движения.ДанныеОВремениДляРасчетаСреднегоФСС;
Если НаборДвижений.Количество() > 0 Тогда
    ТаблицаДвижений = НаборДвижений.Выгрузить();
    ТаблицаДвижений.Свернуть("ФизическоеЛицо, ГоловнаяОрганизация, Период", "ОтработаноДней, ДнейБолезниУходаЗаДетьми");
    НаборДвижений.Загрузить(ТаблицаДвижений);
КонецЕсли;

Способ 4. Устранение сопутствующей ошибки блокировки подразделений

При комплексном переносе данных нередко возникает следующая ошибка:

Ошибка при вызове метода контекста (Записать): Не удалось изменить подчиненное подразделение... Возможно, подразделение редактируется другим пользователем

Эта ситуация обусловлена логикой работы обработчика ПриЗаписи справочника ПодразделенияОрганизаций в общем модуле ЗарплатаКадры. При изменении параметров головного подразделения система пытается каскадно обновить подчиненные подразделения, что приводит к конфликту взаимных блокировок в рамках одной общей транзакции обмена.

Для устранения этой ошибки выполним следующие действия:

  1. В базе ЗиК 7.7 проверим справочник подразделений на отсутствие циклических связей (когда родительское подразделение ошибочно ссылается на дочернее в качестве своего родителя). Для этого запустим Тестирование и исправление ИБ с проверкой логической целостности.
  2. В базе-приемнике ЗУП 3 перед началом общей загрузки вручную включим использование обособленных подразделений (если они есть в структуре) в настройках кадрового учета и реквизитах организации.
  3. В обработке УниверсальныйОбменДаннымиXML на вкладке параметров загрузки установим количество объектов в одной транзакции равным 1. Это снимет удержание блокировок над подчиненными строками справочника при итерационной записи и позволит иерархии подразделений загрузиться без взаимных коллизий.
← На главную