Здравствуйте!
Настроил Экспорт справочников, документов из Террасофт 3.5.1 в 1С 8.3.
Все экспортируется за исключением ИНН, КПП и т.п. из Платежных реквизитов и единица измерения из Продуктов.
Настраивал по разному, последний вариант для ИНН такой:
Но ИНН не хочет экспортироваться.
По Продуктам также все хорошо экспортируется кроме поля единица измерения:
Подскажите, как правильно экспортировать данные поля?
Нравится
ИНН, КПП хранится в том же справочнике в 1с или нет? Если в том же - некорректно указана связь, по-моему должна быть ссылка, а не родитель.
С единицами измерения: по-моему там сделано хитро. Это табличная часть и писать нужно в нее. А основной реквизит заполняется из табличной части "на лету" с признаком "основной" или как-то так.
пс: лично я делал ИНН, КПП экспорт кодом (у меня в 1-м контрагенте может быть только 1 расчетный счет) и тоже самое с ЕдИзм.
OnBeforeRecordExport:
//рассчетные счета var AccountID = Dataset('ID'); var AccBillingInfoDS = Services.GetNewItemByUSI('ds_AccountBillingInfo'); AccBillingInfoDS.DisableEvents(); ApplyDatasetFilter(AccBillingInfoDS, 'AccountID', AccountID, true); AccBillingInfoDS.Open(); if(AccBillingInfoDS.IsEOF) { Select1C.ИНН = null; Select1C.КПП = null; Select1C.КодПоОКПО = null; Select1C.КодПоОКОНХ = null; Select1C.Руководитель = null; Select1C.ДолжностьРуководителя = null; Select1C.ОснованиеДействия = null; } else { Select1C.ИНН = AccBillingInfoDS('INN'); Select1C.КПП = AccBillingInfoDS('KPP'); Select1C.КодПоОКПО = AccBillingInfoDS('OKPO'); Select1C.КодПоОКОНХ = AccBillingInfoDS('OKONX'); Select1C.Руководитель = AccBillingInfoDS('FIO'); Select1C.ДолжностьРуководителя = AccBillingInfoDS('Position'); Select1C.ОснованиеДействия = AccBillingInfoDS('Ground'); }
а единицы измерения так (в маппинге должно быть поле, в принципе оно у вас есть - 2ой скриншот).
var TblPartUnit = Select1C.ЕдиницыИзмерения; TblPartUnit.Очистить(); var NewLine = TblPartUnit.Добавить(); NewLine.ЕдИзм = Select1C.ЕдИзмБазовая; NewLine.Коэффициент = 1;
Спасибо, Дмитрий! С ИНН (КПП) с кодом получилось. ИНН грузятся в 1С, но, только в 1С подсвечены красным и в карточке надпись: Неизвестен Вид контрагента. Укажите вид Контрагента:
При этом при выборе реквизита такого поля Вид контрагента нет.
На скриншоте видно, что там стоит Юридическое лицо, если данные в этом поле в 1С вручную пересохранить, а затем заново подгрузить ИНН, то ИНН подгружается уже не красным шрифтом и такой надписи нет.
Как можно подгрузить этот реквизит?
Вот тут не подскажу. У меня такого поля нет. Но явно вы не заполнили какой-то реквизит при программном создании счета. Посмотрите в модуле объекта - там должна быть явная (код) обработка этого момента, узнайте название реквизита и заполняйте его нужным значением.
Мне кажется что "Юр. лицо" в карточке подтягивается если там пусто, и сохраняется только после пересохранения. В администраторе в дизайнере формы кликните на поле и узнайте имя реквизита.
Не-не, если через код - то подчиненной сущности не нужно. Удалите её, а код должен быть в сущности "Продукты", ведь именно у него есть табл. часть, а табл. часть у табл части нет :)
пс: не заметил что у вас подчиненная также на спр. номенклатура ссылается. там родитель должна быть ссылка а не родитель. но лучше его просто удалить, а код прописать повыше на уровень.
а, кажется, я опечатался, должно быть ЕдиницыИзмерения, а не ЕдиницаИзмерения.
А ну тогда все совсем просто. Удаляете тот код, и добавляете в маппинг DefaultUnitID (поле в ТС )=ЕдиницаИзмерения (реквизит в тс).
Т.е. для эксопрта единицы измерения ни подчиненной сущности ни кода вам не надо (при условии если справочник вы уже в тс загрузили,и поля UID1C и Code1C заполнены).
Единственное меня смущают UID1C - у вас они без кавычек, а должны быть такими {bla-bla-bla}.
Т.е. если не будет работать - добавьте кавычки.
Да, я в начале так и делал, но выскакивала ошибка. Сейчас посмотрел у меня реквизит в 1С был "БазоваяЕдиницаИзмерения" - это из версии 1С 8.2. Т.к. загружал метаданные из версии 8.2 потом коннектился к 8.3. При загрузке метаданных из версии 8.3 - ничего не подгружалось и все загруженное из 8.2 обнулялось.
Поменял название реквизита на "ЕдиницаИзмерения" и все заработало!
Ошибка была в некорректном названии реквизита, т.к. они у меня загружены из версии 8.2.
Можно ли загрузить метаданные из версии 8.3? А то это уже не первая ошибка, связанная с неправильным названием реквизита.
Можно. У меня проблем не возникало при загрузке метаданных из 8.3. А что у вас? Дайте скриншот.
Если хотите кодом, то с перечислениями работаем так:
var metalink = eval('Param.Obj1C.Перечисления.ТипыКонтактнойИнформации.' + Dataset('Code1C')); Select1C.ТипКонтактнойИнформации = metalink;
где Dataset('Code1C') - имя элемента перечисления (_не_ синоним).
Обнаружил глюк при отработке скрипта синхронизации
wnd_AutoRun1CScript
Периодически (но не всегда), после отработки функции
function TimerCloseOnTimer(Timer) { Self.Close(); }
Террасофт зависает с таким окном ошибки:
Отловить, почему выскакивает такая ошибка не получается. Как-то все происходит через раз при одинаковых действиях.
Причем это окно ошибки не висит, а "моргает", с частотой примерно пол секунды.
Что это такое и как с этим бороться?
Это вы что делаете? Можно поподробней? Я так понимаю настроили какой-то автозапуск интеграции?
А вообще такая проблема возникает когда приложение(главное окно) уже закрыто, а какое-то окно еще нет, и при любом обращении к главному окну вы получите такую ошибку.
Попробуйте подправить wnd_Main:
//[d.oleynik CloseEditWindows(); //] CloseMainForm();
//[d.oleynik function CloseEditWindows() { var Item; for (var i = 0; i < WinCache_Windows.length; i++) { Item = WinCache_Windows[i]; if (Item.Instance) { if ((Item.Instance.IsVisible)) { try { Item.Instance.Close(); } catch(e) {} } } } } //]
Запускаю стандартный автозапуск интеграции через ярлык. Скрипт wnd_AutoRun1CScript:
function wnd_AutoRun1COnPrepare(Window) { debugger; var DataflowID = Connector.Attributes('Dataflow1CID'); var run1Cimport = Connector.Attributes('run1Cimport'); var run1Cexport = Connector.Attributes('run1Cexport'); if (IsEmptyGUID(DataflowID) || (!run1Cimport && !run1Cexport)) { return; } var ObjectID = Connector.Attributes('Dataflow1CObjectID'); if (run1Cimport) { var Param = {}; Param.IsMain = false; Param.IsShowError = false; Param.IsShowConnect = false; if (IsEmptyGUID(ObjectID)) { ImportAllObject(DataflowID, Param); } else { ImportObject(DataflowID, ObjectID); } } if (run1Cexport) { if (IsEmptyGUID(ObjectID)) { ExportAllObject(DataflowID, Param); } else { ExportObject(null, DataflowID, ObjectID); } } scr_Dataflow1CUtils.Disconnect(DataflowID, true); } function wnd_AutoRun1COnShow(Window) { TimerClose.IsEnabled = true; } function TimerCloseOnTimer(Timer) { Self.Close(); }
Если закомментировать TimerClose.IsEnabled = true, то ошибка не возникает, но окно wnd_AutoRun1C приходится закрывать вручную.
Правка wnd_Main результатов не дала.
Я делал свое окно, и проблем не возникает. Предлагаю сделать тоже самое:
1. Создайте сервис окна.
2. В невизуальных компонентах добавьте таймер.
3. В скрипте окна подключите скрипт scr_Dataflow1CUtils
3. Код примерно такой:
//----------------------------------------------------------------------------- // wnd_AutoImportADLScript //----------------------------------------------------------------------------- function wnd_AutoImportADLOnPrepare(Window) { var DataflowID = '{48CCFAA0-50B9-4378-8509-287ADF34599E}'; //проверить флаг запущенной интеграции, если интеграция уже идет - не запускать повторно; if(GetIntegrationFlag()) { return false; } try { Activate1C(); var Param = {}; Param.IsMain = false; Param.IsShowError = false; Param.IsShowConnect = false; //установить флаг запущенной интеграци SetIntegrationFlag(1); ImportAllObject(DataflowID, Param); ExportAllObject(DataflowID, Param); } catch(e) { CatchError(e, arguments.callee); } finally { scr_Dataflow1CUtils.Disconnect(DataflowID, true); SetIntegrationFlag(0); } } function wnd_AutoImportADLOnShow(Window) { Timer.IsEnabled = true; } function TimerOnTimer(Timer) { Self.Close(); } function GetIntegrationFlag() { var SQ = Services.GetNewItemByUSI('sq_GetIntegrationFlag') var DS = SQ.Open(); if(DS('Flag')) { DS.Close(); return true; } else { return false; } } function SetIntegrationFlag(IsSet){ var UQ = Services.GetNewItemByUSI('uq_SetIntegrationFlag'); SetParameterValue(UQ.Parameters, 'Flag', IsSet); UQ.Execute(); }
Спасибо, Дмитрий!
Ещё в ходе настройки интеграции возник вопрос: Как кодом работаем с справочником? К примеру нужно в Счета 1С Экспортировать Организацию. В ТС Организацию импортировал - есть ID и UID.
А вот как кодом экспортировать организацию в 1С в Счетах.
Select1C.Организация = '...';
Ниже - это как работаем с перечислением:
"Олейник Дмитрий" написал:Если хотите кодом, то с перечислениями работаем так:
var metalink = eval('Param.Obj1C.Перечисления.ТипыКонтактнойИнформации.' + Dataset('Code1C'));
Select1C.ТипКонтактнойИнформации = metalink;
где Dataset('Code1C') - имя элемента перечисления (_не_ синоним).
Примерно так:
//[департамент var DepartmentID = Dataset('DepartmentID'); var Departments = Param.Obj1C.Справочники.Департаменты; var DepartmentUID1C = GetDatasetFieldValueByID('ds_Department', DepartmentID, 'UID1C'); DepartmentUID1C = Param.Obj1C.NewObject('УникальныйИдентификатор', DepartmentUID1C.replace('{', '').replace('}', '')); var Department1C = Departments.GetRef(DepartmentUID1C);
Department1C - это то, что нужно поместить в реквизит.
эм, ну так вы пропустили строчку :)
DepartmentUID1C = Param.Obj1C.NewObject('УникальныйИдентификатор', DepartmentUID1C.replace('{', '').replace('}', ''));