При выполнении масштабного обновления конфигурации «1С:Бухгалтерия предприятия» (особенно при переходе с версий ниже 3.0.100 на актуальные релизы 3.0.120+) администраторы часто сталкиваются с критической ошибкой. Программа аварийно завершает работу с сообщением: «Запись с такими ключевыми полями существует! : ОбработчикиОбновленияОбщихДанных: ОбновлениеИнформационнойБазыВЕТИС.ЗаполнениеСлужебныхРегистровВетИС». Ситуация осложняется тем, что ошибка возникает на этапе запуска, когда войти в систему обычным способом для исправления данных невозможно.
В этой статье мы подробно разберем, почему возникает этот конфликт, проанализируем механизмы работы Библиотеки стандартных подсистем (БСП) и рассмотрим несколько пошаговых методов восстановления работоспособности базы данных.
Прежде всего, разберем природу проблемы. Ошибка возникает из-за нарушения регламента обновления программных продуктов на платформе 1С:Предприятие 8.3. Основная причина — так называемое «накатывание» нескольких релизов в Конфигураторе подряд без промежуточного запуска информационной базы в режиме «Предприятие».
Механизм обновления 1С состоит из двух этапов:
Когда мы обновляемся через несколько релизов сразу, подсистема интеграции с ВЕТИС (Меркурий) пытается зарегистрировать один и тот же обработчик ОбновлениеИнформационнойБазыВЕТИС.ЗаполнениеСлужебныхРегистровВетИС несколько раз для разных версий конфигурации. Поскольку в регистре сведений ОбработчикиОбновленияОбщихДанных имя обработчика является частью ключа записи, возникает попытка записи дубля, что и приводит к ошибке.
Рассмотрим самый быстрый способ получить доступ к интерфейсу программы, когда она «зависла» на этапе обновления. Нам необходимо запустить 1С в режиме, который игнорирует автоматический старт процедур обновления.
Для этого выполним следующие действия:
/C ОтключитьЛогикуНачалаРаботыСистемы (обратите внимание на символ «/C» — это обязательный префикс для передачи параметров в код конфигурации).После запуска система проигнорирует этап обновления. Теперь мы можем перейти в раздел Администрирование — Обслуживание — Обновление программы и открыть гиперссылку «Результаты обновления и дополнительная обработка данных». Здесь можно визуально оценить, какие обработчики «зависли» или вызвали конфликт.
Если ручное управление через интерфейс не помогает, или список обработчиков пуст из-за ошибки записи, нам придется вмешаться в данные напрямую. Проанализируем ситуацию: нам нужно удалить из регистра ОбработчикиОбновленияОбщихДанных запись, которая вызывает коллизию.
Для этого лучше всего использовать внешнюю обработку или «Групповое изменение реквизитов», но если доступ есть только к консоли кода, рассмотрим следующий фрагмент:
Набор = РегистрыСведений.ОбработчикиОбновленияОбщихДанных.СоздатьНаборЗаписей();
Набор.Отбор.ИмяОбработчика.Установить("ОбновлениеИнформационнойБазыВЕТИС.ЗаполнениеСлужебныхРегистровВетИС");
Набор.Прочитать();
Если Набор.Количество() > 0 Тогда
// Если записей несколько, мы можем очистить их все, чтобы система создала одну корректную
Набор.Очистить();
Набор.Записать();
Сообщить("Конфликтующие записи успешно удалены. Попробуйте запустить обновление снова.");
КонецЕсли;
После выполнения этого кода необходимо закрыть 1С, убрать параметр запуска /C ОтключитьЛогикуНачалаРаботыСистемы и запустить базу в обычном режиме. Система заново проинициализирует список обработчиков и, не встретив дубля в таблице, успешно продолжит процесс обновления.
В некоторых случаях, когда ошибка повторяется из-за жестко прописанной логики в модулях обновления, программисты используют метод «заглушки». Посмотрим, как это реализовать через механизм расширений, чтобы не снимать основную конфигурацию с поддержки.
Нам необходимо перехватить процедуру, отвечающую за регистрацию обработчиков. Чаще всего это метод ПриДобавленииОбработчиковОбновления в общем модуле подсистемы ВЕТИС.
&Вместо("ПриДобавленииОбработчиковОбновления")
Процедура Расш1_ПриДобавленииОбработчиковОбновления(Обработчики)
// Вызываем оригинальный метод
ПродолжитьВызов(Обработчики);
// После заполнения списка анализируем его и удаляем дубликаты программно
// перед тем как БСП попытается записать их в базу данных
Для Каждого СтрокаОбработчик Из Обработчики Цикл
// Здесь можно добавить логику проверки версий
КонецЦикла;
КонецПроцедуры
Важное замечание: Метод с расширением является «костылем» и рекомендуется только в самых крайних случаях, когда база находится в критическом состоянии, а копии отсутствуют. После успешного обновления такое расширение следует обязательно удалить.
Разберем основные правила безопасного обновления «1С:Бухгалтерии», которые помогут сэкономить время и избежать походов «глубоко в тайгу» за душевным спокойствием:
Подводя итог, отметим, что ошибка с дублированием записей в обработчиках ВЕТИС — это лишь следствие пренебрежения этапностью обновления. Используя инструменты БСП (параметры запуска) и прямую правку регистров, вы сможете восстановить работу системы и успешно завершить процесс актуализации данных.