К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Как по "<Объект не найден>(/)" найти документ в не битой базе?

Гость
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, либо манипуляциями с таблицами.


К списку вопросов






Copyright ©, Все права защищены