Быстрое получение уникального числового значения без блокировок
Столкнулся с проблемой блокировок/тормозов при назначении уникального Штрихкода.
Работало через поиск Макс. значения в Регистре сведений и записи туда нового значения.
В принципе данный функционал можно использовать для создания уникальныхзначений.
- Описание
- Подробнее
Описание
Решение созрело такое:
1. Создается табличка прямо в БД 1С вида:
(для MS SQL Server)
CREATE TABLE [dbo].[zbarcodes](
[ID] [bigint] IDENTITY([НАЧАЛЬНОЕЗНАЧЕНИЕСЧЕТЧИКА],1) NOT NULL,
CONSTRAINT [PK_zbarcodes] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
[НАЧАЛЬНОЕЗНАЧЕНИЕСЧЕТЧИКА] — заменить на число, например 20000000000 — первый шк в системе (или другое число — последнее в Вашей учетной системе, если хочется продолжить текущую нумерацию)
2. Создаем Процедурку в общем модуле с выполнением на сервере (для УФ)
//Процедура получения уникального штрихкода (у нас используется Code 128 — без контрольных символов)
//Параметры:
//Организация — можно сделать таблицы на каждую организацию — и получать по организации имя таблицы в БД из ЗначенияСвойствОбъектов
//СтруктураПараметров — параметры подключения к БД SQL через ADO
Функция ПолучитьНовыйШтрихкод(Организация, СтруктураПараметров) Экспорт
Соединение= Новый COMObject(«ADODB.Connection»);
Соединение.ConnectionString = «Driver={SQL Server};Server=» + СокрЛП(СтруктураПараметров.Сервер)
+ «;UID=» + СокрЛП(СтруктураПараметров.Логин)
+ «;pwd=» + СокрЛП(СтруктураПараметров.Пароль)
+ «;Database=» + СокрЛП(СтруктураПараметров.БД);
Соединение.ConnectionTimeOut = 40;
Соединение.CommandTimeout = 0;
Соединение.CursorLocation = 3;
Попытка
Соединение.Open();
Исключение
#Если Клиент Тогда
Сообщить(«Возникла ошибка подключения к базе»);
#КонецЕсли
Соединение=»»;
Возврат Неопределено;
КонецПопытки;
ТекстЗапроса=»INSERT into zbarcodes DEFAULT VALUES»;
Соединение.Execute(ТекстЗапроса);
ТекстЗапроса=»SELECT @@IDENTITY»;
Выборка=Соединение.Execute(ТекстЗапроса);
НовыйШтрихкод=Выборка.Fields(0).Value;
Выборка.Close();
Выборка =»»
Соединение = «»;
Возврат НовыйШтрихкод;
КонецФункции
В итоге все забыли что такое блокировки при присвоении новых штрихкодов, и обеспечена уникальность штрихкода, + скорость получения значения!

