Почему возникает ошибка «В данной транзакции уже происходили ошибки» при начальном заполнении новой базы 1С?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При развертывании новой информационной базы путем загрузки файла конфигурации (.cf) в чистую базу на платформе 1С:Предприятие 8.3 можно столкнуться с неприятной ситуацией. На этапе первого запуска при выполнении начального заполнения данных (например, в обработке Обработка.НачальноеЗаполнениеИОбновлениеОбъектов) система аварийно завершает работу с исключением вида:

{Обработка.НачальноеЗаполнениеИОбновлениеОбъектов.МодульОбъекта(1386)}: Ошибка при вызове метода контекста (ПолучитьОбъект): В данной транзакции уже происходили ошибки!

При этом при попытке посмотреть ссылку в отладчике мы видим значение «Ошибка получения представления значения». Разберем механизм появления этой ошибки, выясним истинные причины ее возникновения и рассмотрим способы исправления.

Механизм возникновения проблемы: почему транзакция блокируется

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

Рассмотрим, почему при отладке трудно найти истинное место сбоя. Когда разработчик ставит точку останова на строке, где упал метод ПолучитьОбъект(), настоящая ошибка уже произошла ранее. Ссылка не может быть прочитана из таблиц базы данных, так как платформа блокирует любые операции в «испорченной» транзакции.

Первопричина кроется в особенностях создания базы из файла .cf. Файл конфигурации содержит только структуру метаданных. В платформе 8.3 предопределенные элементы хранятся непосредственно в таблицах СУБД с признаком ИмяПредопределенныхДанных. При загрузке .cf в пустую базу физические записи для предопределенных элементов планов видов расчета (например, ОкладПоЧасам) или справочников (например, ВидыДоходовНДФЛ) не создаются автоматически до момента их специальной инициализации. Код начального заполнения пытается найти предопределенный элемент по имени, не находит фактической записи в таблице базы, выбрасывает скрытое исключение внутри транзакции, после чего весь процесс обновления завершается сбоем.

Способ 1. Создание базы из типового шаблона поставки (.dt)

Разберем самый простой и рекомендуемый разработчиками прикладных решений вариант. Файлы конфигурации .cf не предназначены для создания чистых баз классических типовых решений поколения 1.2/2.0.

  1. Не загружайте пустой файл конфигурации .cf через Конфигуратор в новую базу.
  2. Создайте информационную базу стандартным способом через мастер добавления базы: выберите пункт «Создание информационной базы из шаблона» и укажите нужную версию конфигурации поставщика.
  3. Если шаблон недоступен, загрузите файл демонстрационной базы или чистой базы в формате .dt, который идет в комплекте поставки дистрибутива. В таких базах таблицы предопределенных данных уже сформированы и проинициализированы.

Способ 2. Обновление через предыдущий релиз конфигурации

Если в вашем распоряжении есть только файлы конфигураций, воспользуйтесь практическим решением, подтвержденным на практике:

  1. Загрузите в чистую базу файл .cf предыдущего стабильного релиза (например, версии 1.2.38).
  2. Запустите информационную базу в режиме «1С:Предприятие» и дайте ей полностью завершить процедуры начального заполнения и создания предопределенных элементов.
  3. После успешного входа закройте предприятие и выполните штатное обновление конфигурации на целевую версию (например, 1.2.39) через меню Конфигуратора «Конфигурация — Поддержка — Обновить конфигурацию».

Способ 3. Принудительное программное обновление предопределенных данных

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

Выполним обновление предопределенных данных для всей информационной базы:


УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);

Если сбой происходит на конкретных объектах метаданных (например, на плане видов расчета ОсновныеНачисленияРаботников или справочнике ВидыДоходовНДФЛ), обновим их точечно перед вызовом процедур начального заполнения:


// Принудительное обновление предопределенных элементов плана видов расчета
ПланыВидовРасчета.ОсновныеНачисленияРаботников.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
ПланыВидовРасчета.ОсновныеНачисленияРаботников.ОбновитьПредопределенныеДанные();

// Принудительное обновление предопределенных элементов справочника
Справочники.ВидыДоходовНДФЛ.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
Справочники.ВидыДоходовНДФЛ.ОбновитьПредопределенныеДанные();

Способ 4. Использование параметров запуска Конфигуратора

Платформа позволяет выполнить принудительную инициализацию предопределенных данных через командную строку пакетом. Для этого выполним запуск Конфигуратора со специальным ключом:

Параметр командной строки:

1cv8.exe DESIGNER /IBConnectionString "<СтрокаСоединения>" /SetPredefinedDataUpdate -UpdateAutomatically

После отработки ключа выполним обновление конфигурации базы данных (клавиша F7), после чего все предопределенные значения физически появятся в таблицах СУБД.

Способ 5. Изменение свойств метаданных в дереве конфигурации

Посмотрим на настройки объектов в самом Конфигураторе:

  1. Откроем дерево метаданных и найдем проблемный объект (план видов расчета или справочник).
  2. Откроем палитру свойств объекта и найдем свойство Обновление предопределенных данных.
  3. Если значение свойства установлено в Авто, переключим его на Обновлять автоматически.
  4. Применим изменения конфигурации базы данных (клавиша F7) и повторим запуск начального заполнения.

Как правильно диагностировать скрытые ошибки в транзакциях

Если подобная ошибка возникает в доработанной конфигурации и вы не знаете, какой именно объект привел к поломке транзакции, применим правильную методику отладки:

  1. Настройка отладчика на перехват всех исключений. Откроем в Конфигураторе меню «Отладка — Настройка остановки по ошибке». Установим флажок «Останавливаться по ошибке» и обязательно снимем ограничение «Только для необрабатываемых исключений». Это позволит отладчику зафиксировать самый первый сбой (до того, как транзакция перейдет в аварийный режим), даже если этот блок кода обернут в конструкцию Попытка ... Исключение.
  2. Использование технологического журнала. Настроим сбор событий EXCP и EXCPCNTX в конфигурационном файле logcfg.xml. В журнале будет точно зафиксировано исходное системное исключение СУБД или платформы с полным стеком вызовов.
← На главную