В процессе работы с конфигурацией «1С:Бухгалтерия» (например, редакция 2.0 для Украины) пользователи могут столкнуться с критической ошибкой при попытке изменить параметры учета. Типичный сценарий: вы заходите в настройки параметров учета на вкладку «Сотрудники и зарплата», пытаетесь переключить способ ведения учета на вариант «Во внешней программе» и при нажатии кнопки «Записать и закрыть» получаете сообщение:
В текущей транзакции уже происходили ошибки! {ОбщаяФорма.ПараметрыУчета.Форма (61)}: Записать (ПараметрыЗаписи)
Давайте разберем, почему возникает эта ошибка и как поэтапно найти её истинную причину и устранить проблему.
Важно понимать, что сообщение «В текущей транзакции уже происходили ошибки» само по себе не объясняет причину сбоя. Это лишь констатация факта: внутри программного блока, обернутого в транзакцию (когда система пытается гарантированно записать набор данных), что-то пошло не так. Произошла первичная ошибка (например, не заполнено обязательное поле, нарушена логика или произошел программный сбой), транзакция пометилась как «битая», но код попытался выполнить следующую операцию записи, что и вызвало данное сообщение.
Наша задача — пробиться сквозь это вторичное сообщение и найти «первоисточник» проблемы.
Прежде чем открывать конфигуратор, проанализируем записи системы. Часто 1С успевает зафиксировать первичную ошибку в Журнале регистрации.
Поле 'Подразделение' не заполнено или Прекращение работы из-за нарушения прав доступа.Это самый надежный способ для программиста. Нам нужно настроить отладчик так, чтобы он останавливался в момент возникновения самой первой ошибки, даже если она перехвачена блоком Попытка ... Исключение.
Выполним следующие действия:
Теперь система «замрет» именно на той строке кода, где возникла первичная проблема. Проанализируем значения переменных и текст ошибки в окне «Локальные переменные» или через «Вычислить выражение».
При смене режима учета зарплаты (с «В текущей программе» на «Во внешней») система выполняет проверку на наличие уже введенных документов. Если в базе уже есть созданные документы Прием на работу, Начисление зарплаты или ведомости, программная логика может блокировать запись настроек.
Проанализируем ситуацию:
Иногда корень проблемы кроется в нарушении логической целостности таблиц БД. Выясним, нет ли в базе «битых» ссылок.
Выполним процедуру ТиИ:
После завершения проверим, исчезла ли ошибка при записи параметров учета.
Для конфигураций на платформе 8.3 (особенно для редакции 2.0) характерны ошибки, связанные с кэшированием форм и метаданных. Если код конфигурации верный, но ошибка сохраняется, выполним очистку:
Рассмотрим вариант ручной очистки:
8.3.х соответствует требованиям релиза конфигурации (в данном случае 2.0.17.2).Если вы программист, проанализируйте, что происходит в момент вызова метода Записать() в форме параметров учета. В типовой конфигурации это может выглядеть примерно так:
Процедура ЗаписатьПараметры(ПараметрыЗаписи)
НачатьТранзакцию();
Попытка
// Запись констант
Константы.ИспользоватьВнешнююПрограммуДляЗарплаты.Установить(Истина);
// Запись наборов записей регистров
Набор = РегистрыСведений.ПараметрыУчетаЗарплаты.СоздатьНаборЗаписей();
Набор.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение; // Здесь может возникнуть вторичная ошибка
КонецПопытки;
КонецПроцедуры
Проанализируем ситуацию: если внутри блока Попытка происходит ошибка, вызывается ОтменитьТранзакцию(). Если после этого код все равно пытается выполнить Записать() для другого объекта в рамках той же процедуры, возникнет обсуждаемая ошибка транзакции. Проверьте все подписки на события ПередЗаписью и ПриЗаписи для регистров сведений, в которые вносятся изменения.
Для исправления ошибки «В текущей транзакции уже происходили ошибки»: