Восстановление битых ссылок в 1С

19.01.11

Задачи пользователя - Корректировка данных

Простая и относительно бескровная методика восстановления битых ссылок и ссылочной целостности.

Столкнулся сегодня с проблемой, известной в 1С как "<Объект не найден>".

Собственно, проблема такая иногда возникала и обычно решалась средствами SQL. Но тут с серверной версией базы возникли проблемы, а битые ссылки надо устранять...

 

Вкратце суть:

<Объект не найден> (9659:ab2b001b78e134e011dfec0814418025)

То, что указано за фразой "Объект не найден" - это совершенно конкретное указание что и где необходимо восстановить. Т.е., в моём случае,

"9659" - это номер таблицы (_Reference9659)

 "ab2b001b78e134e011dfec0814418025" - это как раз та самая пресловутая ссылка, а по сути, просто значение в формате binary(16). В таблице SQL оно выглядит как "0xab2b001b78e134e011dfec0814418025"

Т.е., если сильно упрощенно, достаточно завести в таблице "_Reference9659" новую запись с этим значением в поле "_IDRRef" и всё. Новый элемент появится в справочнике и во всех связных объектах.


Как всё это осуществить средствами 1С?

Простой и бескровный способ - воспользоваться двумя замечательными командами:

ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр().

Загружаем резервную копию базы (все же делают регулярные бэкапы, ведь так?), ищем ссылку, которая была удалена и преобразуем её через ЗначениеВСтрокуВнутр(ИскомаяСсылка) в строку вида "{"#",54c3544f-651b-4887-ae3a-2df362efbacb,9659:ab2b001b78e134e011dfec0814418025}", где мы уже видим знакомые цифры.

 В рабочей копии применяем обратную команду ЗначениеИзСтрокиВнутр("{""#"",54c3544f-651b-4887-ae3a-2df362efbacb,9659:ab2b001b78e134e011dfec0814418025}"). Не забудьте про двойные кавычки вокруг решетки! Результатом будет как раз тот самый <Объект не найден> ссылочного типа. На а дальше применяем УстановитьСсылкуНового().

 

Общий вид кода будет таким:


НовЭл = Справочники.БюджетныеЦентры.СоздатьЭлемент();

НовЭл.УстановитьСсылкуНового(ЗначениеИзСтрокиВнутр("{""#"",54c3544f-651b-4887-ae3a-2df362efbacb,9659:ab2b001b78e134e011dfec0814418025}"));

НовЭл.Наименование = "ДКР";
...
НовЭл.Записать();

 

 
 Данный способ позволит очень быстро восстановить ссылочную целостность даже в файловой базе в полном объёме. В случае, если вы каким-либо образом удалили половину таблицы, то не составит труда написать обычную переливку, к примеру ТЗ, через ЗначениеВФайл()/ЗначениеИзФайла().

 

P.S. В принципе, стандартный инструмент базы "Тестирование и исправление" делает тоже самое, он восстанавливает главное - объект с правильной ссылкой. Но созданный таким образом объект, конечно, не имеет никаких данных внутри. Простой тест на стандартной УТ с удалением и восстановлением номенклатуры выявил на свет целую тонну ошибок конфигуратора при попытки открыть эту номенклатуру, при попытке открыть документы с восстановленной номенклатурой и пр.

 

Буду рад любым комментариям.

См. также

Исправление в 1С:ЗУП/ЗКГУ ошибок по НДФЛ и взаиморасчетам с сотрудниками на начало расчетного года.

Корректировка данных Зарплата Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры бюджетного учреждения 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ Платные (руб)

Обработка исправляет технические ошибки по НДФЛ, взаиморасчетам с сотрудниками в 1С:ЗУП (1С:ЗКГУ) на начало года. Фактически все ошибки, которые проявляются в ведомостях на выплату, расчетных листках, при заполнении ведомостей на выплату и отчетах 6-НДФЛ и т.д. нужно начинать исправлять с начала расчетного года. Это позволит быть уверенными, что после завершения расчетов предыдущего года, начали работать с «чистого листа» без ошибочных остатков.

4800 руб.

06.10.2023    2693    30    15    

36

