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

Тема в разделе "1C и всё что с ней связано", создана пользователем Истребитель, 19 мар 2012.

  1. Истребитель

    Истребитель Well-Known Member

    Регистрация:
    9 июн 2010
    Сообщения:
    110
    Симпатии:
    0
    Добрый день!

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

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

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

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

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

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

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

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

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

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

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

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

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

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Все выглядит, как-будто произошла запись в регистр сведений, а потом документ удалили, причем без проверки целостности базы, например, программно. Раз "нет такого гуида!".
     
  3. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    А ошибка повторима? если нет - тогда скорее было програмное или интерактивное удаление.
    з.ы. Вот не уверен - может дело в том, что документ новый, ни разу не записанный? Поменялся у него гуид при записи в базу и все.
     
  4. Истребитель

    Истребитель Well-Known Member

    Регистрация:
    9 июн 2010
    Сообщения:
    110
    Симпатии:
    0
    Подскажите, как могло быть интерактивное удаление?

    19.03.2012 в 14:47:58 в логе ошибок проведения по партиям появилась ошибка которую я указал.

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

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

    Единственный вариант, который могу представить, это если в ходе выполнения кода процедуры "ОбработкаПроведения" в момент между записью движений по регистру СписаниеТоваров и созданем движений по партиям (с выдачей ошибок) документ был из базы удален, а затем вновь в неё записан?

    Но что могло сделать так?
     
  5. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    Посмотрите код проведения. Есть ли метод "ПолучитьСсылкуНового()"
     
  6. Истребитель

    Истребитель Well-Known Member

    Регистрация:
    9 июн 2010
    Сообщения:
    110
    Симпатии:
    0
    Нет, как уже спрашивали в соседней теме, такой метод есть в базе в единственном месте и это создание элемента справочника а не документа.
     
  7. Allexei

    Allexei Well-Known Member

    Регистрация:
    2 май 2008
    Сообщения:
    322
    Симпатии:
    0
    Вопрос на миилион! А права то есть на просмотр этого объекта?
     
  8. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    Allexei, если намек на RLS, то запись в регистре вообще не должна быть видна. А если про флаг "Чтение" - то действительно, интересный вопрос.
     
  9. Истребитель

    Истребитель Well-Known Member

    Регистрация:
    9 июн 2010
    Сообщения:
    110
    Симпатии:
    0
    Права, конечно есть. Кроме того, в журнале регистрации не упоминается этот гуид ВООБЩЕ. Понимаете? Т.е. это не может быть проблема, что пользователь, от имени которого запускался код на запись в регистр сведений сообщения об ошибке, не имел права на чтение этого документа. Ведь независимо от прав пользователя, в журнале то регистрации должен был гуид объекта засветиться? Или я ошибаюсь?
     
  10. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    Я правильно понял, что в регистре видите "<Объект ....>", а в журнале регистрации этого нет. И это все под правами одного и того же пользователя?
     
  11. Истребитель

    Истребитель Well-Known Member

    Регистрация:
    9 июн 2010
    Сообщения:
    110
    Симпатии:
    0
    Есть самодельный регистр который содержит записи об ошибках партионного учета.

    измерение - датадобавления (датавремя)
    ресурс - сообщение (строка)

    В него пишется любое выводимое сообщение об этих ошибках - ввезде где в базе есть код "сообщить(татата не списано по партии)" добавил код который пишет то же сообщение в этот регистр.

    В этом регистре обнаружилась строчка где вместо документа "объект не найден". В журнале регистрации такого объекта нет. В базе тоже его нет, потому что, как я уже писал, в эту ошибку пишется "Регистратор" из строки движений по регистру СписанныеТовары, это движение было пересоздано потому что сотрудник увидел ошибку (партионного учета) и исправил её и перепровел документ (при этом движения перезаписались).

    Но остался факт, в момет записи нового документа он каким-то образом записал движения в регистр на неправильный гуид (не на "себя")
     
  12. Можно битые ссылки так ремонтировать


    Процедура УдалитьБитыеСсылкиРН(ИмяРегистра) Экспорт
    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    | Регистр.Регистратор
    |ИЗ
    | РегистрНакопления." + ИмяРегистра + " КАК Регистр
    |ГДЕ
    | Регистр.Регистратор.Номер ЕСТЬ NULL
    |
    |СГРУППИРОВАТЬ ПО
    | Регистр.Регистратор");

    Выборка = Запрос.Выполнить().Выбрать();

    Пока Выборка.Следующий() Цикл
    ОбработкаПрерыванияПользователя();

    НЗ = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
    НЗ.Отбор.Регистратор.Установить(Выборка.Регистратор);
    НЗ.Записать();



    КонецЦикла;


    КонецПроцедуры
     
  13. Истребитель

    Истребитель Well-Known Member

    Регистрация:
    9 июн 2010
    Сообщения:
    110
    Симпатии:
    0
    Да, но задача не отремонтировать, а узнать, какого .... произошло?
     
Загрузка...

Поделиться этой страницей