1С добавить Реквизит (EmailКонтрагента) из 1С

Здравствуйте!
Террасофт 3.5.1, 1С 8.3.
Есть настроенная интеграция: экспорт контрагентов из ТС в 1С. Все нужные поля экспортируются.
Понадобилось добавить экспорт e-mail'ов контрагентов. В ТС и 1С эти поля есть. Но в 1С это поле на форме. А в реквизитах в 1С нет этого значения (EmailКонтрагента).
Добавил в реквизиты Контрагентов в 1С реквизит EmailКонтрагента. В ТС выполнил Загрузка метаданных 1С. Но в ТС для Контрагентов не появился этот реквизит. См. скриншоты.

Как добавить реквизит EmailКонтрагента в ТС?

Нравится

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

Добрый день.
Сохраняли, компилировали конфигурацию 1с? Дайте скриншот реквизитов из 1с Конфигуратора, скриншот поля с формы не подходит, т.к. как вы верно заметили, далеко не факт, что он ссылается на реквизит объекта :)

Спасибо, Дмитрий. Да, я не скомпилировал конфигурацию.
Сейчас скомпилировал, поле EmailКонтрагента появилось в ТС.
Выполняю в OnBeforeRecordExport стандартную функцию:

Select1C.EmailКонтрагента =  'test@test2015.ru';  

Но, в 1С в поле email ничего не пишется. Такое ощущение, что созданный мною реквизит в 1С не привязан к поле email на форме Контрагента.
Как его можно привязать?

А покажите свойства поля, там возможно где-то указывается реквизит, к которому оно привязано?

Но, если в 1С выполнить Запрос выбора данного контрагента, то там в поле EmailКонтрагента есть 'test@test2015.ru'.(см. скриншот) Значит скрипт отработал и записал. Только непонятно, почему на форме не отображается этот email. Или это поле на форме привязано к другому полю?
Вот картинка: синим это email на форме. Справа его свойства. При открытии ПутькДанным открывается окно Выбор Реквизита...

Записал в 1С вручную в этом поле email 123@aaa.ru. Выполнил запрос в 1С и увидел данный email в другом поле, но в таком виде:

Теперь как из ТС в 1С это экспортировать...

Что-то мне напоминает это поведение эту тему:

http://www.community.terrasoft.ru/forum/topic/11984#comment-51983

пс: я, к сожалению, с таким не сталкивался.

Дмитрий, посмотрел тему. У меня в 1с по запросу выдает email в КонтактнаяИнформация (если email забить в ручную в 1С): (скриншот)

email находится в полях: Представление, АдресЭП и в поле ЗначенияПолей (xml формат).
Т.к. мы в 1С в ручную заносим email в одно поле, то потом, видимо скрипт 1С разносит email по другим полям.
Можно ли попробовать записать программно email хотя бы в поле Представление или АдресЭП?

Добрый день.
Конечно можно. Но, по-моему это регистр сведений. Нужно делать подчиненную настройку.
Там еще проблемы с маппингом будут, поэтому лучше всего - перед импортом и экспортом очищать контактную информацию как в тс так и в 1с (это если у вас двусторонняя интеграция).

Дмитрий, у меня только Экспорт в 1С.
"Нужно делать подчиненную настройку."
Можете показать пример как программно (в OnBeforeRecordExport ) это сделать?

Вот примерчик с одного из проектов, может поможет.

Экспорт:

