Как исправить ошибку «Запись с такими ключевыми полями существует!» при обновлении 1С и ВЕТИС?

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

При выполнении масштабного обновления конфигурации «1С:Бухгалтерия предприятия» (особенно при переходе с версий ниже 3.0.100 на актуальные релизы 3.0.120+) администраторы часто сталкиваются с критической ошибкой. Программа аварийно завершает работу с сообщением: «Запись с такими ключевыми полями существует! : ОбработчикиОбновленияОбщихДанных: ОбновлениеИнформационнойБазыВЕТИС.ЗаполнениеСлужебныхРегистровВетИС». Ситуация осложняется тем, что ошибка возникает на этапе запуска, когда войти в систему обычным способом для исправления данных невозможно.

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

Выясняем причину возникновения ошибки

Прежде всего, разберем природу проблемы. Ошибка возникает из-за нарушения регламента обновления программных продуктов на платформе 1С:Предприятие 8.3. Основная причина — так называемое «накатывание» нескольких релизов в Конфигураторе подряд без промежуточного запуска информационной базы в режиме «Предприятие».

Механизм обновления 1С состоит из двух этапов:

  1. Обновление метаданных: выполняется в Конфигураторе при принятии изменений.
  2. Выполнение обработчиков обновления: запускается при первом входе пользователя. В этот момент БСП регистрирует список процедур, которые должны пересчитать данные, заполнить новые регистры или изменить структуру существующих записей.

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

Метод 1. Использование параметра запуска для обхода логики начала работы

Рассмотрим самый быстрый способ получить доступ к интерфейсу программы, когда она «зависла» на этапе обновления. Нам необходимо запустить 1С в режиме, который игнорирует автоматический старт процедур обновления.

Для этого выполним следующие действия:

  1. Откроем список информационных баз и выберем нужную.
  2. Нажмем кнопку «Изменить» и перейдем на последнюю вкладку настроек.
  3. В поле «Дополнительные параметры запуска» впишем следующую команду: /C ОтключитьЛогикуНачалаРаботыСистемы (обратите внимание на символ «/C» — это обязательный префикс для передачи параметров в код конфигурации).
  4. Запустим базу в режиме «1С:Предприятие».

После запуска система проигнорирует этап обновления. Теперь мы можем перейти в раздел Администрирование — Обслуживание — Обновление программы и открыть гиперссылку «Результаты обновления и дополнительная обработка данных». Здесь можно визуально оценить, какие обработчики «зависли» или вызвали конфликт.

Метод 2. Программная очистка конфликтующих записей в регистре

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

Для этого лучше всего использовать внешнюю обработку или «Групповое изменение реквизитов», но если доступ есть только к консоли кода, рассмотрим следующий фрагмент:


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

Если Набор.Количество() > 0 Тогда
    // Если записей несколько, мы можем очистить их все, чтобы система создала одну корректную
    Набор.Очистить();
    Набор.Записать();
    Сообщить("Конфликтующие записи успешно удалены. Попробуйте запустить обновление снова.");
КонецЕсли;

После выполнения этого кода необходимо закрыть 1С, убрать параметр запуска /C ОтключитьЛогикуНачалаРаботыСистемы и запустить базу в обычном режиме. Система заново проинициализирует список обработчиков и, не встретив дубля в таблице, успешно продолжит процесс обновления.

Метод 3. Исправление через расширение конфигурации

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

Нам необходимо перехватить процедуру, отвечающую за регистрацию обработчиков. Чаще всего это метод ПриДобавленииОбработчиковОбновления в общем модуле подсистемы ВЕТИС.


&Вместо("ПриДобавленииОбработчиковОбновления")
Процедура Расш1_ПриДобавленииОбработчиковОбновления(Обработчики)
    // Вызываем оригинальный метод
    ПродолжитьВызов(Обработчики);
    
    // После заполнения списка анализируем его и удаляем дубликаты программно
    // перед тем как БСП попытается записать их в базу данных
    Для Каждого СтрокаОбработчик Из Обработчики Цикл
        // Здесь можно добавить логику проверки версий
    КонецЦикла;
КонецПроцедуры

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

Профилактика: как избежать подобных ошибок в будущем

Разберем основные правила безопасного обновления «1С:Бухгалтерии», которые помогут сэкономить время и избежать походов «глубоко в тайгу» за душевным спокойствием:

  1. Всегда делайте резервную копию. Перед каждым обновлением в Конфигураторе (Администрирование — Выгрузить информационную базу) создавайте файл .dt или делайте копию файла .1cd для файловых баз.
  2. Соблюдайте последовательность запусков. Если вам нужно обновить базу на 10 релизов вперед, не делайте это за один раз. Обновили на 2-3 релиза — запустили «Предприятие» — дождались завершения фоновых заданий обновления — закрыли — повторили процедуру.
  3. Контролируйте фоновые задания. После запуска обновления зайдите в Администрирование — Обслуживание — Результаты обновления. Пока все пункты не будут отмечены зеленой галочкой, переходить к следующему релизу в Конфигураторе нельзя.
  4. Используйте полные дистрибутивы (cf). Если разрыв между версиями слишком велик, иногда безопаснее обновиться один раз через «Сравнить и объединить» с полным файлом конфигурации (cf) актуального релиза, чем последовательно применять десятки cfu-файлов. Но помните, что это требует высокой квалификации и понимания структуры метаданных.

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

← На главную