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

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

Обновление конфигурации 1С:Зарплата и управление персоналом 8 до версии 3.1.17.94 (и последующих) часто сопровождается критической ошибкой при выполнении дополнительных процедур обработки данных. Проблема проявляется сообщением: «Код Запись с такими ключевыми полями существует! : МероприятияТрудовойДеятельностиПереданные». В результате информационная база становится недоступной для пользователей, так как обработчики обновления не могут завершить свою работу.

В этой статье мы подробно разберем причины возникновения данной ошибки и рассмотрим несколько способов её решения: от административных методов исправления данных до «хирургического» вмешательства в программный код для восстановления доступа к базе.

Почему возникает ошибка: технический анализ ситуации

Разберем ситуацию: начиная с версии 3.1.17.94, разработчики 1С изменили структуру регистра сведений МероприятияТрудовойДеятельностиПереданные. В частности, была усилена проверка уникальности записей и изменен состав индексов для корректной работы с данными СЗВ-ТД (ЕФС-1). Проблема кроется в исторических данных за 2020 год, когда отчетность по трудовой деятельности только внедрялась. В тот период механизмы контроля GUID (уникальных идентификаторов мероприятий) были несовершенны.

Выясним причину более детально: ошибка возникает, когда в регистре обнаруживаются две или более записи, имеющие одинаковый ИдМероприятия и признак Отменено. Часто это случалось, если одно и то же мероприятие (например, прием на работу) ошибочно включалось в разные документы СЗВ-ТД, и оба документа проводились. При обновлении программа пытается заполнить новые реквизиты (например, Организация) и перестроить индекс, натыкается на дубль и прекращает работу.

Способ 1: Поиск и исправление дублей через консоль запросов

Если вы столкнулись с ошибкой на этапе обновления и у вас есть возможность запустить базу (например, после восстановления из бэкапа до попытки обновления), проанализируем данные заранее. Если же база уже «зависла», используйте способы обхода, описанные ниже, чтобы добраться до консоли.

Для поиска проблемных записей воспользуемся консолью запросов. Нам нужно сгруппировать записи регистра по ключевым полям и найти те, где количество строк больше одной. Рассмотрим пример такого запроса:


ВЫБРАТЬ
    Мероприятия.ИдМероприятия КАК Идентификатор,
    Мероприятия.Отменено КАК ФлагОтмены,
    Мероприятия.Организация КАК Организация,
    КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
ИЗ
    РегистрСведений.МероприятияТрудовойДеятельностиПереданные КАК Мероприятия
СГРУППИРОВАТЬ ПО
    Мероприятия.ИдМероприятия,
    Мероприятия.Отменено,
    Мероприятия.Организация
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(*) > 1

После выполнения запроса мы получим список GUID, которые вызвали конфликт. Дальнейшие действия по шагам:

  1. Скопируйте ИдМероприятия из результата запроса.
  2. Найдите через поиск в регистре сведений все записи с этим идентификатором.
  3. Определите документы-регистраторы (обычно это СЗВ-ТД), которые создали эти записи.
  4. В одном из документов-дублей необходимо убрать лишнее мероприятие или снять документ с проведения, если он был ошибочным. Как показывает практика, часто в 2020 году кадровики создавали «копии» отчетов, которые фактически дублировали отправленные данные.

Способ 2: Временный обход блокировки для доступа к базе

Если обновление уже запущено, бэкап не сработал, и вы не можете войти в программу, рассмотрим метод «обхода» обработчика. Нам нужно временно нейтрализовать процедуру, вызывающую ошибку.

Выполним следующие действия в конфигураторе:

  1. Откройте конфигуратор и найдите общий модуль ОбновлениеИнформационнойБазыЗарплатаКадрыБазовый (или аналогичный, в зависимости от точной версии, связанный с обновлением ЗУП).
  2. Найдите процедуру ЗаполнитьОрганизации в модуле менеджера регистра сведений МероприятияТрудовойДеятельностиПереданные. В версии 3.1.14 она выглядела так:

Процедура ЗаполнитьОрганизации(ПараметрыОбновления = Неопределено) Экспорт
    // Здесь код запроса и записи набора записей
    // ...
    НаборЗаписей = РегистрыСведений.МероприятияТрудовойДеятельностиПереданные.СоздатьНаборЗаписей;
    НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
    НаборЗаписей.Прочитать;
    Для Каждого Запись Из НаборЗаписей Цикл
        Запись.Организация = Выборка.Организация;
    КонецЦикла;
    ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей);
КонецПроцедуры

Чтобы база открылась, временно закомментируйте вызов этой процедуры в списке обработчиков обновления или само тело процедуры. После этого:

  1. Запустите базу. Она должна открыться, пропустив проблемный шаг.
  2. Используйте консоль запросов из Способа 1, чтобы найти и физически устранить дубли в данных.
  3. После очистки данных обязательно верните код в исходное состояние.
  4. Запустите обновление информационной базы повторно, используя параметр запуска /С ЗапуститьОбновлениеИнформационнойБазы.

Способ 3: Исправление данных через удаление записей регистра

Иногда кадровики категорически запрещают распроводить документы прошлых периодов (2020 год). В таком случае проанализируем ситуацию с точки зрения целостности регистра. Если мы точно уверены, какая запись является лишним дублем (например, она полностью идентична основной), мы можем прибегнуть к программному удалению записи из набора без снятия документа с проведения.

Рассмотрим пример кода для удаления конкретной записи по регистратору:


Набор = РегистрыСведений.МероприятияТрудовойДеятельностиПереданные.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаПроблемныйДокумент);
Набор.Прочитать();

// В цикле находим именно ту запись, которая имеет дублирующий GUID
ИндексДляУдаления = -1;
Для И = 0 По Набор.Количество() - 1 Цикл
    Если Набор[И].ИдМероприятия = НужныйGUID Тогда
        ИндексДляУдаления = И;
        Прервать;
    КонецЕсли;
КонецЦикла;

Если ИндексДляУдаления >= 0 Тогда
    Набор.Удалить(ИндексДляУдаления);
    Набор.Записать();
КонецЕсли;

Важный момент: перед такими манипуляциями крайне рекомендуется свериться с порталом ПФР (СФР) или файлами выгрузки, чтобы убедиться, какой именно ИдМероприятия был фактически принят фондом. Если вы удалите «правильный» идентификатор и оставите «ошибочный», в будущем при попытке отмены или изменения этого мероприятия вы получите отказ от фонда, так как GUID не совпадет.

Рекомендации по профилактике

Посмотрим на ситуацию шире: чтобы избежать подобных проблем в будущем, рекомендуется перед каждым крупным обновлением (переходом на новые минорные версии, такие как с 3.1.14 на 3.1.17 или 3.1.23 на 3.1.27) выполнять Тестирование и исправление информационной базы в конфигураторе. Особое внимание стоит уделять пункту «Проверка логической целостности» и «Очистка ссылок на несуществующие объекты».

Также полезно периодически проверять Журнал регистрации на предмет ошибок с тегом СведенияОТрудовойДеятельности. Помните, что корректность данных в регистре МероприятияТрудовойДеятельностиПереданные — это залог не только успешного обновления, но и правильного формирования всей последующей отчетности по форме ЕФС-1.

← На главную