1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
Функция ЗагрузитьМетаданные(КаталогИБ, ИмяПользователяV7, ПарольПользователяV7) Экспорт МД = Новый Структура; Состояние("Подключение к " + КаталогИБ); V7 = Новый COMОбъект("V77.Application"); Если V7.Initialize(V7.RMTrade, "/d"""+КаталогИБ+""" /n"+ИмяПользователяV7+" /p"+ПарольПользователяV7, "NO_SPASH_SHOW") = 0 Тогда Сообщить("Нет доступа к информационной базе."); Возврат Ложь; КонецЕсли; MDW = V7.CreateObject("MetaDataWork"); MD = V7.Метаданные; Состояние("Загрузка справочников.."); Ст1 = Новый Структура; МД.Вставить("Справочник", Ст1); Для Номер1 = 1 По MD.Справочник() Цикл МДСправочник = MD.Справочник(Номер1); Ст2 = Новый Структура; Ст1.Вставить(МДСправочник.Идентификатор, Ст2); Ст2.Вставить("ИД", MDW.ИДОбъекта(МДСправочник)); Для Номер2 = 1 По МДСправочник.Реквизит() Цикл МДРеквизит = МДСправочник.Реквизит(Номер2); Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит)); КонецЦикла; КонецЦикла; Состояние("Загрузка перечислений.."); Ст1 = Новый Структура; МД.Вставить("Перечисление", Ст1); Для Номер1 = 1 По MD.Перечисление() Цикл МДПеречисление = MD.Перечисление(Номер1); Ст2 = Новый Структура; Ст1.Вставить(МДПеречисление.Идентификатор, Ст2); Ст2.Вставить("ИД", MDW.ИДОбъекта(МДПеречисление)); Для Номер2 = 1 По МДПеречисление.Значение() Цикл МДЗначение = МДПеречисление.Значение(Номер2); Ст2.Вставить(МДЗначение.Идентификатор, V7.EvalExpr("_idtostr("+MDW.ИДОбъекта(МДЗначение)+")")+" "); КонецЦикла; КонецЦикла; Состояние("Загрузка документов.."); Ст1 = Новый Структура; МД.Вставить("Документ", Ст1); Для Номер1 = 1 По MD.Документ() Цикл МДДокумент = MD.Документ(Номер1); Ст2 = Новый Структура; Ст1.Вставить(МДДокумент.Идентификатор, Ст2); Ст2.Вставить("ИД", MDW.ИДОбъекта(МДДокумент)); Для Номер2 = 1 По МДДокумент.РеквизитШапки() Цикл МДРеквизит = МДДокумент.РеквизитШапки(Номер2); Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит)); КонецЦикла; Для Номер2 = 1 По МДДокумент.РеквизитТабличнойЧасти() Цикл МДРеквизит = МДДокумент.РеквизитТабличнойЧасти(Номер2); Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит)); КонецЦикла; КонецЦикла; Состояние("Загрузка регистров.."); Ст1 = Новый Структура; МД.Вставить("Регистр", Ст1); Для Номер1 = 1 По MD.Регистр() Цикл МДРегистр = MD.Регистр(Номер1); Ст2 = Новый Структура; Ст1.Вставить(МДРегистр.Идентификатор, Ст2); Ст2.Вставить("ИД", MDW.ИДОбъекта(МДРегистр)); Для Номер2 = 1 По МДРегистр.Измерение() Цикл МДИзмерение = МДРегистр.Измерение(Номер2); Ст2.Вставить(МДИзмерение.Идентификатор, MDW.ИДОбъекта(МДИзмерение)); КонецЦикла; Для Номер2 = 1 По МДРегистр.Ресурс() Цикл МДРесурс = МДРегистр.Ресурс(Номер2); Ст2.Вставить(МДРесурс.Идентификатор, MDW.ИДОбъекта(МДРесурс)); КонецЦикла; Для Номер2 = 1 По МДРегистр.Реквизит() Цикл МДРеквизит = МДРегистр.Реквизит(Номер2); Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит)); КонецЦикла; КонецЦикла; Константы.МетаданныеУдаленнойИБ.Установить(Новый ХранилищеЗначения(МД)); Возврат Истина; КонецФункции |
Формируется конечно не быстро, но Структура — объект сериализуемый, поэтому ее надо просто хранить в ХранилищеЗначения в базе 8ки, и восстанавливать перед каждым переносом данных, а не формировать заново. Обновлять ее можно периодически при изменении конфигурации, ито если изменения влияют на перенос данных.
Обратите внимание: все идентификаторы объектов в 10ой системе, а идентификаторы значений перечислений в 36ой.
DmitrO