Регистрация Правила Главная форума Поиск |
0
- 26.10.2012 - 17:04
|
Есть две базы, связанные по УРБД. В периферийной пропала часть документов в движениях регистров. Ищу ссылки на пропавшие документы по всем регистрам: Для Ин = 1 По Метаданные.Регистр() Цикл РегВид = Метаданные.Регистр(Ин).Идентификатор; Рег = СоздатьОбъект("Регистр." + РегВид); Рег.ВыбратьДвижения(,); Пока Рег.ПолучитьДвижение()=1 Цикл ТекДок = Рег.ТекущийДокумент(); Если ПустоеЗначение(ТекДок) = 0 Тогда Состояние("Регистр=""" + РегВид + """ дата=" + ТекДок.ДатаДок); Если ТекДок.Выбран() = 0 Тогда Сообщить("Регистр=""" + РегВид + """ текущий документ=" + ТекДок); КонецЕсли; КонецЕсли; Для Ин = 1 По Метаданные.Регистр(РегВид).Измерение() Цикл ИдентИзмерения = Метаданные.Регистр(РегВид).Измерение(Ин).Идентифик атор; ЗначИзмерения = Рег.ПолучитьАтрибут(ИдентИзмерения); Если ТипЗначенияСтр(ЗначИзмерения) = "Документ" Тогда Если ПустоеЗначение(ЗначИзмерения) = 0 Тогда Если ЗначИзмерения.Выбран() = 0 Тогда Сообщить("Регистр=""" + РегВид + """ измерение=""" + ИдентИзмерения + """ значение=""" + ЗначИзмерения + """"); КонецЕсли; КонецЕсли; КонецЕсли;; КонецЦикла; КонецЦикла; КонецЦикла; Теперь вопрос - как (естественно, в центральной, не испорченной, базе) найти соответствующие документы? Знаю, что в сообщении "<Объект не найден>(X/Y)" X - внутренний ID объекта. Но, чтобы его найти с помощью ЗначениеИзСтрокиВнутр() нужен еще ID вида объекта. Где его взять? (ЗначИзмерения.Вид() выдает пустую строку) И второй вопрос - что такое Y. В части случаев у меня там появляется код центральной базы, но есть документы, в которых Y пустой, а они тоже пришли из центральной. | |
1
- 26.10.2012 - 17:19
|
возможно, что не просто пропала - а просто ввиду наложенных ограничений - требуемые документ ыне мигрировали в ПБ - вот и получились висящие ссылки... - тоже учитывай на будущее... . если в регистре не неопределенный тип реквизита - а это врядли - то можно тупо вытянуть из метаданных какой вид в данном реквизите... . если задан тип но не задан вид - можно тупо попробовать поискать по всем видам заданного типа... и вываливать алярм если ид потерянной ссылки - без учета вида - совпадает с нексолькими объектами но в разных видах... . это все в порядке дежурного бреда если непонятно как работть с икс-игрек | |
2
- 26.10.2012 - 17:21
| Как-то странно получается - система помнит ID, но при этом теряет часть информации, что это был за документ? | |
3
- 26.10.2012 - 19:58
|
Во-первых, ссылка на документ включает в себя ID. Ссылка не обязательно содержит вид документа: если в метаданных определено, что ссылка есть определенный тип и вид метаданных, то для нахождения по ссылке достаточно ID. Если в метаданных агрегатный объект не конкретизирован, ссылка содержит и тип, и вид объекта. Впрочем, ЗначениеВСтроку возвратит и тип, и вид, и ID агрегатного объекта. Надо только правильно обратится: ЗначениеВСтроку(Рег.ТекущийДокумент()) Кстати, "вид" объекта есть число, которое содержится в имени соответствующей таблицы. | |
4
- 26.10.2012 - 20:24
|
(0) если вопрос в том, как исправить... вариант: 1 - проверить свойства миграции... 2 - перепровести в целой базе те документы, в движениях регистров по которым в ущербной базе есть "битые" ссылки (если таковые сложно идентифицировать, можно слепить обработку, которая в ущербной базе по движениям регистров найдет эти документы и по OLE по номеру и дкте найдет их в целой, и перепроведет) 3 - выполнить взаимообмен... | |
5
- 26.10.2012 - 21:40
|
4-1с2с > По п.2: перепроведение ссылки не восстанавливает, перепроведение ссылки убивает. Есть вполне "штатная" "обработка", которая записывает в базу документ с требуемым ID. Эта "обработка" известна под аббревиатурой ТиИ ;) Разумеется, "восстанавливаются" в таблицах только те поля, что формируют ссылку. Никакие другие реквизиты не организуются - неоткуда их брать. Впрочем, для объекта типа "справочник" формируется "дикое" наименование... "Восстановленные" таким образом "объекты" подлежат наполнению на основании "бумажных копий". Ручками, разумеется, в основном. Можно и не "ручками", если есть годные для этого дела бэкапы. Ничего сложного. Для предотвращения этой глупой и муторной работы нужно всего-то запретить всем (и себе тоже!) права на непосредственное удаление объектов. Только, и не иначе, как только с проверкой на наличие ссылок на объект. Повторяю: и себе тоже! Лично меня это не сколько не ограничивает: удалить могу все, что угодно. Но это будет именно сознательное действие, а не "ой, забылся". | |
6
- 26.10.2012 - 23:18
|
(5) согласен, в общем случае может заменить ссылками на другие документы... (0) ещё варианты: - поперезаписать в здоровой базе в цикле все документы всех видов, по которым в больной утеряны ссылки, сымитировав т.о. изменение... смигрируют... - отпочковать новую ПБ, ежели в центральной всё имеется... | |
7
- 27.10.2012 - 17:16
|
Ничего не понял, что автор хочет. 1 - если ссылка битая (объект не найден), то проверять надо не на ПустоеЗначение(), а на Выбран() 2 - более важное. Если объект не найден, то его нет в этой базе, и это никак не восстановить. И никак не найти. Объект был, но его удалили, и его не стало. И надо его забыть. Проще всего из центральной заново создать периферийку. Теоретически конечно можно с помощью прямых запросов (на VFP) к таблицам двух баз решить эту проблему, но это весьма непросто и трудоемко | |
8
- 29.10.2012 - 12:52
|
(7) Читайте внимательней, Выбран() и проверяется. Но сначала надо проверить, что значение не пустое. Если объект не найден, то его можно прекрасно восстановить из базы, где он есть. | |
9
- 29.10.2012 - 12:54
|
В итоге написал обработку для поиска в движениях регистров битых ссылок на документы (<объект не найден>) и их пометки, как измененных, в другой базе для переноса по УРБД - http://infostart.ru/public/158505. Так что, если вдруг у кого-то возникнет похожая проблема, берите-пользуйтесь. | |
10
- 29.10.2012 - 14:15
| Так бы и сказали, что Вы объекты, имеющие битые ссылки, поставили на обмен. А то "найти в другой базе". Найти можно либо по OLE, либо манипуляциями с таблицами. | |
| Интернет-форум Краснодарского края и Краснодара |