function OnAfterRecordExport(Param, Dataset, Select1C) {
	//удалить  все адреса и средства связи	
	var ci1C = Param.Obj1C.РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей(); 
	ci1C.Отбор.Объект.Установить(Select1C.Ссылка);
	//[не регистрируем изменения на стороне 1с	
	ci1C.ОбменДанными.Получатели.АвтоЗаполнение = false;
	//]
	ci1C.Записать(); 	
	//Адреса
	var AccountID = Dataset('ID');	
	var ds = Services.GetNewItemByUSI('ds_AccountAddress');
	ApplyDatasetFilter(ds, 'AccountID', AccountID, true);
	ds.Open();
	while(!ds.IsEOF) {
		var ci1CMain = Param.Obj1C.РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
		var ci1C = ci1CMain.Добавить();
		ci1C.Объект = Select1C.Ссылка;
		var met=Param.Obj1C.Метаданные.Перечисления.Найти("ТипыКонтактнойИнформации");
		var meta=met.ЗначенияПеречисления.Найти('Адрес');
		var metalink = Param.Obj1C.Перечисления.ТипыКонтактнойИнформации[meta.Имя];
		ci1C.Тип = metalink;
		var AdrTypeID = ds('KLADRAddressTypeID');
		var AdrTypeUID1C = GetDatasetFieldValueByID('ds_AddressType',
			AdrTypeID, 'UID1C');
		var AddressType1CLink;
		if(!IsEmptyValue(AdrTypeUID1C)) {
			AddressType1CLink = GetObjectLinkByUID(
					Param.Obj1C.Справочники.ВидыКонтактнойИнформации, AdrTypeUID1C, Param);	
			ci1C.Вид = !AddressType1CLink.Пустая() ? AddressType1CLink : null;
			ci1C.Представление = ds('KLADRAddress');
			ci1C.Поле1 = ds('KLADRAddressZIP');
			ci1C.Поле2 = ds('KLADRAddressSubject');
			ci1C.Поле3 = ds('KLADRAddressRegion');
			ci1C.Поле4 = ds('KLADRAddressDistrictCenter');
			ci1C.Поле5 = ds('KLADRAddressCity');
			ci1C.Поле6 = ds('KLADRAddressStreet');
			ci1C.Поле7 = ds('KLADRAddressHouse');
			ci1C.Поле8 = ds('KLADRAddressCase');
			ci1C.Поле9 = ds('KLADRAddressFlat');
			//[не регистрируем изменения на стороне 1с	
			ci1CMain.ОбменДанными.Получатели.АвтоЗаполнение = false;
			//]	
			try {				
			ci1CMain.Записать(false); } catch(e) {}
		}		
		ds.GotoNext();
	}
	ds.Close();					
	//Средства связи	
	var ds = Services.GetNewItemByUSI('ds_AccountCommunication');
	ApplyDatasetFilter(ds, 'AccountID', AccountID, true);
	ds.Open();
 
	//[найти одинаковые типы средств связи
	while(!ds.IsEOF) {
		var CommTypeID = ds('CommunicationTypeID');
		var indx = Contains(ObjExport.CommTypeArray, CommTypeID);
		if(indx == false && typeof indx == 'boolean') {
			ObjExport.CommTypeArray.push([ds('CommunicationTypeID'), ds('Number')]);
		} else {
			ObjExport.CommTypeArray[indx] = [CommTypeID, (ObjExport.CommTypeArray[indx][1] +';'+ ds('Number'))]; 
		}
		ds.GotoNext();
	} 	
	//] 
	var phone = '';	
	for (var i = 0; i < ObjExport.CommTypeArray.length; i++) {
		var ci1CMain = Param.Obj1C.РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
		var ci1C = ci1CMain.Добавить();
		ci1C.Объект = Select1C.Ссылка;
		var CommunicationTypeID = ObjExport.CommTypeArray[i][0];		
		var Values = GetDatasetFieldValuesByIDEx('ds_CommunicationType', 
			CommunicationTypeID, ['UID1C', 'IsPhone']);
		if(IsEmptyValue(Values)) {
			continue;
		}
		if(Values('IsPhone')) {
			var ci1C2Main = Param.Obj1C.РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
			var ci1C2 = ci1C2Main.Добавить();
			ci1C2.Объект = Select1C.Ссылка;		
			var met=Param.Obj1C.Метаданные.Перечисления.Найти("ТипыКонтактнойИнформации");
			var meta=met.ЗначенияПеречисления.Найти('Телефон');
			var metalink = Param.Obj1C.Перечисления.ТипыКонтактнойИнформации[meta.Имя];
			ci1C2.Тип = metalink;
			var CommunicationTypeUID1C = Values('UID1C');
			var CommunicationType1CLink;
			if(!IsEmptyValue(CommunicationTypeUID1C)) {
				CommunicationType1CLink = GetObjectLinkByUID(
					Param.Obj1C.Справочники.ВидыКонтактнойИнформации, 
					CommunicationTypeUID1C, Param);	
				ci1C2.Вид = !CommunicationType1CLink.Пустая() ? CommunicationType1CLink : null;
		    }
			phone = ObjExport.CommTypeArray[i][1];
			ci1C2.Представление = phone;	
			ci1C2.Поле3 = phone;
			try {
				//[не регистрируем изменения на стороне 1с	
				ci1C2Main.ОбменДанными.Получатели.АвтоЗаполнение = false;
				//]				
				ci1C2Main.Записать(false);	
			} catch(e) {}			
		} else {			
			var CommunicationTypeUID1C = Values('UID1C');
			var CommunicationType1CLink;
			if(!IsEmptyValue(CommunicationTypeUID1C)) {
				CommunicationType1CLink = GetObjectLinkByUID(
						Param.Obj1C.Справочники.ВидыКонтактнойИнформации, 
						CommunicationTypeUID1C, Param);	
				ci1C.Вид = !CommunicationType1CLink.Пустая() ? CommunicationType1CLink : null;
				ci1C.Тип = CommunicationType1CLink.Тип;
				ci1C.Представление = ObjExport.CommTypeArray[i][1];
				try {
					//[не регистрируем изменения на стороне 1с	
					ci1CMain.ОбменДанными.Получатели.АвтоЗаполнение = false;
					//]					
					try {
					ci1CMain.Записать(false); } catch(e) {}
				} catch(e) {}
			}	
		} 		
		ds.GotoNext();
	}	
	ds.Close();
}

