При обновлении сильно измененных конфигураций «1С:Предприятие» разработчики часто сталкиваются с ситуацией, когда в процессе очистки метаданных от «мусора» (старых неиспользуемых реквизитов с префиксами «Удалить_») случайно удаляется действующий доработанный объект. Если это обнаруживается уже после подготовки нескольких промежуточных файлов конфигурации (.cf), возникает серьезная проблема: как вернуть реквизит, сохранив его внутренний идентификатор и, что самое главное, накопленные в базе данные. Рассмотрим подробно, как выйти из этой ситуации максимально эффективно.
В платформе 1С каждый объект метаданных (документ, справочник, реквизит) имеет уникальный внутренний идентификатор — UUID (или GUID). Платформа сопоставляет колонки в таблицах SQL с объектами в дереве метаданных именно по этому идентификатору, а не по имени. Если вы просто добавите реквизит с тем же именем вручную, 1С присвоит ему новый UUID. В результате при обновлении конфигурации базы данных (нажатие клавиши F7) платформа решит, что старый реквизит нужно удалить, а новый (пустой) — создать. Это приведет к безвозвратной потере данных в соответствующей колонке таблицы SQL.
Проанализируем самый надежный метод, который позволяет вернуть реквизит «на место» с сохранением его исходного UUID. Этот метод лучше всего использовать до того, как изменения были применены к рабочей базе данных.
.cf), где этот реквизит еще существовал.После этого, если мы накатим этот cf на базу данных, платформа увидит, что структура не изменилась (объект с таким UUID уже есть), и колонка в SQL не будет затронута.
Разберем ситуацию, когда реквизит нужно восстановить в уже подготовленном наборе из нескольких cf-файлов. Платформа 8.3 позволяет работать с метаданными как с набором XML-файлов, что дает нам полный контроль над UUID.
Document.РеализацияТоваровУслуг.xml).<ChildObjects>, а в нем — узел <Attribute> нашего реквизита. Скопируем весь этот блок вместе с тегом uuid.Этот метод гарантирует 100% восстановление идентичности объекта, так как мы буквально переносим системный идентификатор вручную.
Рассмотрим худший сценарий: вы уже обновили конфигурацию базы данных, нажали «Принять изменения», и колонка в SQL физически удалилась. Если у вас есть бэкап базы до обновления, данные можно спасти.
Проанализируем алгоритм действий в SQL Server Management Studio:
ПолучитьСтруктуруХраненияБазыДанных().
-- Предположим, _InfoRg123 — это таблица документа, а _Fld456 — наш реквизит
UPDATE TargetTable
SET TargetTable._Fld456_New = SourceTable._Fld456_Old
FROM Base1C.dbo._Document100 AS TargetTable
INNER JOIN BackupBase1C.dbo._Document100 AS SourceTable
ON TargetTable._IDRRef = SourceTable._IDRRef
Важно: этот метод требует особой осторожности и понимания структуры таблиц 1С. Перед выполнением любых UPDATE в SQL обязательно сделайте свежий бэкап.
Выясним причину, почему стратегия последовательного обновления через 10 промежуточных файлов (cf) является рискованной. Каждый такой «прыжок» увеличивает вероятность человеческой ошибки (забыли поставить галочку, случайно удалили объект). Кроме того, в типовых конфигурациях при каждом запуске срабатывают обработчики обновления данных (БСП).
Рекомендуется использовать следующий подход:
cf), который содержит все изменения метаданных за все 10 релизов.cf.Посмотрим на ситуацию со стороны программной логики. Если ваша конфигурация использует Библиотеку Стандартных Подсистем (БСП), то после любого удаления и восстановления реквизита необходимо обновить справочник Идентификаторы объектов метаданных. Без этого могут возникнуть ошибки в правах доступа или при работе дополнительных реквизитов и сведений.
Для принудительного обновления идентификаторов программно выполните следующий код:
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();
Или воспользуйтесь типовой обработкой «Обслуживание» — «Обновление конфигурации» в пользовательском режиме.
Подведем итог нашему разбору. Чтобы не потерять данные при случайном удалении реквизита:
_IDRRef).Соблюдение этих правил позволит вам уверенно проводить даже самые сложные обновления, сохраняя целостность данных и структуры системы.