Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как эмулировать константу-счетчик, не используя 1sconst? (число прочтений - 8526 )
ANik
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 66
Зарегистрирован: 03. Мая 2007
Как эмулировать константу-счетчик, не используя 1sconst?
11. Декабря 2012 :: 04:42
Печать  
Видел уже такую тему N лет назад. Константа-счетчик для МОД "УникальныйИДД" стала "сбоить" из-за восросшей нагрузки. Надо вынести ее отдельно. Вариант создания отдельной SQL таблички мне не глянулся - слишком велики возможные последствия при выгрузке-загрузке базы с потерей этой таблички.
А если завести справочник с единственным элементом и писать-читать прямым запросом - это допустимо? И какие нюансы (опыта маловато - на запись вообще не работал).
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #1 - 11. Декабря 2012 :: 04:45
Печать  
КонецЦикла на ис приводил решение
http://infostart.ru/public/17114/
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #2 - 11. Декабря 2012 :: 04:58
Печать  
Кстати, МОД + блокировки от ТойСКЛ - это вообще бомба замедленного действия.
Нам пришлось разруливать вообще вот так (благо у Тойа есть возможность использования не-родного соединения):


Код
Выбрать все
Функция ПолучитьНовыйИДД()
	ЗапросСКЛ.Выполнить("BEGIN TRAN");
	КонстантаКемТоЗаблокирована=1;
	Пока КонстантаКемТоЗаблокирована=1 Цикл
		Блок	= блНачало();
		Рез		= Блок.БлокировкаОбъекта("объект.ИДД",, "EXCLUSIVE");
		Если Рез = 0 Тогда
			Система = СоздатьОбъект("Система");
			Система.Sleep(1000);
		Иначе
			КонстантаКемТоЗаблокирована=0;
		КонецЕсли;
	КонецЦикла;

	Если КонстантаКемТоЗаблокирована = 0 Тогда
		//Увеличиваем счетчик в константе на единицу
		тзп_УвеличениеИДД = "Set NoCount ON
		|UPDATE _1SConst
		|	SET VALUE = convert(varchar(255), convert(int, VALUE) + 1)
		|WHERE
		|	ID = '" + РадугаСервис.ИДКонстанты("УникальныйIDD") + "'
		|";

		Запрос = СоздатьОбъект("ToyQuery");
		Запрос.Соединиться(1);
		Если Запрос.ВыполнитьЗапрос(тзп_УвеличениеИДД) <> 1 Тогда
			Рез = 1/0;	// это большая ##па и лучше вызвать исключение
		КонецЕсли;

		никальныйIDD),10);
	КонецЕсли;

	ЗапросСКЛ.Выполнить("exec sp_releaseapplock 'ИДД'");
	ЗапросСКЛ.Выполнить("IF @@TRANCOUNT > 0 COMMIT TRANSACTION");

	Возврат Рез;
КонецФункции
 



Ибо в обычном случае, если при проведении документов идет создание объектов и требуется выделение ИДД - то константа блокируется на все время выполнения транзакции.
А еще более веселый случай - в транзакции создание нескольких связных документов.
И пока она не завершится - фиг кто что сможет новое записать.
  
Наверх
 
IP записан
 
ANik
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 66
Зарегистрирован: 03. Мая 2007
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #3 - 11. Декабря 2012 :: 05:02
Печать  
Да - именно это. Смущает только внешняя таблица - можно заменить ее на справочник с одним единственным элементом?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #4 - 11. Декабря 2012 :: 05:09
Печать  
можно. разницы никакой не будет
  
Наверх
 
IP записан
 
ANik
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 66
Зарегистрирован: 03. Мая 2007
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #5 - 11. Декабря 2012 :: 05:09
Печать  
Satans Claws писал(а) 11. Декабря 2012 :: 04:58:
Кстати, МОД + блокировки от ТойСКЛ - это вообще бомба замедленного действия.
Нам пришлось разруливать вообще вот так (благо у Тойа есть возможность использования не-родного соединения):

Спасибо - у меня по другому. Регистрация объектов МОД, как и присвоение ИДД, отключено. ИДД присваивается при выгрузке объекта.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #6 - 11. Декабря 2012 :: 05:12
Печать  
Штатно, тоже можно улучшить, достаточно везде в конфе закомментить это:

Код
Выбрать все
//Стр=ТекущееВремя();
//Пока Стр=ТекущееВремя() Цикл
//КонецЦикла;
 

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #7 - 11. Декабря 2012 :: 05:14
Печать  
ANik писал(а) 11. Декабря 2012 :: 05:09:
ИДД присваивается при выгрузке объекта.


Дык, на константе  основано всё же присвоение ИДД ?
  
Наверх
 
IP записан
 
ANik
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 66
Зарегистрирован: 03. Мая 2007
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #8 - 11. Декабря 2012 :: 05:20
Печать  
Да, на константе. А те строки уже 100 лет заремлены с Вашей же подачи. Спасибо!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #9 - 11. Декабря 2012 :: 05:22
Печать  
Ну, как у КонецЦикла слепи, только не на табличке в скуле, а на табличке справочника..запрос там будет таким же, раз боишься потерять данную табличку при выгрузке/загрузке.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #10 - 11. Декабря 2012 :: 05:46
Печать  
а ИД обязательно должен быть числовым и возрастающим?
может быть возможно на GUID перейти?
  

1&&2&&3
Наверх
 
IP записан
 
ANik
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 66
Зарегистрирован: 03. Мая 2007
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #11 - 11. Декабря 2012 :: 05:50
Печать  
Скорее всего, можно. Но я уже все сделал Улыбка
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #12 - 11. Декабря 2012 :: 05:55
Печать  
trad писал(а) 11. Декабря 2012 :: 05:46:
а ИД обязательно должен быть числовым и возрастающим?
может быть возможно на GUID перейти?


можно и гуид, но только не удобно это.
У пб-ников сразу видно, по первым символам, с какой базы объект + ручная правка идд облегчает работу, при создании нескольких объектов из одного (достаточно первые символы в идд поменять)

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #13 - 11. Декабря 2012 :: 06:10
Печать  
Eprst писал(а) 11. Декабря 2012 :: 05:55:
У пб-ников сразу видно, по первым символам, с какой базы объект
я так понимаю по префиксу? к гуиду такой префикс/суфикс тоже не проблема приделать

Цитата:
+ ручная правка идд облегчает работу, при создании нескольких объектов из одного (достаточно первые символы в идд поменять)
новый гуид тоже не проблема сгенерить

Ну это я все так, для развития темы Улыбка
Конечно, делать надо так как проще.
  

1&&2&&3
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как эмулировать константу-счетчик, не используя 1sconst?
Ответ #14 - 11. Декабря 2012 :: 06:26
Печать  
Да.
ИДД состоит из кода базы (5 символов) и остальное под номер.
в принципе, хватает и этого


  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать