счет
уникальность
Технические вопросы
Разработка

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

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) Добавим в нее функцию сравнения года
[javascript]
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;
}
[/javascript]

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 добавить функцию
[javascript]
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;
}
[/javascript]

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

[javascript]
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;
}
[/javascript]

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

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

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

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

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