C наступлением нового года в 1С счетчики счетов сбросились. Номера счетов в 1С и Террасофт одинаковы. В террасофт осуществляется проверка на уникальность номера счета. При этом пользователю для того, чтобы сохранить изменения в карточке счета, приходится по нескольку раз нажимать что он согласен сохранить счет с дублирующимся номером. Проверку можно отключить совсем в системных настройках, но это не самое лучшее решение.
Как доработать функцию проверки уникального номера, чтобы она проверяла счета, у которых даты счета имеют одинаковый год? Если дата счета не заполнена, то тогда проверку уникальности делать без учета этой даты.
Нравится
Здравствуйте,
Проверка на дубли проходит по нажатию кнопки Ок, в карточке счета
Код с в 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 моего сообщения выше