Периодически возникает необходимость создавать маски номеров не стандартного типа (%1), а с использованием нулей в начале (например, 000000%1).
При таком использовании нули будут каждый раз добавляться в левой части не зависимо от количества символов, поэтому вместо маски:
00000010
получиться следующая:
000000010
Есть некоторые варианты решения вопроса, но мы «выкрутились» простым кодом JavaScript:
1. Создали для примера следующую маску:

2. Добавили следующий код для счетов:
var CurrentNumberLength = CurrentNumber.length;
if (CurrentNumberLength > 8) {
var NewNumber = CurrentNumber.substring(CurrentNumberLength - 8);
Dataset.Values('InvoiceNumber') = NewNumber;
}
В результате мы получили нумерацию такого типа:

Доброго времени суток всем!
Недавно вот придумал такой еще универсальный вариант:
В сервисе Common\Library\scr_CommonActions приведите функцию
function GenerateSystemNumber(ItemName) к виду:
[javascript]
function GenerateSystemNumber(ItemName) {
var GeneratedNumber;
var SystemParameterName = FormatStr('%1Number', ItemName);
var MaskName = FormatStr('%1Mask', ItemName);
var SystemNumber =
GetSystemParameterValueEx(SystemParameterName, true) + 1;
try {
var MaskLength = System.GetSystemSettingValue(FormatStr('%1Length', MaskName), false);
while (SystemNumber.toString().length < MaskLength) {
SystemNumber = '0'.concat(SystemNumber);
}
} catch (e) {
Log.Write(0, e.message);
} finally {
//var MaskLength = null;
}
SetSystemParameterValue(SystemParameterName, SystemNumber);
var Mask = GetSystemParameterValueEx(MaskName, false);
if ((Mask != EmptyStr) && (Mask != undefined) && (Mask != null)) {
GeneratedNumber = FormatStr(Mask, SystemNumber.toString());
} else {
GeneratedNumber = SystemNumber.toString();
}
return GeneratedNumber;
}
[/javascript]
Теперь, для автоматического заполнения номера записи нулями слева, нужно ввести дополнительный системный параметр под каждый раздел, где это нужно:
[code]
<Имя Разделя>Length
[/code].
Например:
раздел Счета - Invoice
маска счета: InvoiceMask
количество символов номера в номере счета: InvoiceMaskLength
Здравствуйте, Павел!
Есть вопрос: что будет, если в момент времени между выполнением строк
[javascript]
var SystemNumber =
GetSystemParameterValueEx(SystemParameterName, true) + 1;
[/javascript]
и
[javascript]
SetSystemParameterValue(SystemParameterName, SystemNumber);
[/javascript]
то же самое проделает скрипт другого пользователя?
Например, если у нас в системе не 10-20 пользователей работают, а 200-500?
Здравствуйте!
Если такая ситуация в жизни возможна - приведет только к тому, что в системе появится 2 счета с одинаковыми номерами. Но к ошибке это точно не приведет. Т.к. GetSystemParameterValueEx и SetSystemParameterValue приводят к обращению в СУБД, а она уже управляет очередью запросов.
Поэтому, теориетически, если рассматривать "чистую модель" ситуации, получение одного и того же параметра SystemParameterName возможно. Когда второй пользователь его уже получает пока первый еще не изменил. Но, фактически ситуация настолько маловероятна, если учесть что проме этих двух запросов в БД будет еще с десяток других идти, и все они будут в очередь попадать...
В целом, можно не беспокоиться.
Позволю себе не согласиться...
У нас регулярно происходят подобные ситуации, правда применительно к шагам процесса, а не генерации уникальных номеров. Когда-нибудь думаю дойдут руки поправить.
Этот код не обеспечивает самого главного: последовательной и уникальной генерации номеров.
Принцип "ситуация настолько маловероятна" когда пользователей достаточно много, и сервер БД все таки сервер, а не настольный компьютер, к сожалению, не работает.