Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Как узнать IDDOC после метода Док.Новый() (число прочтений - 277 )
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 851
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Как узнать IDDOC после метода Док.Новый()
29. Февраля 2024 :: 11:58
Печать  
Управляющий Мистой превращается в жалкого узурпатора. Удалил мой вопрос там. Потому создаю здесь.

Можно ли каким-то обазом выудить, какой ID система присвоит новому документу, созданному методом Новый()?

Т.е. еще до момента .Записать().

После Новый() по идее должен быть зарезервирован какой-то IDDOC, вот его бы хотелось получить.

Меня уже поддостают иногда возникающие коллизии, когда автомат создает программно документ (Новый, Записать), потом даже из сесси выходит.

И через небольшой промежуток времени (от нескольких десятков секунд до минут) другой пользователь тоже создает (программно) докумен другого вида и ему, по какой-то пока неведомой причине IDDOC присваивается уже существующий.

Вот тут предлагают мониторить 1SUIDCTL.DBF
https://forum.mista.ru/topic.php?id=302510&ysclid=lt75ixqk5l281635858#9
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Как узнать IDDOC после метода Док.Новый()
Ответ #1 - 02. Марта 2024 :: 10:57
Печать  
Попробуй dbeng32 от Wirth, https://cloud.mail.ru/public/3mVX/4trK45on8
10 лет использую, подобных глюков не замечал, да и вообще никаких глюков не замечал  Улыбка
  
Наверх
www  
IP записан
 
Кошки рулят
Full Member
***
Отсутствует



Сообщений: 125
Зарегистрирован: 26. Ноября 2008
Re: Как узнать IDDOC после метода Док.Новый()
Ответ #2 - 02. Марта 2024 :: 21:53
Печать  
alyuev писал(а) 29. Февраля 2024 :: 11:58:
После Новый() по идее должен быть зарезервирован какой-то IDDOC, вот его бы хотелось получить.

ЗначениеВСтроку(ТекущийДокумент())
или
ЗначениеВСтрокуВнутр(ТекущийДокумент())
число в последней секции - внутренний IDDOC
Счетчик срабатывает на увеличение при создании документа (не важно программном или интерактивном), а не при записи.
Если после создания двух объектов будет записан только один (второй по времени), в счетчике просто останется дырка.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 851
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как узнать IDDOC после метода Док.Новый()
Ответ #3 - 04. Марта 2024 :: 16:37
Печать  
2 Кошки рулят. Здесь ТекущийДокумент() еще не сохранен. Поэтому ЗначениеВСтроку() и ЗначениеВСтрокуВнутр() ничего не вернет в плане внутреннего номера. Оно всё пустое вернет.


2 Djelf. Как-то стремненько прямо движок подменять на рабочей производственной базе.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Кошки рулят
Full Member
***
Отсутствует



Сообщений: 125
Зарегистрирован: 26. Ноября 2008
Re: Как узнать IDDOC после метода Док.Новый()
Ответ #4 - 04. Марта 2024 :: 17:16
Печать  
Ты уже как-то определись, по какой идее у тебя
Цитата:
После Новый() по идее должен быть зарезервирован какой-то IDDOC, вот его бы хотелось получить.

?
Зачем системе нужен такой резерв?
И какого рожна он тебе? Ты что с ним собираешься делать?
При Док.Новый() Резервируется счетчик (нумератор), про дырки - это было про него сказано.
И для чего он "резервируется" системой понятно - чтобы при "одновременном" создании новых документов (разными пользователями, например) номера были последовательными и разными.

Код
Выбрать все
	Док=СоздатьОбъект("Документ.Реализация");
	Док.Новый();
	Сообщить("ЗначениеВСтроку "+ЗначениеВСтроку(Док.ТекущийДокумент()));
	Сообщить("ЗначениеВСтрокуВнутр"+ЗначениеВСтрокуВнутр(Док.ТекущийДокумент()));
	Сообщить("НомерДок "+Док.НомерДок);
	Док.Записать();
 	Сообщить("ЗначениеВСтроку"+ЗначениеВСтроку(Док.ТекущийДокумент()));
	Сообщить("ЗначениеВСтрокуВнутр"+ЗначениеВСтрокуВнутр(Док.ТекущийДокумент()));
    Док.Удалить(1);
	Док=СоздатьОбъект("Документ.ПоступлениеТМЦ");
	Док.Новый();
	Сообщить("ЗначениеВСтроку "+ЗначениеВСтроку(Док.ТекущийДокумент()));
	Сообщить("ЗначениеВСтрокуВнутр"+ЗначениеВСтрокуВнутр(Док.ТекущийДокумент()));
	Сообщить("НомерДок "+Док.НомерДок);
	Док.Записать();
 	Сообщить("ЗначениеВСтроку"+ЗначениеВСтроку(Док.ТекущийДокумент()));
	Сообщить("ЗначениеВСтрокуВнутр"+ЗначениеВСтрокуВнутр(Док.ТекущийДокумент()));
    Док.Удалить(1);
 


  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Как узнать IDDOC после метода Док.Новый()
