• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Истребитель
  • Дата начала
И

Истребитель

Добрый день!

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

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

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

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

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

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

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

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

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

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

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

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

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

Дайнеко

Все выглядит, как-будто произошла запись в регистр сведений, а потом документ удалили, причем без проверки целостности базы, например, программно. Раз "нет такого гуида!".
 
P

puh14

А ошибка повторима? если нет - тогда скорее было програмное или интерактивное удаление.
з.ы. Вот не уверен - может дело в том, что документ новый, ни разу не записанный? Поменялся у него гуид при записи в базу и все.
 
И

Истребитель

Подскажите, как могло быть интерактивное удаление?

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

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

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

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

Но что могло сделать так?
 
D

Darlock

Посмотрите код проведения. Есть ли метод "ПолучитьСсылкуНового()"
 
И

Истребитель

Нет, как уже спрашивали в соседней теме, такой метод есть в базе в единственном месте и это создание элемента справочника а не документа.
 
A

Allexei

Вопрос на миилион! А права то есть на просмотр этого объекта?
 
D

Darlock

Allexei, если намек на RLS, то запись в регистре вообще не должна быть видна. А если про флаг "Чтение" - то действительно, интересный вопрос.
 
И

Истребитель

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

Darlock

Я правильно понял, что в регистре видите "<Объект ....>", а в журнале регистрации этого нет. И это все под правами одного и того же пользователя?
 
И

Истребитель

Есть самодельный регистр который содержит записи об ошибках партионного учета.

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

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

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

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

odineska-blogspot-com

Можно битые ссылки так ремонтировать


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

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

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

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



КонецЦикла;


КонецПроцедуры
 
И

Истребитель

Да, но задача не отремонтировать, а узнать, какого .... произошло?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!