Тестирование и исправление ключей аналитики ERP, УТ11, КА

Корректировка данных Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Незаменимая обработка для сопровождения конфигураций: ERP, УТ, КА. Позволяет вычистить многие ошибки в ключах аналитики, в ключевых справочниках конфигурации.

3600 руб.

10.02.2017    107350    637    173    

680

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    28036    83    146    

61

Исправление ошибки закрытия месяца "Обнаружены ненулевые остатки по суммам при нулевом остатке по количеству в регистре себестоимости по организации". УТ 11.4,УТ 11.5, КА 2.4,КА 2.5, ERP 2.4, ERP 2.5, КА 2 Казахстан, Управление торговлей 3 для Казахстана

Закрытие периода Корректировка данных Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Закрытие месяца - важный процесс в современных конфигурациях, таких как УТ 11.4, УТ 11.5, КА 2.4, КА 2.5 ERP 2.4,ERP 2.5, КА 2 Казахстан, УТ 3 Казахстан регламентные операции влияют на расчет себестоимости, и ошибки в данном расчете не дают картины деятельности организации.

2400 руб.

27.10.2021    22602    302    35    

74

Исправление ошибок по НДФЛ и взаиморасчетам с сотрудниками в 1С:Бухгалтерия 3.0

Корректировка данных Зарплата Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Внешняя обработка предназначена для исправления самых различных ошибок, возникших по самым разным причинам. Общее проявление этих ошибок видно в различии данных между: проводками и различными отчетами по НДФЛ, заполнении ведомостей на выдачу зарплаты, неверным расчетом НДФЛ при начислении ЗП и т.д.

3600 руб.

09.02.2024    763    4    4    

7

Заполнение документа "Корректировка регистров" произвольными данными

Закрытие периода Корректировка данных Платформа 1С v8.3 Система компоновки данных 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Внешняя обработка, позволяющая произвольным образом заполнять документ "Корректировка регистров" Предназначена для использования в конфигурациях "Управление торговлей 11", "Управление небольшой фирмой", "ERP Управление предприятием", а также в других конфигурациях, в состав которых входит библиотека стандартных подсистем (БСП) версии 2.2+ и указанный выше документ.

2400 руб.

13.07.2015    50349    171    29    

121
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. strelez 7 20.01.11 15:24 Сейчас в теме
Прекрасная статья! Благодарю! Реально помогла в решении насущных срочных проблем :!: :!: :!:
Новиков; +1 Ответить
2. Новиков 292 20.01.11 15:45 Сейчас в теме
Отличная статья! Спасибо! Надеюсь автор продолжит радовать нас столь замечательными статьями. Все коротко и по делу.

Так держать!
3. ediks 335 21.01.11 07:44 Сейчас в теме
А не проще было воспользоваться типовой обработкой "Выгрузка и загрузка XML", чем изобретать велосипед что-то свое? Она делает все то же самое. Более того, она имеет возможность по умолчанию выгружать все реквизиты по ссылкам, которые, кстати, тоже могут могут иметь битые ссылки в приемнике.
4. romansun 193 21.01.11 11:26 Сейчас в теме
Да, согласен, разных способов много. "Выгрузка и загрузка XML" - отличный вариант.


Дело в том, что в моём случае нет прямого доступа к живой базе. И самым оптимальным и неломаемым вариантом обработки для обслуживающего базу персонала будет обработка с одной кнопкой "Сделать всё и правильно" :). Да и на инструменты сложнее одной кнопки, в принципе, могут потребовать документацию.

Повторюсь, это не обработка, это именно методика.
5. ediks 335 21.01.11 12:18 Сейчас в теме
(4)ОК, любой вариант имеет право на жизнь, если он наилучшим образом решает поставленную задачу. Если эта методика реально помогла восстановить битые ссылки с наименьшими затратами, то это только приветствуется.
6. romansun 193 21.01.11 12:23 Сейчас в теме
7. RustIG 1613 24.01.11 13:47 Сейчас в теме
(0) можно еще использовать такой вариант:

//получаем уникальный идентификатор ссылки
СтрокаУникальныйИдентификатор = Строка(АвансовыйОтчет.Ссылка.УникальныйИдентификатор());

//выгружаем уникальный идентификатор в строку и
//выгружаем всю информацию по документу с привязкой к уникальному идентификатору
//....


//загружаем данные ...
Док = Документы.АвансовыйОтчет.СоздатьДокумент();
Док.УстановитьСсылкуНового(Документы.АвансовыйОтчет.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУникальныйИдентификатор)));
Док.Дата
= ТекущаяДата();
//заполняем реквизиты ...
Док.Записать();

Отрывок из статьи "Особенности использования сериализации" на ИТС: "...в 1с 8 методы ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() реализованы в основном для сохранения функциональной совместимости с 1с 7.7..." - мало что поясняет... может кто примером объяснит?
8. romansun 193 24.01.11 14:37 Сейчас в теме
(7)
Объяснить в смысле что? Разницу в вариантах?

По поводу приведенного варианта - да, это, в общем, то же самое. Только здесь используется ПолучитьСсылку() и УникальныйИдентификатор().
Этот способ, в принципе, классический :). Мне только он не нравится тем, что здесь нет типизации ссылки. Поясняю.
Вот, что выдает нам УникальныйИдентификатор() и ЗначениеВСтрокуВнутр() от одной и той же ссылки соответственно:

"14418025-ec08-11df-ab2b-001b78e134e0"
"{"#",54c3544f-651b-4887-ae3a-2df362efbacb,9659:ab2b001b78e134e011dfec0814418025}"

По сути, первый вариант - это та же ссылка, только "перемешанная". В чем смысл этого? Тут я хз :). Но в первом варианте отсутствует информация откуда, из какой таблицы взята ссылка. Поэтому, чтобы правильно привязать её к таблице, мы вынуждены указывать конкретно, от какого объекта метаданных ссылка Документы.АвансовыйОтчет.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУникальныйИдентификатор)), либо (если не знаем тип заранее) писать цикл по метаданным и пытаться получить ссылку поочередно от всех объектов.

Что никак не хорошо.

Ну и плюс УникальныйИдентификатор() всё-таки полезен скорее для другого, чем для переноса ссылок - для генерации новой ссылки и возможности подстановки её в нужное место еще до записи самой сгенеренной ссылки.
Thalt; Cat-Ek; kosikov_oleg; Spacer; +4 Ответить
9. a4a 15.12.11 15:35 Сейчас в теме
10. maxdot 15.12.11 15:51 Сейчас в теме
Для себя нового ничего не узнал, но спасибо за труды. Дал ссылку нескольим товарищям, им помогло! =)
11. Гость 20.02.12 00:23
Спасибо, очень пригодилась
12. Жолтокнижниг 258 17.01.13 12:33 Сейчас в теме
А не проще получить объект ссылки в нормальной базе, серилизовать его.
объект=Ссылка.ПолучитьОбъект();
ЗаписатьXML(записьХМЛ,объект);


А в базе с битыми ссылками просто прочитать и записать этот объект.

прочитанноеЗначение=ПрочитатьXML(чтениеХМЛ);
прочитанноеЗначение.записать();
romansun; kosikov_oleg; +2 Ответить
13. kosikov_oleg 24.10.17 10:16 Сейчас в теме
Спасибо, мне очень помогло!
14. kollegue 23.11.17 12:01 Сейчас в теме
А каковы принципиальные недостатки решения данной проблемы при помощи тестирования и исправления с созданием объектов? У нас после краха системы пропали некоторые объекты и я сейчас думаю как их лучше восстановить.
15. Cat-Ek 26.12.17 10:49 Сейчас в теме
Спасибо автору. Буду сегодня проверять
16. Briz_65 8 11.04.23 12:48 Сейчас в теме
Если есть резервная копия базы где присутствует удаленная ссылка, проще ее выгрузить через универсальный обмен, безо всяких танцев с бубном.
17. romansun 193 11.04.23 16:16 Сейчас в теме
(16) Публикации 12 лет :)

Так-то вариантов восстановить ссылки много, конечно. В публикации один из возможных.

в (12) по сути, это же самое описано
18. Evgeniy.Pecheykin 31 18.01.24 16:03 Сейчас в теме
Очень помогло - спасибо)
Оставьте свое сообщение