Импорт:

function OnBeforeRecordImport(Param, Dataset, Select1C) {
	//очистка
	Obj.AccountID = Dataset('AccountID');
	if(Obj.IsTrue != true) {
		var dq = Services.GetNewItemByUSI('dq_clearAccountCommunication');
		SetParameterValue(dq.Parameters, 'AccountID', Obj.AccountID, true);
		dq.Execute();
		Obj.IsTrue = true;
	}
	//
	var Type1C = Param.Obj1C.XMLString(Select1C.Тип);	
	switch (Type1C) {
		case ('Телефон'):
			if(Param.Obj1C.String(Select1C.Вид) == 'Факсы') {
				if(Obj.IsThree != true) {
					ImportAccountUU.Position = 3;
					Obj.IsThree = true;	
				} else {
					ImportAccountUU.Position = 6;	
				}
				break;	
			}
			if(Obj.IsOne != true) {
				ImportAccountUU.Position = 1;
				Obj.IsOne = true;	
			} else if(Obj.IsTwo != true) {
				ImportAccountUU.Position = 2;
				Obj.IsTwo = true;	
			} else {
				ImportAccountUU.Position = 6;	
			}			
		break;
		case ('Факсы'):
			if(Obj.IsThree != true) {
				ImportAccountUU.Position = 3;
				Obj.IsThree = true;	
			} else {
				ImportAccountUU.Position = 6;	
			}				
		break;
		case ('ВебСтраница'):
			if(Obj.IsFour != true) {
				ImportAccountUU.Position = 4;
				Obj.IsFour = true;	
			} else {
				ImportAccountUU.Position = 6;	
			}
		break;
		case ('АдресЭлектроннойПочты'):
			if(Obj.IsFive != true) {
				ImportAccountUU.Position = 5;
				Obj.IsFive = true;	
			} else {
				ImportAccountUU.Position = 6;	
			}
		break;		
		default:
			ImportAccountUU.Position = 6;
			break;
	}	
	//ImportAccountUU.Position++;
	Dataset('Position') = ImportAccountUU.Position;	
	Dataset('RF') = 1;
	var CommunicationTypeID = Dataset('CommunicationTypeID');
	var Num = Dataset('Number');
	//Digits
	Dataset('Digits') = DigitsFromString(Num);
	var AccountID = Dataset('AccountID');
	Obj.AccountID = AccountID;	
	//разбивка	
	if(Num.indexOf(';') != -1) {
		var a = false;
		var b = false;		
		while(Num.indexOf(';') != -1) {
			Numb = Num.split(';');
			var NewNumber = Numb[0];
			var DS = Services.GetNewItemByUSI('ds_AccountCommunication');
			DS.DisableEvents();
			DS.Append();
			DS('ID') = Connector.GenGUID();
			DS('AccountID') = Dataset('AccountID');
			DS('Number') = NewNumber;
			DS('Digits') = DigitsFromString(NewNumber);
			DS('RF') = 1;
			DS('CommunicationTypeID') = Dataset('CommunicationTypeID');
			if(a == false) {
				DS('Position') = Dataset('Position');			
				a = true;
			} else if (b == false){
				DS('Position') = Dataset('Position') == 1 ? 2 : 6;			
				b = true;	
			} else {
				DS('Position') = 6;			
				b = true;	
			}
			if(!IsEmptyValue(DS('Number'))) {
				DS.Post();
			}
			Num = '';
			for(var i = 1; i < Numb.length; i++){
				if(i == Numb.length - 1) {
					Num += Numb[i];
				} else {
					Num += Numb[i] + ';';	
				}
			}
			if(Num.indexOf(';') == -1)	{
				DS.Append();
				DS('ID') = Connector.GenGUID();
				DS('AccountID') = Dataset('AccountID');
				DS('Number') = Num;
				DS('CommunicationTypeID') = Dataset('CommunicationTypeID');
				DS('RF') = 1;
				if(a == false) {
					DS('Position') = Dataset('Position');			
					a = true;
				} else if (b == false){
					DS('Position') = Dataset('Position') == 1 ? 2 : 6;			
					b = true;
					Obj.IsTwo = true;	
				} else {
					DS('Position') = 6;			
					b = true;	
				}
				if(!IsEmptyValue(DS('Number'))) {
					DS('Digits') = DigitsFromString(Num);
					DS.Post();
				}	
			}
		}
		return true;
	}
}

Т.е. экспорт - без подчиненной (на AfterRecordExport), а импорт с подчиненной (на скрине настройки)

Дмитрий, Спасибо!
Сделал Экспорт КонтакнойИнформации в 1С на AfterRecordExport. Все работает.
Вместо РегистрыСведений сделал:

var Contragent = Select1C.Ссылка.ПолучитьОбъект();
var newAddress= Contragent.КонтактнаяИнформация.Добавить();
newAddress.Представление = Communication4;
     ...
Contragent.Записать();

Т.к. 8.3 с РегистрыСведений как-то не работает.

Email пишет в 1С в нужное место в Представление, в ЗначениеПоле (XML формат) и т.п. И отображается на форме.
Но, только один момент который не работает - это предварительное удаление записей в КонтактнаяИнформация. Иначе одна и таже запись там будет накапливаться.
Код выше с удалением ("//удалить все адреса и средства связи"), не срабатывает.
Подскажите, как в моем случае удалить предварительно КИ?

Не могу попробовать... Так не работает?

var Contragent = Select1C.Ссылка.ПолучитьОбъект();
var ci1C = Contragent.КонтактнаяИнформация.СоздатьНаборЗаписей(); 
ci1C.Отбор.Объект.Установить(Select1C.Ссылка);        
ci1C.Записать();
Показать все комментарии