Ошибки при обновлении типовых конфигураций 1С — ситуация, с которой рано или поздно сталкивается каждый пользователь. Одной из самых коварных является ошибка «Предопределенный элемент отсутствует в данных». Она блокирует процесс завершения обновления в режиме «1С:Предприятие», не позволяя выполнять обработчики обновления информационной базы. Рассмотрим подробнее, почему возникает эта проблема и как ее решить, особенно если вы используете базовую версию программы.
Для начала проанализируем ситуацию с технической точки зрения. В системе 1С существуют так называемые «предопределенные элементы» — это записи в справочниках или планах счетов, которые созданы разработчиками на уровне метаданных. Они имеют уникальные идентификаторы (UUID), по которым к ним обращается программный код. В пользовательском режиме такие элементы обычно отмечены иконкой с «желтым шариком».
Ошибка возникает в тот момент, когда в конфигурации (в программном коде) описание элемента есть, а в таблице базы данных соответствующая запись либо удалена, либо потеряла связь со своим «программным» двойником. Чаще всего это происходит в справочнике ВидыРегистровУчета при обновлении на релизы линейки 3.0.73.х. Система пытается найти элемент РегистрыБУСубъектовМалогоПредпринимательства, не находит его физически в базе и аварийно завершает работу.
Выясним причины такого поведения базы:
1Cv8.1CD хранится в папке Яндекс.Диска или Dropbox, облачный клиент может заблокировать файл в момент записи, что приводит к частичной потере данных.Прежде чем приступать к любым манипуляциям, обязательно сделаем резервную копию. Рассмотрим, как это сделать правильно для базовой версии:
Запустим систему в режиме «Конфигуратор». Перейдем в меню «Администрирование» — «Выгрузить информационную базу». Сохраним файл с расширением .dt в надежное место. Также рекомендуется просто скопировать файл 1Cv8.1CD из папки с базой в отдельный архивный каталог.
Первым делом попробуем решить проблему штатными средствами платформы. Проанализируем настройки режима «Тестирование и исправление» (ТиИ). При обслуживании нескольких конфигураций этот процесс, включая создание резервных копий, удобно запускать по расписанию через автоматическое архивирование, обновление и тестирование 1С без участия пользователя.
Нажмем «Выполнить». Этот процесс может заставить систему пересоздать потерянные записи, хотя они могут появиться как «Объект не найден» или обычные элементы без «желтого шарика».
Если ТиИ не помогло, воспользуемся методом, который помог большинству пользователей в обсуждении — восстановлением предопределенных элементов через внешнюю обработку. Для этого можно использовать типовую обработку от 1С УстановкаИдентификаторовПредопределенныхДанных.epf или аналогичные инструменты для поиска и замены дублей.
Разберем алгоритм работы с такой обработкой:
ВидыРегистровУчета.РегистрыБУСубъектовМалогоПредпринимательства. Если он отображается как обычный элемент, нам нужно сопоставить его с именем в метаданных.После этого у элемента должен снова появиться значок предопределенного данных. Теперь можно повторно запустить процедуру обновления.
Существует программный метод заставить 1С пересчитать связи предопределенных данных при старте. Для этого можно использовать параметр командной строки. Посмотрим, как это настроить:
В окне запуска 1С выберем нужную базу, нажмем кнопку «Изменить». На последней вкладке в поле «Дополнительные параметры запуска» впишем следующую команду:
/SetPredefinedDataUpdate Update
Запустим базу. В этом режиме платформа принудительно обновляет идентификаторы предопределенных объектов, сверяя их с конфигурацией. После успешного запуска этот параметр нужно обязательно удалить.
Если вы обладаете минимальными навыками работы с кодом, можно выполнить небольшую процедуру во внешнем отчете или обработке. Проанализируем пример кода, который восстанавливает связь элемента справочника:
Процедура ВосстановитьПредопределенныйЭлемент()
СправочникОбъект = Справочники.ВидыРегистровУчета.НайтиПоНаименованию("Регистры субъектов малого предпринимательства").ПолучитьОбъект();
Если СправочникОбъект <> Неопределено Тогда
СправочникОбъект.ИмяПредопределенныхДанных = "РегистрыБУСубъектовМалогоПредпринимательства";
Попытка
СправочникОбъект.Записать();
Сообщить("Связь успешно восстановлена!");
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Этот код напрямую прописывает имя предопределенного элемента в поле ИмяПредопределенныхДанных, которое скрыто в обычном пользовательском интерфейсе, но доступно через объектную модель 1С.
Рассмотрим рекомендации, которые помогут минимизировать риск возникновения подобных ошибок:
.dt) или используйте специализированные сервисы типа 1С:Линк или 1С:Фреш. Прямое копирование работающего файла .1CD облачным сервисом неизбежно ведет к порче таблиц.Подводя итог, отметим: если вы бухгалтер и столкнулись с такой проблемой в базовой версии, наиболее эффективным и безопасным путем будет использование параметра /SetPredefinedDataUpdate или запуск ТиИ с созданием потерянных объектов. Эти методы не требуют глубоких навыков программирования и позволяют «протолкнуть» зависшее обновление в автоматическом режиме.