При работе в конфигурации 1С:Управление торговлей 11 (а также в ERP и Комплексной автоматизации) пользователи часто сталкиваются с неприятной ошибкой при проведении документа Перемещение товаров. Программа выдает сообщение: «Запись с такими ключевыми полями существует! РеестрДокументов...». Эта проблема блокирует складской учет и часто ставит в тупик даже опытных специалистов, так как простое пересоздание документа или изменение его номера не помогает.
В этой статье мы подробно разберем, почему возникает этот сбой, как он связан с регистром сведений Реестр документов и какие шаги необходимо предпринять для его устранения.
Прежде чем переходить к лечению, давайте проанализируем ситуацию. Регистр сведений Реестр документов — это служебный объект, который система использует для оптимизации построения динамических списков. Вместо того чтобы каждый раз обращаться к тяжелым таблицам документов, 1С считывает данные из этого плоского регистра.
Ошибка «Запись с такими ключевыми полями существует!» означает, что при проведении документа система пытается записать в регистр две абсолютно одинаковые строки (с идентичными измерениями). Для документа Перемещение товаров ключевыми полями в этом регистре обычно являются:
Если алгоритм проведения по какой-то причине генерирует дублирующуюся строку для этого набора измерений, платформа выбрасывает исключение, так как в регистре сведений не может быть двух записей с одинаковыми ключами.
Как показывает практика и обсуждения на технических форумах, чаще всего эта ошибка проявляется после переноса данных из УТ 10.3 в УТ 11. Проблема кроется в конфликте идентификаторов (UUID) складов или других справочников, что требует выравнивания остатков после обновления или переноса.
Разберем алгоритм действий, который помогает в 90% случаев:
Склады и магазины.Перемещение товаров снова.Почему это работает? При интерактивном изменении пометки удаления в типовых конфигурациях срабатывают обработчики событий (ПередЗаписью, ПриЗаписи), которые принудительно обновляют кэшированные данные и связанные записи в системных таблицах. Это «протряхивает» связи и устраняет внутренний конфликт дублей.
Иногда при попытке выполнить «Способ 1» система выдает новую ошибку: «Пометка на удаление предопределенного элемента справочника запрещена». Это происходит со складом «Основной склад», который создан системой автоматически.
В этой ситуации мы применим небольшую хитрость:
Склады и добавьте отбор по вашему предопределенному складу.ПометкаУдаления и установите значение Да, выполните изменение.Нет.Другой вариант — временное переименование. Измените наименование «Основной склад» на любое другое, запишите, а затем верните исходное имя. Это также заставит платформу пересчитать ссылочные индексы.
Если манипуляции со складами не помогли, нам нужно выяснить, нет ли в системе скрытых дублей. Рассмотрим ситуацию, когда после переноса данных в базе оказалось две организации с одинаковым названием или два подразделения.
Проанализируем ситуацию: если склад ссылается на «Подразделение А», а в документе выбрано «Подразделение А-копия» (которое выглядит так же), алгоритм формирования реестра может запутаться и попытаться создать записи по обоим объектам. Мы рекомендуем воспользоваться стандартным инструментом «Поиск и удаление дублей» и проверить справочники:
ОрганизацииСклады (предварительно выполнив сравнение регистров «Товары на складах» и «Товары организаций»)ПодразделенияЕсли ошибка сохраняется, значит, в регистре РеестрДокументов «зависла» старая запись, которую система не может перезаписать. В этом случае мы можем принудительно очистить записи по конкретному регистратору. Рассмотрим пример кода, который можно запустить во внешней обработке:
Процедура ОчиститьРеестрПоДокументу(ПроблемнаяСсылка)
НаборЗаписей = РегистрыСведений.РеестрДокументов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ПроблемнаяСсылка);
НаборЗаписей.Записать(); // Записываем пустой набор, удаляя старые записи
Сообщить("Записи регистра успешно очищены для: " + ПроблемнаяСсылка);
КонецПроцедуры
После выполнения этого кода попробуйте снова нажать кнопку «Провести» в документе. Система сформирует движения в реестре «с чистого листа».
Если вы программист и хотите докопаться до сути, разберем, где именно в коде происходит формирование этих записей. Основная логика сосредоточена в общем модуле или модуле менеджера регистра. Ищите процедуру ЗаполнитьТаблицуРеестраДокументов.
Часто проблема кроется в запросе, который объединяет данные по складу-отправителю и складу-получателю. Если эти склады для логики программы оказываются неразличимы (например, у них совпадает реквизит СкладскаяТерритория при определенных настройках учета), запрос выдаст две строки вместо одной.
Поставим точку останова в месте вызова метода Записать():
// В модуле менеджера регистра РеестрДокументов
Набор.Записать(); // Здесь происходит падение
Перед этой строкой проанализируйте содержимое переменной Набор (или таблицы, из которой он заполняется). Вы обязательно увидите там две строки с одинаковыми значениями в колонках-измерениях. Анализ этих данных подскажет, какой именно реквизит (Организация, Склад или Направление деятельности) дублируется.
Подводя итог, отметим, что ошибка «Запись с такими ключевыми полями существует!» в УТ 11 — это чаще всего следствие нарушения целостности ссылок после импорта данных.
Помните: в большинстве случаев помогает простая манипуляция с пометкой удаления складов. Если же вы столкнулись с системной ошибкой в коде (багом релиза), единственным надежным способом будет очистка набора записей регистра программным путем или установка патча от фирмы 1С.