Как обновить измененную конфигурацию 1С, если в ней удалялись и заново добавлялись одни и те же объекты, и избежать потери данных?

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

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

В этой статье мы подробно разберем, почему возникает эта проблема, как устроены внутренние механизмы платформы «1С:Предприятие», и рассмотрим несколько надежных практических способов исправления ситуации без потери ценных данных в рабочей базе.

Техническая суть проблемы: почему «съезжают» идентификаторы?

Давайте разберем внутреннюю кухню платформы 1С. Каждый объект метаданных в конфигурации идентифицируется двумя параметрами:

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

Когда мы выполняем обычное сравнение двух конфигураций через файлы .cf, платформа пытается сопоставить объекты в первую очередь по имени. Но при обновлении информационной базы, находящейся на поддержке, сопоставление выполняется строго по UUID.

Если в процессе разработки объект был удален и создан заново под тем же именем, его UUID изменился. С точки зрения СУБД и механизма обновления 1С это абсолютно другой, новый объект. При обновлении конфигурации базы данных платформа выполнит две операции:

Наша задача — восстановить соответствие идентификаторов между рабочей базой и конфигурацией поставщика. Ниже мы рассмотрим наиболее эффективные методики решения этой проблемы.

---

Способ 1. Восстановление связей через выгрузку и загрузку конфигурации в файлы XML

Начиная с версии платформы 8.3, разработчикам доступен мощный инструмент — выгрузка конфигурации в текстовые файлы XML. Этот способ является наиболее технологичным и чистым, так как позволяет точечно «подменить» съехавшие UUID на оригинальные UUID из конфигурации поставщика без написания сложных обработок переноса данных.

Рассмотрим этот процесс по шагам:

  1. Создание резервных копий. Обязательно сделайте резервную копию рабочей базы данных и сохраните рабочую конфигурацию в файл .cf.
  2. Выгрузка рабочей конфигурации в файлы. Откройте конфигуратор рабочей базы, выберите пункт меню Конфигурация -> Выгрузить конфигурацию в файлы... и укажите пустую папку (например, C:\XML_Work).
  3. Выгрузка конфигурации поставщика. Сохраните чистую конфигурацию поставщика аналогичного релиза в файл .cf. Создайте для нее пустую базу, откройте ее конфигуратор и также выгрузите в другую папку (например, C:\XML_Vendor).
  4. Поиск проблемного объекта. Откройте папки с выгруженными файлами. Метаданные каждого объекта хранятся в отдельных XML-файлах. Например, если проблема возникла со справочником «Номенклатура», найдите файл Catalog.Номенклатура.xml (или аналогичный файл для регистра накопления/сведений).
  5. Корректировка UUID. Откройте оба XML-файла в любом удобном текстовом редакторе (например, VS Code или Notepad++). Найдите строку, содержащую уникальный идентификатор объекта (тег <uuid>).

    Скопируйте UUID из файла конфигурации поставщика (папка C:\XML_Vendor) и вставьте его вместо старого UUID в файл вашей рабочей конфигурации (папка C:\XML_Work). Сохраните изменения.

  6. Загрузка исправленной конфигурации. В конфигураторе рабочей базы выберите пункт меню Конфигурация -> Загрузить конфигурацию из файлов... и укажите папку C:\XML_Work.
  7. Обновление базы данных. Запустите обновление конфигурации базы данных (клавиша F7). Платформа увидит, что UUID объекта теперь совпадает с UUID поставщика, и выполнит обновление без удаления таблиц СУБД.

---

Способ 2. Классическая схема с временным переименованием («Стандарт 1С»)

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

Проанализируем этот алгоритм:

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

Рассмотрим пример кода для переноса данных и автоматической замены ссылок:


Процедура ПеренестиДанныеИЗаменитьСсылки() Экспорт
    // Выбираем все элементы из старого переименованного справочника
    ВыборкаСтарая = Справочники.Удалить_Номенклатура.Выбрать();
    
    Пока ВыборкаСтарая.Следующий() Цикл
        // Исключаем группы, если справочник иерархический
        Если ВыборкаСтарая.ЭтоГруппа Тогда
            Продолжить; 
        КонецЕсли;
        
        // Пытаемся найти уже созданный аналог по ключевому реквизиту (например, Код или Артикул)
        НоваяСсылка = Справочники.Номенклатура.НайтиПоРеквизиту("Код", ВыборкаСтарая.Код);
        
        Если НоваяСсылка.Пустая() Тогда
            // Создаем новый элемент с правильным UUID
            НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
            ЗаполнитьЗначенияСвойств(НовыйОбъект, ВыборкаСтарая);
            
            // Если у справочника есть родитель, его тоже нужно корректно перенести
            Если ЗначениеЗаполнено(ВыборкаСтарая.Родитель) Тогда
                // Здесь должна быть логика поиска/создания группы-родителя
            КонецЕсли;
            
            НовыйОбъект.Записать();
            НоваяСсылка = НовыйОбъект.Ссылка;
        КонецЕсли;
        
        // Подготавливаем таблицу для замены ссылок во всей базе данных
        ТаблицаЗамены = Новый ТаблицаЗначений;
        ТаблицаЗамены.Колонки.Добавить("ИсходнаяСсылка");
        ТаблицаЗамены.Колонки.Добавить("НоваяСсылка");
        
        СтрокаЗамены = ТаблицаЗамены.Добавить();
        СтрокаЗамены.ИсходнаяСсылка = ВыборкаСтарая.Ссылка;
        СтрокаЗамены.НоваяСсылка = НоваяСсылка;
        
        // Выполняем поиск и замену ссылок средствами платформы
        Попытка
            ЗаменитьСсылки(ТаблицаЗамены);
            Сообщить("Успешно заменена ссылка для: " + ВыборкаСтарая.Наименование);
        Исключение
            ЗаписьЖурналаРегистрации("ПереносДанных", УровеньЖурналаРегистрации.Ошибка,,, 
                ОписаниеОшибки());
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

---

Способ 3. Использование механизма ручного сопоставления объектов

В некоторых случаях, если рассинхронизация UUID произошла при сравнении с внешним файлом конфигурации (например, при выборочном переносе доработок из тестовой базы), мы можем воспользоваться встроенным интерактивным механизмом платформы.

Выполним следующие действия:

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

Важное примечание: Этот способ отлично подходит для разового переноса кода и неструктурных изменений (форм, макетов, модулей). Однако он не решает проблему кардинально на уровне конфигурации базы данных, если вы планируете в дальнейшем обновляться стандартными файлами обновлений (.cfu) от поставщика. Для долгосрочного решения лучше использовать Способ 1 или Способ 2.

---

Резюме и рекомендации

Для того чтобы избежать подобных критических проблем в будущем, мы рекомендуем соблюдать простые правила разработки в среде «1С:Предприятие 8»:

← На главную