Экспорт ИНН, КПП, ед.изм в 1С

Здравствуйте!

Настроил Экспорт справочников, документов из Террасофт 3.5.1 в 1С 8.3.
Все экспортируется за исключением ИНН, КПП и т.п. из Платежных реквизитов и единица измерения из Продуктов.

Настраивал по разному, последний вариант для ИНН такой:

Но ИНН не хочет экспортироваться.

По Продуктам также все хорошо экспортируется кроме поля единица измерения:

Подскажите, как правильно экспортировать данные поля?

Нравится

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

ИНН, КПП хранится в том же справочнике в 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С вручную пересохранить, а затем заново подгрузить ИНН, то ИНН подгружается уже не красным шрифтом и такой надписи нет.
Как можно подгрузить этот реквизит?

Вот тут не подскажу. У меня такого поля нет. Но явно вы не заполнили какой-то реквизит при программном создании счета. Посмотрите в модуле объекта - там должна быть явная (код) обработка этого момента, узнайте название реквизита и заполняйте его нужным значением.

Мне кажется что "Юр. лицо" в карточке подтягивается если там пусто, и сохраняется только после пересохранения. В администраторе в дизайнере формы кликните на поле и узнайте имя реквизита.

Дмитрий, с "Юр. лицом" все получилось. Имя реквизита было неверным - поменял на правильное и все заработало.
А вот с "Единицей Измерения" не получается, выскакивает ошибка:

Настройки в ТС такие:

В Справочнике ТС tbl_Unit есть связь по UID1C:

Что ещё не хватает для экспорта ЕдиницИзмерения?

Не-не, если через код - то подчиненной сущности не нужно. Удалите её, а код должен быть в сущности "Продукты", ведь именно у него есть табл. часть, а табл. часть у табл части нет :)

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

Код у меня был в сущности Продукты в OnBeforeRecordExport.
Удалил подчиненную сущность.
Ошибка возникает там же та же: "Объект не поддерживает это свойство или метод".
Содержание Select1C:

Вот настройки сущности Продукты:

у вас точно табл. часть есть такая?

а, кажется, я опечатался, должно быть ЕдиницыИзмерения, а не ЕдиницаИзмерения.

Да, я сразу поправил на ЕдиницаИзмерения.
Посмотрел в конфигураторе, да, табличной части нету:

Её можно просто создать по аналогии?

А ну тогда все совсем просто. Удаляете тот код, и добавляете в маппинг 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. А что у вас? Дайте скриншот.

Спасибо, Дмитрий! Разобрался. В другой теме нашел такую же проблему и Ваше возможное решение.

Дмитрий, а если мне нужно в коде заполнить СтавкуНДС для экспорта в 1С, то какое значение подставлять ID, Code1C или Name из tbl_Tax?

Select1C.СтавкаНДС = 'ID'; 
или
Select1C.СтавкаНДС = 'Code1C';
или
Select1C.СтавкаНДС = 'Name';

Перечисление НДС в 1С и Таблицы tbl_Tax в ЕС связаны по Code1C:

Если хотите кодом, то с перечислениями работаем так:

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 - это то, что нужно поместить в реквизит.

Попробовал:
Выдает ошибку: 1C:Enterprise 8.3.5.1517: Несоответствие типов (параметр номер '1')

эм, ну так вы пропустили строчку :)

DepartmentUID1C = Param.Obj1C.NewObject('УникальныйИдентификатор', 
        DepartmentUID1C.replace('{', '').replace('}', ''));
Показать все комментарии