При обновлении конфигурации распределенной информационной базы (РИБ) в подчиненном узле после успешного применения изменений в конфигураторе запуск программы в режиме 1С:Предприятие может завершиться аварийно с системным сообщением «В данной транзакции уже происходили ошибки». Разберем механику возникновения этого сбоя, методы поиска истинной причины и пошаговые сценарии восстановления работоспособности базы данных.
Сообщение «В данной транзакции уже происходили ошибки» не является первопричиной проблемы. Это вторичная реакция платформы 1С. Когда внутри транзакции СУБД (вызванной явно методом НачатьТранзакцию() или неявно при записи объекта) происходит исключительная ситуация, платформа переводит текущую транзакцию в состояние Rollback-only (только для отмены).
Если разработчики применили конструкцию Попытка ... Исключение, перехватили исходное исключение, но не выполнили откат текущей транзакции через ОтменитьТранзакцию(), любое следующее действие с базой данных (запись константы, чтение реквизита, фиксация ошибки в служебном регистре) вызывает повторный сбой с текстом о том, что в транзакции уже был зарегистрирован сбой. Вложенных транзакций на уровне СУБД в платформе 1С нет — повторные вызовы НачатьТранзакцию() лишь увеличивают счетчик вложенности, и сбой во внутреннем блоке делает невозможным сохранение всех изменений внешнего блока.
При старте узла РИБ в режиме предприятия запускаются фоновые и монопольные процедуры обновления Библиотеки стандартных подсистем (БСП). Если файл обмена загрузился не полностью, нарушилась структура данных или обработчик упал на дублях предопределенных элементов, система пытается обработать сбой в невалидной транзакции и прерывает работу.
Для поиска реального сбоя выполним диагностику:
Администрирование -> Журнал регистрации. Установим отбор по событиям со статусом Ошибка и Предупреждение, предшествующим моменту падения сеанса. Первичная ошибка обычно содержит конкретное описание: нарушение уникальности индекса, деление на ноль в обработчике обновления или повреждение структуры метаданных.Отладка -> Остановка по ошибке включим флаг «Останавливаться по ошибке» и обязательно снимем флаг «Исключая ошибки, обрабатываемые в блоке Попытка-Исключение». В этом случае отладчик остановит выполнение кода ровно в момент возникновения первичного исключения, до перевода транзакции в невалидное состояние.Если диагностика показала, что файл обновления пришел поврежденным или изменения конфигурации базы данных применились частично, выполним следующие действия:
F7).Если сбой возник на этапе выполнения фоновых процедур обновления данных, запустим сеанс предприятия с явным указанием параметра командной строки. Для этого в окне запуска 1С в параметрах информационной базы пропишем следующий параметр запуска:
/C ЗапуститьОбновлениеИнформационнойБазы
Данный ключ инициирует последовательное монопольное выполнение всех регламентных процедур обновления информационной базы с выводом детального прогресса на экран.
Рассинхронизация кэша метаданных часто провоцирует сбои при обращении к измененным реквизитам. Выполним регламентные процедуры очистки и проверки:
AppData\Local\1C\1cv8 и AppData\Roaming\1C\1cv8 на компьютере пользователя.Администрирование -> Тестирование и исправление.В ситуациях, когда пакет обмена между узлами заблокирован или конфигурации критически рассинхронизировались, применим ручное выравнивание конфигурации с временным отключением подчиненного узла:
Конфигурация -> Сохранить конфигурацию в файл выгрузим файл конфигурации .cf актуальной версии.
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
Конфигурация -> Загрузить конфигурацию из файла, указав полученный файл .cf, и применим изменения (F7).
// Вместо "ИмяПланаОбмена" укажем имя плана обмена РИБ, вместо "КодЦУ" - код главного узла
ГлавныйУзелСсылка = ПланыОбмена.ИмяПланаОбмена.НайтиПоКоду("КодЦУ");
ПланыОбмена.УстановитьГлавныйУзел(ГлавныйУзелСсылка);
После восстановления привязки узел РИБ продолжит работу в штатном режиме, а последующие обмены данными будут проходить без транзакционных ошибок.