При переходе с редакции 2.0 на редакцию 3.0 конфигурации 1С:Бухгалтерия предприятия разработчики нередко сталкиваются с неприятной ситуацией: в исходной базе были добавлены собственные реквизиты документов или справочников, перед обновлением точно такие же реквизиты создали в файле новой конфигурации, но после применения изменений и реструктуризации базы данных все сохраненные значения оказываются пустыми. Разберем внутренние механизмы платформы 1С:Предприятие, выясним причину потери информации и рассмотрим надежные способы сохранения данных.
Проанализируем, что происходит на уровне структуры базы данных и СУБД в момент обновления. Каждому реквизиту объекта в метаданных сопоставлена отдельная колонка в таблице базы данных (вида _Fld<Номер>). Эта колонка привязана не к символьному имени реквизита (идентификатору), а к его внутреннему уникальному идентификатору — UUID (GUID метаданных).
Когда мы используем операцию «Конфигурация — Загрузить конфигурацию из файла» (загрузка .cf):
Именно поэтому простая ручная вставка реквизита в новую конфигурацию и последующая загрузка файла конфигурации неизбежно приводят к потере информации.
Чтобы данные не пропали, внутренний UUID реквизита в целевой конфигурации должен полностью совпадать с его идентификатором в исходной базе. Для этого необходимо выполнять перенос реквизитов через механизм сравнения и объединения, где сопоставление объектов можно выполнять по их именам.
Разберем по шагам правильный алгоритм подготовки файла конфигурации для обновления:
Base20.cf).Base20.cf.UpdateTo30_WithCustomFields.cf).UpdateTo30_WithCustomFields.cf в рабочую базу БП 2.0 через пункт меню Конфигурация — Загрузить конфигурацию из файла и применяем изменения конфигурации базы данных (клавиша F7).Поскольку идентификаторы реквизитов сохранились, реорганизация базы данных пройдет без удаления колонок, и все значения останутся на своих местах.
Всегда обращаем внимание на окно «Реорганизация информации», которое появляется при обновлении конфигурации базы данных. Если в списке изменений напротив добавленного реквизита указано действие «Удалить» и одновременно «Добавить» — это прямой сигнал о несовпадении UUID и неминуемой потере данных. При корректном объединении реквизит не должен фигурировать в списке удаляемых полей.
Если обновление уже было выполнено, а реквизиты очистились, восстановить значения можно с помощью внешней обработки из предварительно созданной резервной копии БП 2.0. При этом важно правильно выбрать ключ сопоставления документов.
Поскольку при обновлении конфигурации стандартные ссылки объектов Ссылка не меняются, сопоставлять документы по номерам и датам не требуется (номера могут сбиваться или пересекаться по годам). Достаточно использовать строковое представление уникального идентификатора ссылки Ссылка.УникальныйИдентификатор().
Посмотрим на пример логики переноса данных через внешнее COM-соединение с архивной базой БП 2.0:
// Подключаемся к архивной базе данных
Соединитель = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "File=""C:\Bases\Base20_Backup""; Usr=""Администратор""; Pwd="""";";
Попытка
База20 = Соединитель.Connect(СтрокаПодключения);
Исключение
Сообщить("Ошибка подключения к архивной базе: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Выбираем данные из архивной базы
ЗапросCOM = База20.NewObject("Запрос");
ЗапросCOM.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(РКО.Ссылка КАК СТРОКА) КАК УИД_Строка,
| РКО.ДополнительныйРеквизитGUID КАК ИсходныйGUID
|ИЗ
| Документ.РасходныйКассовыйОрдер КАК РКО
|ГДЕ
| РКО.ДополнительныйРеквизитGUID <> """"";
Выборка = ЗапросCOM.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Находим документ в текущей базе БП 3.0 по исходному UUID ссылки
ТекУИД = Новый УникальныйИдентификатор(Выборка.УИД_Строка);
ТекСсылка = Документы.РасходныйКассовыйОрдер.ПолучитьСсылку(ТекУИД);
// Проверяем существование объекта и записываем восстановленные данные
Если Не ТекСсылка.Пустая() Тогда
ОбъектДок = ТекСсылка.ПолучитьОбъект();
Если ОбъектДок <> Неопределено Тогда
ОбъектДок.ДополнительныйРеквизитGUID = Выборка.ИсходныйGUID;
ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецЕсли;
КонецЦикла;
При переходе на современные версии БП 3.0 рекомендуется избегать изменения типовых метаданных на замке. Для решения аналогичных задач применяются более гибкие инструменты: