При развертывании новой информационной базы путем загрузки файла конфигурации (.cf) в чистую базу на платформе 1С:Предприятие 8.3 можно столкнуться с неприятной ситуацией. На этапе первого запуска при выполнении начального заполнения данных (например, в обработке Обработка.НачальноеЗаполнениеИОбновлениеОбъектов) система аварийно завершает работу с исключением вида:
{Обработка.НачальноеЗаполнениеИОбновлениеОбъектов.МодульОбъекта(1386)}: Ошибка при вызове метода контекста (ПолучитьОбъект): В данной транзакции уже происходили ошибки!
При этом при попытке посмотреть ссылку в отладчике мы видим значение «Ошибка получения представления значения». Разберем механизм появления этой ошибки, выясним истинные причины ее возникновения и рассмотрим способы исправления.
Проанализируем природу сообщения «В данной транзакции уже происходили ошибки!». Платформа 1С:Предприятие устроена так, что если внутри открытой транзакции возникает любое исключение (даже если оно затем перехватывается конструкцией Попытка ... Исключение), транзакция помечается платформой как недействительная и обреченная на откат. После этого любая последующая попытка обращения к базе данных (чтение, запись, получение объекта через метод ПолучитьОбъект() или даже формирование строкового представления ссылки) приводит к повторному исключению.
Рассмотрим, почему при отладке трудно найти истинное место сбоя. Когда разработчик ставит точку останова на строке, где упал метод ПолучитьОбъект(), настоящая ошибка уже произошла ранее. Ссылка не может быть прочитана из таблиц базы данных, так как платформа блокирует любые операции в «испорченной» транзакции.
Первопричина кроется в особенностях создания базы из файла .cf. Файл конфигурации содержит только структуру метаданных. В платформе 8.3 предопределенные элементы хранятся непосредственно в таблицах СУБД с признаком ИмяПредопределенныхДанных. При загрузке .cf в пустую базу физические записи для предопределенных элементов планов видов расчета (например, ОкладПоЧасам) или справочников (например, ВидыДоходовНДФЛ) не создаются автоматически до момента их специальной инициализации. Код начального заполнения пытается найти предопределенный элемент по имени, не находит фактической записи в таблице базы, выбрасывает скрытое исключение внутри транзакции, после чего весь процесс обновления завершается сбоем.
Разберем самый простой и рекомендуемый разработчиками прикладных решений вариант. Файлы конфигурации .cf не предназначены для создания чистых баз классических типовых решений поколения 1.2/2.0.
.cf через Конфигуратор в новую базу..dt, который идет в комплекте поставки дистрибутива. В таких базах таблицы предопределенных данных уже сформированы и проинициализированы.Если в вашем распоряжении есть только файлы конфигураций, воспользуйтесь практическим решением, подтвержденным на практике:
.cf предыдущего стабильного релиза (например, версии 1.2.38).Рассмотрим, как можно принудительно заставить платформу 1С создать физические записи предопределенных элементов до запуска алгоритмов первоначального заполнения. Для этого можно воспользоваться внешней обработкой или запустить короткий фрагмент кода в привилегированном режиме.
Выполним обновление предопределенных данных для всей информационной базы:
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
Если сбой происходит на конкретных объектах метаданных (например, на плане видов расчета ОсновныеНачисленияРаботников или справочнике ВидыДоходовНДФЛ), обновим их точечно перед вызовом процедур начального заполнения:
// Принудительное обновление предопределенных элементов плана видов расчета
ПланыВидовРасчета.ОсновныеНачисленияРаботников.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
ПланыВидовРасчета.ОсновныеНачисленияРаботников.ОбновитьПредопределенныеДанные();
// Принудительное обновление предопределенных элементов справочника
Справочники.ВидыДоходовНДФЛ.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
Справочники.ВидыДоходовНДФЛ.ОбновитьПредопределенныеДанные();
Платформа позволяет выполнить принудительную инициализацию предопределенных данных через командную строку пакетом. Для этого выполним запуск Конфигуратора со специальным ключом:
Параметр командной строки:
1cv8.exe DESIGNER /IBConnectionString "<СтрокаСоединения>" /SetPredefinedDataUpdate -UpdateAutomatically
После отработки ключа выполним обновление конфигурации базы данных (клавиша F7), после чего все предопределенные значения физически появятся в таблицах СУБД.
Посмотрим на настройки объектов в самом Конфигураторе:
Обновление предопределенных данных.Авто, переключим его на Обновлять автоматически.Если подобная ошибка возникает в доработанной конфигурации и вы не знаете, какой именно объект привел к поломке транзакции, применим правильную методику отладки:
Попытка ... Исключение.EXCP и EXCPCNTX в конфигурационном файле logcfg.xml. В журнале будет точно зафиксировано исходное системное исключение СУБД или платформы с полным стеком вызовов.