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