Восстановление битых ссылок в 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С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры бюджетного учреждения 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ Платные (руб)

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

60000 руб.

06.10.2023    4513    37    18    

45

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

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

14400 руб.

29.04.2020    33825    108    152    

75

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

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

3600 руб.

10.02.2017    111381    669    174    

708

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

Представьте, что есть система QR - кодирования, которая НЕ ТРЕБУЕТ изменения конфигурации, НЕ ТРЕБУЕТ изменения ни одной печатной формы для добавления QR-кода, включая внешние, НЕ ХРАНИТ данные штрихкодов и их связь, от чего база не "пухнет", ИМЕЕТ возможность закодировать в QR-коде произвольные данные параметров для последующей обработки полученных данных, УМЕЕТ прикреплять сканы, УМЕЕТ обработать считанный QR-код как ВЫ захотите. А также ХРАНИТ историю операций в обход базы для каждого пользователя в отдельности и УМЕЕТ работать с 2D - сканерами. А также автоматически распознавать отсканированные печатные формы (картинки или pdf-файлы) и выполнять заданные произвольные алгоритмы, в том числе прикрепление их к документам! Обновление 3.2 от 09.06.2024!

19200 руб.

26.08.2018    52618    16    61    

55

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

Вы наконец разобрались с закрытием месяцев и пора начать контролировать сроки оплаты поставщикам и задолженности клиентов, но в базе расчеты не идут из-за развернутого сальдо? Не беда, есть решение!

12000 руб.

02.11.2020    7537    6    0    

8

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

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

2400 руб.

13.07.2015    51367    175    29    

127

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

Обработка предназначена для ООО для смены системы налогообложения УСН на ОСНО, без ведения раздельного учета, входящего НДС по способам учета. При реализации перехода в операции формируются проводки по выделению НДС, который ранее учитывался в стоимости номенклатуры, регистр «НДС Предъявленный».

6000 руб.

22.01.2025    278    1    0    

3

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

Обработка служит для: выравнивания бухгалтерского и налогового учета на определенную дату по выбранным счетам; закрытия остатков по выбранным счетам; обнуления налогового учета (ПР, ВР также будут обнулены)

2880 руб.

05.05.2024    702    10    0    

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

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


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

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

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

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


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

Отрывок из статьи "Особенности использования сериализации" на ИТС: "...в 1с 8 методы ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() реализованы в основном для сохранения функциональной совместимости с 1с 7.7..." - мало что поясняет... может кто примером объяснит?
8. romansun 194 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. Жолтокнижниг 259 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 194 11.04.23 16:16 Сейчас в теме
(16) Публикации 12 лет :)

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

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