Интеграция и импорт данных
Разработка

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 стандартную функцию:
[javascript]
Select1C.EmailКонтрагента = 'test@test2015.ru';
[/javascript]
Но, в 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 ) это сделать?

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

Экспорт:

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

Импорт:

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

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

Дмитрий, Спасибо!
Сделал Экспорт КонтакнойИнформации в 1С на AfterRecordExport. Все работает.
Вместо РегистрыСведений сделал:
[javascript]
var Contragent = Select1C.Ссылка.ПолучитьОбъект();
var newAddress= Contragent.КонтактнаяИнформация.Добавить();
newAddress.Представление = Communication4;
...
Contragent.Записать();
[/javascript]
Т.к. 8.3 с РегистрыСведений как-то не работает.

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

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

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

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