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

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

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

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

Почему возникает ошибка: механизм работы регистра

Прежде чем переходить к лечению, давайте проанализируем ситуацию. Регистр сведений Реестр документов — это служебный объект, который система использует для оптимизации построения динамических списков. Вместо того чтобы каждый раз обращаться к тяжелым таблицам документов, 1С считывает данные из этого плоского регистра.

Ошибка «Запись с такими ключевыми полями существует!» означает, что при проведении документа система пытается записать в регистр две абсолютно одинаковые строки (с идентичными измерениями). Для документа Перемещение товаров ключевыми полями в этом регистре обычно являются:

  1. Организация
  2. Склад
  3. Хозяйственная операция
  4. Дата и номер документа

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

Способ 1. Обновление ссылочных связей (самый эффективный)

Как показывает практика и обсуждения на технических форумах, чаще всего эта ошибка проявляется после переноса данных из УТ 10.3 в УТ 11. Проблема кроется в конфликте идентификаторов (UUID) складов или других справочников, что требует выравнивания остатков после обновления или переноса.

Разберем алгоритм действий, который помогает в 90% случаев:

  1. Откройте справочник Склады и магазины.
  2. Найдите склады, которые фигурируют в проблемном документе (склад-отправитель и склад-получатель).
  3. Установите на эти склады пометку на удаление (клавиша Del).
  4. Сразу же снимите пометку на удаление.
  5. Попробуйте провести документ Перемещение товаров снова.

Почему это работает? При интерактивном изменении пометки удаления в типовых конфигурациях срабатывают обработчики событий (ПередЗаписью, ПриЗаписи), которые принудительно обновляют кэшированные данные и связанные записи в системных таблицах. Это «протряхивает» связи и устраняет внутренний конфликт дублей.

Способ 2. Решение проблемы с предопределенными складами

Иногда при попытке выполнить «Способ 1» система выдает новую ошибку: «Пометка на удаление предопределенного элемента справочника запрещена». Это происходит со складом «Основной склад», который создан системой автоматически.

В этой ситуации мы применим небольшую хитрость:

  1. Воспользуйтесь обработкой «Групповое изменение реквизитов» (в разделе Администрирование — Обслуживание) или её расширенной версией с загрузкой списка отборов.
  2. Выберите объект Склады и добавьте отбор по вашему предопределенному складу.
  3. В «Дополнительных параметрах» обработки включите флаг «Показывать служебные реквизиты».
  4. Найдите реквизит ПометкаУдаления и установите значение Да, выполните изменение.
  5. Затем тем же способом верните значение Нет.

Другой вариант — временное переименование. Измените наименование «Основной склад» на любое другое, запишите, а затем верните исходное имя. Это также заставит платформу пересчитать ссылочные индексы.

Способ 3. Анализ дублей в справочниках

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

Проанализируем ситуацию: если склад ссылается на «Подразделение А», а в документе выбрано «Подразделение А-копия» (которое выглядит так же), алгоритм формирования реестра может запутаться и попытаться создать записи по обоим объектам. Мы рекомендуем воспользоваться стандартным инструментом «Поиск и удаление дублей» и проверить справочники:

Способ 4. Программная очистка регистра (для разработчиков)

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


Процедура ОчиститьРеестрПоДокументу(ПроблемнаяСсылка)
    НаборЗаписей = РегистрыСведений.РеестрДокументов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(ПроблемнаяСсылка);
    НаборЗаписей.Записать(); // Записываем пустой набор, удаляя старые записи
    Сообщить("Записи регистра успешно очищены для: " + ПроблемнаяСсылка);
КонецПроцедуры

После выполнения этого кода попробуйте снова нажать кнопку «Провести» в документе. Система сформирует движения в реестре «с чистого листа».

Способ 5. Отладка кода в Модуле менеджера

Если вы программист и хотите докопаться до сути, разберем, где именно в коде происходит формирование этих записей. Основная логика сосредоточена в общем модуле или модуле менеджера регистра. Ищите процедуру ЗаполнитьТаблицуРеестраДокументов.

Часто проблема кроется в запросе, который объединяет данные по складу-отправителю и складу-получателю. Если эти склады для логики программы оказываются неразличимы (например, у них совпадает реквизит СкладскаяТерритория при определенных настройках учета), запрос выдаст две строки вместо одной.

Поставим точку останова в месте вызова метода Записать():


// В модуле менеджера регистра РеестрДокументов
Набор.Записать(); // Здесь происходит падение

Перед этой строкой проанализируйте содержимое переменной Набор (или таблицы, из которой он заполняется). Вы обязательно увидите там две строки с одинаковыми значениями в колонках-измерениях. Анализ этих данных подскажет, какой именно реквизит (Организация, Склад или Направление деятельности) дублируется.

Резюме

Подводя итог, отметим, что ошибка «Запись с такими ключевыми полями существует!» в УТ 11 — это чаще всего следствие нарушения целостности ссылок после импорта данных.

Помните: в большинстве случаев помогает простая манипуляция с пометкой удаления складов. Если же вы столкнулись с системной ошибкой в коде (багом релиза), единственным надежным способом будет очистка набора записей регистра программным путем или установка патча от фирмы 1С.

← На главную