Проверка уникальности номеров счетов

C наступлением нового года в 1С счетчики счетов сбросились. Номера счетов в 1С и Террасофт одинаковы. В террасофт осуществляется проверка на уникальность номера счета. При этом пользователю для того, чтобы сохранить изменения в карточке счета, приходится по нескольку раз нажимать что он согласен сохранить счет с дублирующимся номером. Проверку можно отключить совсем в системных настройках, но это не самое лучшее решение.

Как доработать функцию проверки уникального номера, чтобы она проверяла счета, у которых даты счета имеют одинаковый год? Если дата счета не заполнена, то тогда проверку уникальности делать без учета этой даты.

Нравится

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

Здравствуйте,
Проверка на дубли проходит по нажатию кнопки Ок, в карточке счета
Код с в XRM 3.4.0.49

...
function btnOKOnClick(Control) {
var Dataset = dlData.Dataset;
var DefaultValues = GetAttribute(Self, 'DefaultValues');
/* MODULE WORKFLOW */
var WorkflowItemID = Dataset.ValAsStr('WorkflowItemID');
/* ENDMODULE WORKFLOW */
if (!CheckItemNumberDuplicate('Invoice', Dataset, 'InvoiceNumber',
"Счет")) {
return;
}

...

Предлагаю доработать функцию CheckItemNumberDuplicate с scr_CommonActions
1) Добавим в нее функцию сравнения года

function IsInvoiceSameYear(date_1,date_2)
{
var res1 = new Date(date_1).getFullYear();
var res2 = new Date(date_2).getFullYear();
if (res1 == res2)
return true;
else
return false;
}

2) Подредактируем CheckItemNumberDuplicate

function CheckItemNumberDuplicate(ItemName, Dataset, DataFieldName,
ItemCaption) {
var ParameterName = FormatStr('Check%1NumberDuplicates', ItemName);
var CheckDuplicates = GetSystemParameterValueEx(ParameterName, true);
var RecordID = Dataset.Values('ID');
if (CheckDuplicates) {
var Value = Dataset.Values(DataFieldName);
var TableName = FormatStr('tbl_%1', ItemName);
var FieldArray = new Array (DataFieldName, 'ID');
var ValuesArray = new Array (Value, RecordID);
var TypeArray = new Array (sdtUnicodeString, sdtIdentity);
var CompareOperatorTypeArray = new Array (cotEqual, cotNotEqual);
var DuplicatesRecordID = GetRecordIDByFilter(TableName, TypeArray,
FieldArray, ValuesArray, CompareOperatorTypeArray);
if (!IsEmptyValue(DuplicatesRecordID)){

if (ItemName == 'Invoice' && !IsEmpty(Dataset.Values('InvoiceDate')))
{
if ( IsInvoiceSameYear(Dataset.Values('InvoiceDate'),
GetDatasetFieldValuesByID('ds_Invoice',DuplicatesRecordID,'InvoiceDate').Item('InvoiceDate')))
{
var Message = FormatStr("%1 с номером %2 уже существует." + ' ' +
"Сохранить данную запись?", ItemCaption, Value);
Message = PrepareDialogMessage(Message);
return (ShowConfirmationDialog(Message) == wmrYes)
}
else
return true;
}
else

{
var Message = FormatStr("%1 с номером %2 уже существует." + ' ' +
"Сохранить данную запись?", ItemCaption, Value);
Message = PrepareDialogMessage(Message);
return (ShowConfirmationDialog(Message) == wmrYes)
}

}
}
return true;
}

Алексей, спасибо за помощь.

Но что-то меня смущает что в DuplicatesRecordID возвращается только одна из дублирующихся записей. И эта запись может быть как текущего года, так и любого другого года. В результате при неудачном стечении обстоятельств мы можем не заметить дублирование номеров счетов в текущем году.

Не могли бы Вы помочь доработать этот вопрос.

Согласен, предлагаю следующий вариант
1)В scr_DB добавить функцию

function GetRecordsIDByFilter(TableName, TypeArray, FieldArray, ValueArray,
	CompareOperatorTypeArray){
	var Table = GetSingleItemByCode(TableName);
	var Query = CreateSelectQueryByTable(Table, TypeArray, FieldArray,
		ValueArray, CompareOperatorTypeArray); //получим все записи, (! не только первую)
	var Dataset = Query.Open();	
 
    var arrval = new Array();
 		Dataset.GotoFirst();
	while (!Dataset.IsEOF) {
		arrval.push(Dataset.Values('ID'));
		Dataset.GotoNext();		
		} 	
	Dataset.Close();
	return arrval;
}

2) В scr_CommonActions определить свою функцию CheckInvoiceNumberDuplicate, котороя есть по сути CheckItemNumberDuplicate с модифицированной проверкой

function CheckInvoiceNumberDuplicate(ItemName, Dataset, DataFieldName,
	ItemCaption) {
	var ParameterName = FormatStr('Check%1NumberDuplicates', ItemName);
	var CheckDuplicates = GetSystemParameterValueEx(ParameterName, true);
	var RecordID = Dataset.Values('ID');
	if (CheckDuplicates) {
		var Value = Dataset.Values(DataFieldName);
		var TableName = FormatStr('tbl_%1', ItemName);
		var FieldArray = new Array (DataFieldName, 'ID');
		var ValuesArray = new Array (Value, RecordID);
		var TypeArray = new Array (sdtUnicodeString, sdtIdentity);
		var CompareOperatorTypeArray = new Array (cotEqual, cotNotEqual);
		var DuplicatesRecordIDs = GetRecordsIDByFilter(TableName, TypeArray,
			FieldArray, ValuesArray, CompareOperatorTypeArray);
  		if (!IsEmptyValue(DuplicatesRecordIDs)){
 
		var showMessage = false;  		  		
 
  		if (ItemName == 'Invoice' && !IsEmpty(Dataset.Values('InvoiceDate')))
  		{
  		    for (var i = 0; i < DuplicatesRecordIDs.length; i++) 		  	  		  
  		    {
			var InvoiceDuplicID = DuplicatesRecordIDs[i];
 
			if (IsInvoiceSameYear(Dataset.Values('InvoiceDate'),
			GetDatasetFieldValuesByID('ds_Invoice',InvoiceDuplicID,'InvoiceDate').Item('InvoiceDate')))	
	        {
 
			var Message = FormatStr("%1 с номером %2 уже существует." + ' ' +
			"Сохранить данную запись?", ItemCaption, Value);
			Message = PrepareDialogMessage(Message);
			return (ShowConfirmationDialog(Message) == wmrYes)
		    }
 
			}
 
		}
 
		}
	}
	return true;
}

3) В скрипте карточки счета wnd_InvoiceEditScript вызывать CheckInvoiceNumberDuplicate вместо CheckItemNumberDuplicate

//  	if (!CheckItemNumberDuplicate('Invoice', Dataset, 'InvoiceNumber',
//	  	"Счет")) {
//	  	return;
//	}
  	if (!CheckInvoiceNumberDuplicate('Invoice', Dataset, 'InvoiceNumber',
	  	"Счет")) {
	  	return;
	}

4) Не забыть про IsInvoiceSameYear моего сообщения выше

Спасибо большое, Алексей, всё получилось.

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