Сделать проверку уникальности полей (например, название контрагента, регистрационный номер, имя контакта, номер телефона и т.п. - можно еще выбирать на уровне конфигурации) во время ввода данных.Тогда если пользователь введет в карточку нового контакта имя и фамилию, то система сразу предупредит, что уже есть такой, а не будет молчаливо дожидаться, пока пользователь потратит минут 10 на ввод всей имеющейся информации, чтобы потом обнаружить, что такой контакт уже есть в системе. Думаю, что Select по полю не так сильно скажется на объеме трафика и быстродействии. Тем более, что можно это и отключать по желанию пользователя
4 комментария

Обнаружили, что подобное происходит в разделе Документы, но лишь при сохранении карточки.

На и так не особо шустром интерфейсе скажется плохо :) а так идея хорошая

"Александр Кудряшов" написал:На и так не особо шустром интерфейсе скажется плохо

Думаю, что с индексами будет не медленнее, чем подтягивание значений в Lookup

плюсую, но только при наличии настройки в профиле

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

Коллеги, необходим ваш опыт.

Есть Excel с контактами и несколькими e-mail, телефонами и прочими средствами связи. Их необходимо проимпортировать в систему.
Ситуация осложняется тем, что список большой, встречаются контакты с одинаковыми именами и фамилиями (похожая ситуация с контрагентами - специфика отрасли такая, что могут быть одинаковые названия).

В объекты Contact, Account еще можно заимпортировать всё, добавив уникакальный ключ. Но как заимпортировать в объекты Communication Options for Contact (средства связи) по этому ключу?
Как я понимаю, механизм импорта bpm'online проверяет уникальность контактов и контрагентов (и других сущностей) только лишь по названию, а этого не хватает для импорта деталей.

Спасибо за идеи!

Нравится

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

Здравствуйте, Владимир.

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

Например, Вы можете перед импортом исключить появление в файле импорта контактов с одинаковыми именами.
Если такие контакты уже есть в системе, то перед импортом средств связи переименовать некоторые из них, выполнить импорт, а затем переименовать обратно.

Другим вариантом (непользовательским) выполнения подобного импорта является "insert" напрямую в базу данных, используя sql-сценарий (в случае On-Demand).

"Безродный Андрей" написал:Например, Вы можете перед импортом исключить появление в файле импорта контактов с одинаковыми именами.

Да, наверное, в Excel-файле подключу к этим названиям дополнительный код, а потом после импорта уже с помощью SQL этот код уберу.

Но хотелось бы вернуть возможность, как в TS 3.X определять уникальность по нескольким полям.

Владимир,

проверять уникальность можно по нескольким полям, но лишь по полям объекта, куда Вы импортируете данные.

По данному вопросу будет зарегистрирована идея и передана аналитикам для обсуждения реализации функционала в будущих версиях.

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

Добрый день!
Прошу совета по настройке интеграции контрагентов с 1С 8.
Контрагенты выгружаются в 1С только при создании счета (чтобы не засорять базу бухгалтерии).
Есть ситуация: в ТС создали контрагента (пока счета нет). В 1С создали того же контрагента.

Если использовать в качестве ключевого поля "Уникальный идентификатор 1С", то при выгрузке контрагента из ТС в 1С произойдет задвоение.

Если использовать набор ИНН+КПП, то это поле может изменится в дальнейшем (например, если клиент дал неправильные данные и потом прислал верные) и опять произойдет задвоение.

Есть вариант при первичной интеграции осуществлять поиск по ИНН+КПП (пока в ТС нет данных об UID1C). А после уже по UID1C, т.к. оно неизменно. Но не знаю есть ли возможность реализовать такой вариант.

Подскажите, пожалуйста, как можно поступить? Как вы реализовываете двустороннюю интеграцию контрагентов?

Нравится

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

Дмитрий, а если проверять по ИНН + КПП, в случае если контрагент с таким UID1C не найден?
Ведь время между созданием одного и того же контрагента в 1С и в Террасофте не должно превышать 1-2 дней, верно? Т.е. за это время, в 1С, по идее, не должны сменить ему ИНН+КПП. А уже после этого даже если сменят - уже будет проверка по UID1C.

Да, такой вариант я думаю возможен. А можно ли это реализовать используя утилиту интеграции из каталога расширений? Чтобы сначала проверял по ИНН+КПП, а в следующий раз по UID?

Я думаю необходимо как раз наоборот, сначала проверить по UID, и если соответствия не найдено (т.е. поле UID в Террасофте null) то проверять по ИНН+КПП.
По идее, можно попробовать в настройках интеграции выставить для этих трех полей соответсвующий признак - должно работать.
Но я бы порекомендовал создать скрипт интеграции, и написать код на OnBeforeRecordExport. Что-то вроде:

if(Dataset('UID1C') == null)
{
var INN = Dataset('INN');
var KPP = Dataset('KPP');
var Account1C = Param.Obj1C.Справочники.Контрагенты;
if(Account1C.НайтиПоАтрибуту('ИНН', INN) == 1 && Account1C.НайтиПоАтрибуту('КПП', KPP) == 1)
{
//return false; чтобы отменить экпорт
//либо
//Account1C.SetAttrib('Наименование') = Dataset('Name');
//и т.д.
//Account1C.Записать();
}
}

Спасибо, сейчас посмотрю.

Экспорт из ТС в 1С сделал, все нормально. Теперь думаю как реализовать импорт из 1С.
Такая же ситуация, нужно проверить по ИНН+КПП, если нет связи по UID.
Получается нужно также руками создавать контрагента и на OnBeforeRecordImport возвращать true?
Но тогда не сработают подчиненные интеграции?

У меня есть настроенная подчиненная интеграция адресов контрагента (Импорт из 1С).
Можно ли запустить подчиненную интеграцию из скрипта передав туда ID контрагента?

Получилось сделать, используя функцию ImportDetails

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

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 моего сообщения выше

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

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