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

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

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

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

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

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

Показать все комментарии
импорт
уникальность
Технические вопросы
7.x

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

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

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

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