Как восстановить коды элементов справочника из резервной копии базы 1С?

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

В процессе работы с базой данных 1С нередко возникают ситуации, когда коды справочников (например, Контрагенты) изменяются из-за ошибок пользователей, некорректной работы обработок или сбоев при обмене данными. Если коды уже ушли в сопряженные системы (например, в «1С:Бухгалтерию»), это приводит к дублированию записей. Рассмотрим детально, как вернуть правильные коды из бэкапа, сохранив при этом актуальность остальных данных в рабочей базе.

Проверка идентичности объектов (сопоставление по GUID)

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

Проанализируем ситуацию: если идентификаторы совпадают, наша задача сводится к простому алгоритму: получить соответствие «GUID — Старый Код» из копии и применить его в рабочей базе.

Способ 1: Использование программного скрипта (самый гибкий метод)

Рассмотрим вариант написания небольшой обработки, которая выполнит задачу в два этапа: выгрузка данных из копии и их загрузка в рабочую базу. Проанализируем пример кода, который часто предлагают нейросети, и исправим его для корректной работы в реальной среде 1С.

Этап 1: Выгрузка данных из резервной копии

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


// Создаем текстовый документ для хранения данных
ФайлРезультат = Новый ТекстовыйДокумент;

// Выбираем все элементы справочника Контрагенты
Выборка = Справочники.Контрагенты.Выбрать();

Пока Выборка.Следующий() Цикл
    // Пропускаем группы, если нужно восстановить коды только элементов
    Если Выборка.ЭтоГруппа Тогда
        Продолжить;
    КонецЕсли;
    
    // Получаем строковое представление GUID и код
    СтрGUID = Строка(Выборка.Ссылка.УникальныйИдентификатор());
    ТекущийКод = Выборка.Код;
    
    // Записываем строку в формате GUID;Код
    ФайлРезультат.ДобавитьСтроку(СтрGUID + ";" + ТекущийКод);
КонецЦикла;

// Сохраняем файл на диск
ФайлРезультат.Записать("C:\Temp\OldCodes.txt");
Сообщить("Выгрузка завершена!");

Этап 2: Загрузка данных в рабочую базу

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


Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("C:\Temp\OldCodes.txt");

Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
    СтрокаДанных = Текст.ПолучитьСтроку(НомерСтроки);
    ЧастиСтроки = СтрРазделить(СтрокаДанных, ";");
    
    Если ЧастиСтроки.Количество() < 2 Тогда
        Продолжить;
    КонецЕсли;
    
    СтрокаGUID = ЧастиСтроки[0];
    СтарыйКод = ЧастиСтроки[1];
    
    // Формируем ссылку по GUID
    СсылкаНаОбъект = Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID));
    
    // Проверяем существование объекта в базе
    Если НЕ СсылкаНаОбъект.Пустая() Тогда
        Объект = СсылкаНаОбъект.ПолучитьОбъект();
        Если Объект <> Неопределено Тогда
            // Устанавливаем режим загрузки, чтобы обойти проверки уникальности и модули объекта
            Объект.ОбменДанными.Загрузка = Истина;
            Объект.Код = СтарыйКод;
            
            Попытка
                Объект.Записать();
            Исключение
                Сообщить("Ошибка при записи контрагента: " + СсылкаНаОбъект + " - " + ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;
Сообщить("Восстановление кодов завершено!");

Способ 2: Загрузка данных из табличного документа

Если вы не хотите писать код, можно воспользоваться стандартной обработкой ЗагрузкаДанныхИзТабличногоДокумента.epf (часто доступна на дисках ИТС или в составе инструментов разработчика). Посмотрим, как реализовать задачу с ее помощью:

  1. В базе-копии сформируем список контрагентов. Можно воспользоваться стандартным выводом списка или применить консоль запросов, выбрав колонки «Ссылка» (это даст нам внутренний идентификатор) и «Код».
  2. Сохраним этот список в формате Excel.
  3. В рабочей базе откроем обработку «Загрузка данных из табличного документа» или её аналог «Универсальная загрузка из Excel».
  4. Выберем режим загрузки в справочник Контрагенты.
  5. Настроим поля поиска. Внимание: для колонки со ссылкой в настройках поля необходимо указать «Искать по внутреннему идентификатору». Это обеспечит стопроцентное попадание именно в тот элемент, который был в копии.
  6. Снимите галочки со всех реквизитов, кроме кода, чтобы не затереть изменения в наименованиях, адресах или ИНН, внесенные пользователями после создания бэкапа.
  7. Нажмите кнопку «Загрузить».

Решение проблемы коллизий (дублей кодов)

Выясним причину возможной неудачи при записи. Если в рабочей базе уже появился новый элемент с кодом, который вы пытаетесь вернуть старому элементу, система выдаст ошибку уникальности. Проанализируем методы борьбы с этим:

Во-первых, использование свойства Объект.ОбменДанными.Загрузка = Истина позволяет игнорировать стандартные проверки уникальности платформы в момент записи. Однако это может привести к тому, что в базе появятся два элемента с одинаковыми кодами. Если это недопустимо, применим двухэтапную схему:

Использование инструментов разработчика (ИР)

Рассмотрим более продвинутый вариант. Если у вас установлены «Инструменты разработчика» (ИР), задача решается еще быстрее через консоль кода или универсальную загрузку данных. Инструмент «Загрузка табличных данных» в ИР гораздо мощнее стандартного, так как позволяет напрямую работать с GUID и выполнять произвольные алгоритмы при записи.

Также можно воспользоваться обработкой ВыгрузкаЗагрузкаДанныхXML.epf. Но будьте крайне осторожны: при стандартной загрузке XML объект переписывается целиком. Чтобы восстановить только код, этот метод не подходит в чистом виде, так как он затрет все изменения в документах и реквизитах, произошедшие с момента создания копии.

Важные рекомендации и меры предосторожности

Перед выполнением любых массовых изменений в рабочей базе необходимо выполнить следующие действия:

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

Таким образом, мы выяснили, что наиболее безопасным и точным методом является программная перезапись реквизита Код с сопоставлением по УникальныйИдентификатор и установкой флага Загрузка = Истина. Это гарантирует сохранение всех остальных данных и восстанавливает работоспособность обменов с бухгалтерией.

← На главную