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