Периодически возникает необходимость создавать маски номеров не стандартного типа (%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) к виду:
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; }
Теперь, для автоматического заполнения номера записи нулями слева, нужно ввести дополнительный системный параметр под каждый раздел, где это нужно:
<Имя Разделя><Mask>Length
.
Например:
раздел Счета - Invoice
маска счета: InvoiceMask
количество символов номера в номере счета: InvoiceMaskLength
Здравствуйте, Павел!
Есть вопрос: что будет, если в момент времени между выполнением строк
var SystemNumber = GetSystemParameterValueEx(SystemParameterName, true) + 1;
и
SetSystemParameterValue(SystemParameterName, SystemNumber);
то же самое проделает скрипт другого пользователя?
Например, если у нас в системе не 10-20 пользователей работают, а 200-500?
Здравствуйте!
Если такая ситуация в жизни возможна - приведет только к тому, что в системе появится 2 счета с одинаковыми номерами. Но к ошибке это точно не приведет. Т.к. GetSystemParameterValueEx и SetSystemParameterValue приводят к обращению в СУБД, а она уже управляет очередью запросов.
Поэтому, теориетически, если рассматривать "чистую модель" ситуации, получение одного и того же параметра SystemParameterName возможно. Когда второй пользователь его уже получает пока первый еще не изменил. Но, фактически ситуация настолько маловероятна, если учесть что проме этих двух запросов в БД будет еще с десяток других идти, и все они будут в очередь попадать...
В целом, можно не беспокоиться.
Позволю себе не согласиться...
У нас регулярно происходят подобные ситуации, правда применительно к шагам процесса, а не генерации уникальных номеров. Когда-нибудь думаю дойдут руки поправить.
Этот код не обеспечивает самого главного: последовательной и уникальной генерации номеров.
Принцип "ситуация настолько маловероятна" когда пользователей достаточно много, и сервер БД все таки сервер, а не настольный компьютер, к сожалению, не работает.