Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 09:59

"Объект Не Найден" В Поле Регистратор В Процедуре ОбработкаПроведения

Автор Истребитель, 19 мар 2012, 18:24

0 Пользователей и 1 гость просматривают эту тему.

Истребитель

Добрый день!

версия 1С 8.1.15.14 база УТ 10.3.9.4 серверная
Абсолютно не представляю как могло произойти то, что произошло.

Для удобства исправления проблем с партионным учетом я сделал так, что все ошибки партионного учета (вида "Документ такойто: Не списано по партии") записываются в регистр сведений, откуда их потом можно прочитать (это на случай если сотрудник забил на ошибку и закрыл документ со словами "провелся и хрен с ним").

Сегодня в этом регистре обнаружена такая запись:

Управленческий учет. Документ <Объект не найден> (132:ae87000c290c4b3211e171926075b47c)
Не списано по партиям 1 шт. товара Блок RIB (RLN4008), со склада: Склад Выставка

Это сотрудник проводил свежесозданный Заказ покупателя (в журнале регистрации на то время, когда была ошибка, два события с одним и тем же документом - Добавление, затем Проведение).

Чем усугублена проблема:

Во-первых, в журнале регистрации такого объекта нет!
Документ который проводился - сегодняшний. Поискал по всему журналу за сегодняшний день - нет такого гуида! Заказ который проводился в указанное в регистре время (и выдал эту ошибку) имеет иной гуид!

Во-вторых, я посмотрел код.
В ошибку выводится поле "Регистратор" из строки, которая берется из движений проводимого документа по регистру сведений СписаниеТоваров. Таким образом, по определению, поле Регистратор не может содержать "Объект не найден" потому что эти движения только что записаны при запуске предыдущей функции, делающей движения по этому регистру. Проверил - движения делаются без указания регистратора, т.е. заполняется строками Движения.СписаниеТоваров, поле Регистратор = неопределено, при выозве Движения.СписаниеТоваров.Записать(Истина) регистратор проставляется равным текущему документу.

Итого - каким то образом в процессе обработки события ОбработкаПроведения при вызове Движения.СписаниеТоваров.Записать(истина) в базу записались движения по несуществующему документу (т.е. документ уже существовал, но движения записались на иной документ, которого в базе нет - "Объект не найден").

Это какой-то Абсурд. Не понимаю, что вообще могло здесь произойти.

Я знаю, что "Объект не найден" может быть из-за того что "база посыпалась" - из-за потери данных.
Может быть из-за интерактивного удаления.
Может быть из-за удаления в коде объекта без проверки наличия на него ссылок.
Но здесь то как?

Документ при обработке проведения записывает часть своих движений, без явного указания регистратора, и в этих движениях в поле "регистратор" стоит ссылка на совершенно левый, боле того, несуществующий документ. Как такое может быть?

Подскажите пожалуйста, что делать. Фирма, чья это база, нервничает, я в принципе не представляю, как можно выяснить причину такой ошибки...

Vit1501

Смотрел журнал регистрации? Может там есть какие-то зацепки?

Истребитель

В этом то и проблема - в журнале регистрации нет этого гуида!
Есть только информация, что документ, совешивший такую проводку (по левому гуиду) был новым - т.к. в это время есть два действия Добавление и Проведение.

Dethmontt

У меня такая штука была в самописной конфе при управляемых блокировках и одновременному обращению к регистру объекты сделали движения но не записались (или удалились не знаю), но в итоге объекта не было а движения остались...
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

demous

поможет ? нет ?

Вкратце суть:
<Объект не найден> (132:ae87000c290c4b3211e171926075b47c)
То, что указано за фразой "Объект не найден" - это совершенно конкретное указание что и где необходимо восстановить. Т.е.,
"132" - это номер таблицы (_Reference9659)
"ae87000c290c4b3211e171926075b47c" - это как раз та самая пресловутая ссылка, а по сути, просто значение в формате binary(16).
Т.е., если сильно упрощенно, достаточно завести в таблице "_Reference9659" новую запись с этим значением в поле "_IDRRef" и всё. Новый элемент появится в справочнике и во всех связных объектах.
Как всё это осуществить средствами 1С?
Простой и бескровный способ - воспользоваться двумя замечательными командами:
ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр().
Загружаем резервную копию базы (все же делают регулярные бэкапы, ведь так?), ищем ссылку, которая была удалена и преобразуем её через ЗначениеВСтрокуВнутр(ИскомаяСсылка) в строку вида "{"#",54c3544f-651b-4887-ae3a-2df362efbacb,132:ae87000c290c4b3211e171926075b47c}", где мы уже видим знакомые цифры.
В рабочей копии применяем обратную команду ЗначениеИзСтрокиВнутр("{""#"",54c3544f-651b-4887-ae3a-2df362efbacb,132:ae87000c290c4b3211e171926075b47c}"). Не забудьте про двойные кавычки вокруг решетки! Результатом будет как раз тот самый <Объект не найден> ссылочного типа. На а дальше применяем УстановитьСсылкуНового().

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

НовЭл = Справочники.БюджетныеЦентры.СоздатьЭлемент();
НовЭл.УстановитьСсылкуНового(ЗначениеИзСтрокиВнутр("{""#"",54c3544f-651b-4887-ae3a-2df362efbacb,132:ae87000c290c4b3211e171926075b47c}"));
НовЭл.Наименование = "ДКР";
...
НовЭл.Записать();
Получил помощь - скажи СПАСИБО.

Истребитель

2 Dethmontt 
Хмм, очень похоже на правду. Поясните пожалуйста поподробнее, что такое управляемая блокировка и как проверить, это ли у меня происходит или нет.

2 demous 
Нет, увы, не поможет, потому что объект этот вообще в базе ни на секнуду не засветился (в журнале регистрации он не упоминается). Он существовал только в виде поля Регистратор записи в регистре СписанныеТовары в процессе записи документа ЗаказПокупателя. Он сам в базу не записывался даже...

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск