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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Понимание сути проблемы: почему важен UUID

В платформе 1С каждый объект метаданных (документ, справочник, реквизит) имеет уникальный внутренний идентификатор — UUID (или GUID). Платформа сопоставляет колонки в таблицах SQL с объектами в дереве метаданных именно по этому идентификатору, а не по имени. Если вы просто добавите реквизит с тем же именем вручную, 1С присвоит ему новый UUID. В результате при обновлении конфигурации базы данных (нажатие клавиши F7) платформа решит, что старый реквизит нужно удалить, а новый (пустой) — создать. Это приведет к безвозвратной потере данных в соответствующей колонке таблицы SQL.

Способ 1. Восстановление через сравнение и объединение (рекомендуемый)

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

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

После этого, если мы накатим этот cf на базу данных, платформа увидит, что структура не изменилась (объект с таким UUID уже есть), и колонка в SQL не будет затронута.

Способ 2. Использование выгрузки конфигурации в файлы (XML)

Разберем ситуацию, когда реквизит нужно восстановить в уже подготовленном наборе из нескольких cf-файлов. Платформа 8.3 позволяет работать с метаданными как с набором XML-файлов, что дает нам полный контроль над UUID.

  1. Выгрузим «здоровую» конфигурацию (где реквизит есть) в файлы через меню Конфигурация — Разработка конфигурации — Выгрузить конфигурацию в файлы.
  2. Аналогично выгрузим «испорченную» конфигурацию в другую папку.
  3. Найдем в папке со «здоровой» конфигурацией XML-файл нужного объекта (например, Document.РеализацияТоваровУслуг.xml).
  4. Откроем его любым текстовым редактором и найдем блок <ChildObjects>, а в нем — узел <Attribute> нашего реквизита. Скопируем весь этот блок вместе с тегом uuid.
  5. Вставим этот блок в соответствующий файл «испорченной» конфигурации.
  6. Загрузим конфигурацию обратно из файлов через меню Загрузить конфигурацию из файлов.

Этот метод гарантирует 100% восстановление идентичности объекта, так как мы буквально переносим системный идентификатор вручную.

Способ 3. Прямое восстановление данных через SQL (если обновление уже выполнено)

Рассмотрим худший сценарий: вы уже обновили конфигурацию базы данных, нажали «Принять изменения», и колонка в SQL физически удалилась. Если у вас есть бэкап базы до обновления, данные можно спасти.

Проанализируем алгоритм действий в SQL Server Management Studio:

  1. Восстановим в 1С реквизит (даже с новым UUID). Это создаст новую пустую колонку в таблице базы данных.
  2. Выясним имя таблицы и колонки в 1С. Это можно сделать с помощью функции ПолучитьСтруктуруХраненияБазыДанных().
  3. Выполним SQL-запрос для переноса данных из копии (бэкапа) в текущую базу. Пример логики запроса:

-- Предположим, _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 прыжков»

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

Рекомендуется использовать следующий подход:

Работа с идентификаторами объектов метаданных (БСП)

Посмотрим на ситуацию со стороны программной логики. Если ваша конфигурация использует Библиотеку Стандартных Подсистем (БСП), то после любого удаления и восстановления реквизита необходимо обновить справочник Идентификаторы объектов метаданных. Без этого могут возникнуть ошибки в правах доступа или при работе дополнительных реквизитов и сведений.

Для принудительного обновления идентификаторов программно выполните следующий код:

Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();

Или воспользуйтесь типовой обработкой «Обслуживание» — «Обновление конфигурации» в пользовательском режиме.

Итоги и рекомендации

Подведем итог нашему разбору. Чтобы не потерять данные при случайном удалении реквизита:

  1. Всегда делайте промежуточные копии перед каждым обновлением конфигурации базы данных (F7).
  2. При восстановлении объекта используйте сравнение/объединение для сохранения UUID.
  3. Если объектов много, используйте выгрузку в XML-файлы для массовой проверки идентификаторов.
  4. Если данные уже удалены из SQL, используйте временные таблицы для восстановления данных из бэкапа по ссылке (_IDRRef).

Соблюдение этих правил позволит вам уверенно проводить даже самые сложные обновления, сохраняя целостность данных и структуры системы.

← На главную