Добрый день!

 

У нас две компании, соответственно договоры мы заключаем как от одной, так и от другой.

Для различия указываем в номере или АМ, или БМ вручную.

Вопрос: есть ли возможность как-то автоматически нумеровать по порядковому номеру следующего договора в зависимости от компании, которая заключает договор?

Прикрепленные файлы

Нравится

2 комментария
Лучший ответ

Добрый день!

В вашем случае можно использовать дополнение Numerator for Creatio, либо реализовать логику самому: например, через бизнес-процесс с сигналом [Создание договора], который будет изменять номер в зависимости от компании

Добрый день!

В вашем случае можно использовать дополнение Numerator for Creatio, либо реализовать логику самому: например, через бизнес-процесс с сигналом [Создание договора], который будет изменять номер в зависимости от компании

Добрый день.

 

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

 

Вам нужно переопределить метод:

	onEntityInitialized: function() {
		if ((this.isAddMode() && this.Ext.isEmpty(this.get("Number"))) || this.isCopyMode()) {
			this.getIncrementCode(function(response) {
				this.set("Number", response);
			});
		}
		this.callParent(arguments);
	}

Внутри функции getIncrementCode нужно добавить обработку условия от какой компании заключается договор и в зависимости от компании добавлять нужную приставку:

this.set("Number", response + "/" + postfix);

 

Показать все комментарии

Добрый день.

Решил изучить процесс автонумерации на возможность генерации одинаковых номеров.

  1. Настроил процесс в соответствии с инструкцией.
  2. Написал консольное приложение для создания записей в несколько потоков в соответствии с инструкцией.

При первом же тесте по созданию записей в 20 потоков, по 1 записи в каждом потоке, получил следующие результаты:
Дубли2

Собственно вопросы:
Есть ли какая то возможность гарантированно генерировать уникальный номер?
Есть ли возможность модифицировать класс GenerateSequenseNumberUserTask?

Нравится

3 комментария

Здравствуйте!

Альтернативный вариант - генерировать номер по факту создания записи триггером в БД.

"Демьяник Алексей" написал:

Здравствуйте!

Альтернативный вариант - генерировать номер по факту создания записи триггером в БД.


Но, если необходимо генерировать некоторый код на основании уникального номера и некоторых полей из записи, то этот вариант же не подходит.

Например шаблон названия/кода: <Тип_записи>/<Категория_записи>/<Год_создания>_<Уникальный_порядковый_номер>

И есть ли возможность модифицировать класс GenerateSequenseNumberUserTask, который отвечает за генерацию номера?

Здравствуйте!

Можно сделать следующее:
1) В конфигурации выгрузить GenerateSequenseNumberUserTask.md (выделите схему и выберите действие "Экспорт в файл".
2) Открыть выгруженный файл и подменить значения параметров:

  • UID
  • NAME
  • CAPTION

3) Загрузить полученный файл в конфигурацию (действие "Импорт файла")
4) Внести в загруженный файл требуемые изменения
5) Опубликовать изменения
6) Использовать в действии процесса на объекте созданное (импортированное вами действие)

P.S. Все еще не вижу проблемы в создании триггера.

Показать все комментарии

Доброго дня.
Подскажите пожалуйста, не знаю как решить проблемку:
Делал автоматическую нумерацию задач и возникла необходимость пронумеровать все старые задачи (которые были созданы до автонумерации. Они имеют номер 0)
Если у меня последняя задача с номером 4000, то необходимо пронумеровать старые начиная с 4001+

Надеюсь на Вашу помощь.

Terrasoft XRM 3.3.2.43

Нравится

7 комментариев

Здравствуйте.

Выполните обновление записей в БД. Получите список всех записей в таблице tbl_Task у которых номер равен нулю, затем для каждой полученной записи выполните update.

Также, если текущее значение счётчика хранится в системной настройке, его стоит увеличить на количество перенумерованных задач.

Да, значение счетчика хранится в системной настройке.
А автоматизировать каким-либо образом можно сие действие?

Вам же надо обновить 1 раз.

Можно написать SQL-скрипт и запустить.

Cпасибо большое за помощь

Сделал следующим образом:
alter table [Table_name] drop column 'Colomn_Name'
alter table [Table_name] add 'Colomn_name' int identity

Показать все комментарии

Здравствуйте, по инструкции в SDK создал новый раздел "Договоры".
Подскажите, пожалуйста, каким образом можно реализовать автоматическую нумерацию, или где можно посмотреть пример реализации?

Нравится

6 комментариев

Дмитрий, автонумерацию можно реализовать двумя способами. На уровне процесса объекта и на уровне карточки редактирования.
В первом случае, рекомендую посмотреть на процесс объекта Invoice:

Если решите реализовывать на уровне логики карточки, то в качестве примера изучите вызов метода на событии инициализации страницы счета:

this.getIncrementCode(this.entitySchema.name, function(responce) {
    this.set('Number', responce);
});

В обоих случаях, необходимо создать две системные настройки ...LastNumber и ...CodeMask и строковое поле в объекте для хранения номера.

Максим, спасибо.

"Maxim Gritsenko" написал:В первом случае, рекомендую посмотреть на процесс объекта Invoice:

А где смотреть этот процесс в 7.3?

А для начинающих? Этот процесс искать в Конфигурации? Под каким именем?
Всё переискал, не нашел похожего

Этот процесс хранится в объекте. Чтоб его открыть нужно выбрать соответствующий объект в конфигурации, открыть его, нажать на кнопку дополнительно в правом верхнем углу и выбрать "открыть процесс"

Показать все комментарии

Периодически возникает необходимость создавать маски номеров не стандартного типа (%1), а с использованием нулей в начале (например, 000000%1).

При таком использовании нули будут каждый раз добавляться в левой части не зависимо от количества символов, поэтому вместо маски:

00000010

получиться следующая:

000000010

Есть некоторые варианты решения вопроса, но мы «выкрутились» простым кодом JavaScript:

1. Создали для примера следующую маску:

/system/files/invoicemask_1.png

2. Добавили следующий код для счетов:

         var CurrentNumber = Dataset.Values('InvoiceNumber');
         var CurrentNumberLength = CurrentNumber.length;
         if (CurrentNumberLength > 8) {
                   var NewNumber = CurrentNumber.substring(CurrentNumberLength - 8);
                   Dataset.Values('InvoiceNumber') = NewNumber;
         }

/system/files/invoice_2.png

В результате мы получили нумерацию такого типа:

/system/files/invoicenumber_3.png

Нравится

Поделиться

4 комментария

Доброго времени суток всем!
Недавно вот придумал такой еще универсальный вариант:

В сервисе 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 возможно. Когда второй пользователь его уже получает пока первый еще не изменил. Но, фактически ситуация настолько маловероятна, если учесть что проме этих двух запросов в БД будет еще с десяток других идти, и все они будут в очередь попадать...

В целом, можно не беспокоиться.

Позволю себе не согласиться...

У нас регулярно происходят подобные ситуации, правда применительно к шагам процесса, а не генерации уникальных номеров. Когда-нибудь думаю дойдут руки поправить.

Этот код не обеспечивает самого главного: последовательной и уникальной генерации номеров.
Принцип "ситуация настолько маловероятна" когда пользователей достаточно много, и сервер БД все таки сервер, а не настольный компьютер, к сожалению, не работает.

Показать все комментарии