Ответ #5 - 05. Марта 2024 :: 11:32
Печать  
alyuev писал(а) 04. Марта 2024 :: 16:37:
2 Djelf. Как-то стремненько прямо движок подменять на рабочей производственной базе.

Это понятно, но у Wirth перед созданием этого движка был громадный опыт с v7dbnet (клиент/серверный двидок для dbf), там тоже движок подменялся. И тестирование он очень жесткое делал (побайтовое сравнение баз после одинаковых операций на штатном движке и на этом). Кроме того движок держит файлы dbf больше 2х гигов и устраняет загрузку процессора при ожидании транзакции. И в отличии от движков Hogic поддерживает 1sqlite.
И повторяю, у меня он 10 лет работает на рабочей базе, никаких причуд за это время замечено не было.
Всяких программых импортов у меня довольно много разных и причуд с IDDOC я не видел.
  
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Как узнать IDDOC после метода Док.Новый()
Ответ #6 - 05. Марта 2024 :: 12:22
Печать  
alyuev писал(а) 29. Февраля 2024 :: 11:58:
Можно ли каким-то обазом выудить, какой ID система присвоит новому документу, созданному методом Новый()?

Если ЗначениеВСтрокуВнутр возвращает пустое значение IDDOC, то никак.
Количество документов в IDDOC ограничено, и оно не в UUID, следовательно СсылкаНового как в 8ке не должно работать, иначе будет переполнение (вот такая защитка).
Значит назначается в ПриЗаписи с целью экономии внутренних номеров.

P.S. У тебя точно гибридных подключений нет?
Это по сетке и все терминальное.

Такого делать не надо.
Так это должно работать изнутри:
1. Блокируем таблицу 1SUIDCTL
2. Прибавляем единичку, и пишем новый номер
3. Ожидающие - ожидают
4. Сливаем часть таблицы взад
6. Ожидающие - получают новый тикет

P.S. Если на п.3 если есть патч на FileFlushBuffers можно обрезаться...
  
Наверх
www  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 851
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как узнать IDDOC после метода Док.Новый()
Ответ #7 - 06. Марта 2024 :: 09:44
Печать  
Спасибо, Djelf.

Про гибридное подключение не полнял. Это что? ОЛЕ?

У нас всё в терминале. Пользователь Автомат периодически опрашивает базу V8. При необходимости создает док в V7 и прописывает в V8 ИД созданного документа. И вот оказывается в последствии, что иногда документ "теряется". А на самом деле - это из-за неверно присвоенного (повторно) IDDOC.

По "P.S. Если на п.3 если есть патч на FileFlushBuffers можно обрезаться" - тоже не понял. В смысле, что если такой патч применялся, то можно на что-то нарваться?

  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Как узнать IDDOC после метода Док.Новый()
Ответ #8 - 07. Марта 2024 :: 07:02
Печать  
alyuev писал(а) 06. Марта 2024 :: 09:44:
Про гибридное подключение не полнял. Это что? ОЛЕ?

Я имел ввиду подключение из терминала и по сети одновременно.

alyuev писал(а) 06. Марта 2024 :: 09:44:
По "P.S. Если на п.3 если есть патч на FileFlushBuffers можно обрезаться" - тоже не понял. В смысле, что если такой патч применялся, то можно на что-то нарваться?

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

Я то работаю да движке от Wirth, там я тоже нашел где FileFlushBuffers  используется и отключил...

P.S. Совершенно не понятно как и почему у тебя IDDOC может дублироваться, такое не должно быть в принципе...
  
Наверх
www  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 851
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как узнать IDDOC после метода Док.Новый()
Ответ #9 - 11. Марта 2024 :: 09:40
Печать  
Тут не дублирование получилось, а подмена/замена. Т.е. на этапе создания первого дока система бронирует IDDOC, автомат вроде как всё видит, формирует нужную ссылку. Но потом в другой сессии создается другой документ и ему дается тот же первый IDDOC. Но далее проверка показала, что в DBF-Журнале строка для этот IDDOC одна только для второго. А в DBF шапки и таблицы для такого ID вообще нет!
Такое впечатление, что как будто всё делалось, делалось, а потом как будто была ОтменитьТранзакцию() (хотя, конечно, этого у меня нет в этом модуле). Т.е. записи и не осталось. Но это надо еще проверить. Т.к. ссылка на первый документ осталась. И, возможно, её надо где-то запомнить для другого автомата и сессии - и проверять там - а документ-то остался?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Как узнать IDDOC после метода Док.Новый()
Ответ #10 - 11. Марта 2024 :: 12:04
Печать  
Я, повторяю, непонятно как это может быть, любой документ всегда записывается в транзакции, а IDDOC вычисляется при записи документа, а следующий документ ожидает окончания транзакции и потом читает счетчик и создает новый IDDOC, т.е. следующий документ не должен быть с тем же IDDOC.
В порядке бреда - проверь все dll на непонятные патчи или замени на проверенные.
Проверь не установил ли кто-то какую-то супер-пупер кеширующую хрень.
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать