Экспорт в 1С подчиненного справочника

Добрый день!

Есть следующая задача: проэкспортировать счета в 1С. В счетах есть поле справочника [Контрагент] и поле справочника [Договор]. Договора подчинены справочнику Контрагенты. Если просто добавить соответствие полей из клиентской части, то договора не экспортируются, т.е. надо прописать соответствие в скрипте. Насколько я поняла нужно выбрать контрагента текущего счета и по коду в пределах подчинения найти договор. Но с языком 1С я не знакома, каким образом это можно сделать?

Нравится

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

Здравствуйте, Александра.

Уточнните, пожалуйста:

1. Какая версия 1С Вами используется;
2. Какие сущности из 1С Вы пытаетесь экспортировать и с какими разделами 1С синхронизировать.

Данная информация необходима технической поддержке для того, чтобы смоделировать ситуацию и протестировать программный код, который будет предоставлен в качестве примера.

Версия 1С 7.7.
Экспорт Счетов в документы "Реализация", которые содержат поля Контрагент (из справочника), Договор (из подчиненного справочника контрагентов). Справочники Контрагентов и Договоров синхронизированы.

Александра,

предоставьте, пожалуйста, скриншоты окон настроек интеграции.

Для скриншотов окна настроек полей также необходимо вытянуть колонку Ключевое.

Скриншоты настроек

Александра, уточните, пожалуйста, каким образом Вы синхронизируете договора, и какова их структура?

Дело в том, что в базовой версии 1С в данном справочнике нет ни номера, ни какого-либо другого уникального реквизита.

Таким образом, единственный способ сравнить договор в Terrasoft и 1С - по наименованию и контрагенту.

Навскидку могу предложить следующий пример:

	var ContactName = Select1C[QueryLink].ДоговорКонтрагента.Наименование;
	var CustomerID = Dataset('CustomerID');
	var ContractDataset = Services.GetSingleItemByUSI('ds_Contact');
	ApplyDatasetFilter(ContractDataset, 'Name', ContactName, true);
	ApplyDatasetFilter(ContractDataset, 'CustomerID', CustomerID, true);
	ContractDataset.Open();
	if(!IsEmptyValue(ContractDataset('ID'))){
		Dataset('ContractID') = ContractDataset('ID');
	}
	ContractDataset.Close();

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

111

В договорах есть код,который уникален в пределах владельца (Контрагента).
При синхронизации договоров используются следующие ключевые поля: Код, Наименование, Контрагент. При импорте счетов договора появляются, в функции OnBeforeRecordImport прописан код, аналогичный тому, который указан выше.

В договорах есть код,который уникален в пределах владельца (Контрагента).
При синхронизации договоров используются следующие ключевые поля: Код, Наименование, Контрагент. При импорте счетов договора появляются, в функции OnBeforeRecordImport прописан код, аналогичный тому, который указан выше.

Александра,

есть ли у Вас возможность предоставить структурированную и детальную информацию о том, как именно настроена интеграция?

1. Скриншот конфигуратора 1С, где есть развернутый список полей;

2. Программный код на OnBeforeRecordImport, который реализован в Вашей организации;

3. Другая информация, которая может быть существенна для диагностики, однако Вы забыли указать ее в предыдущих сообщениях.

Сначала создается счет в TS и на его основании договор.
Происходит экспорт договоров.
Затем экспорт счетов.

Также необходимо импортировать уже существующие счета из 1С, с этим проблем нет.
function OnBeforeRecordImport(Param, Dataset, Select1C) {
var ContractName = Select1C.QueryLink.Договор.Наименование;
var ContractCode1C = Select1C.QueryLink.Договор.Код;
var AccountCode1C = Select1C.QueryLink.Контрагент.Код;
var CustomerID = GetDatasetFieldValueFromDatasetByUSI('ds_Account', 'Code1C', AccountCode1C, 'ID');
var ContractDataset = Services.GetSingleItemByUSI('ds_Contract');
ContractDataset.Close();
ApplyDatasetFilter(ContractDataset, 'Title', ContractName, true);
ApplyDatasetFilter(ContractDataset, 'CustomerID', CustomerID, true);
ApplyDatasetFilter(ContractDataset, 'Code1C', ContractCode1C, true);
ContractDataset.Open();
if(!IsEmptyValue(ContractDataset('ID'))){
Dataset('ContractID') = ContractDataset('ID');
}
ContractDataset.Close();
EnableDatasetFilters(ContractDataset, false, 'Title');
EnableDatasetFilters(ContractDataset, false, 'CustomerID');
EnableDatasetFilters(ContractDataset, false, 'Code1C');

}

Также прикрепила скриншоты конфигуратора 1с для договоров и счетов (заявок).

Александра,

Пожалуйста, предоставьте сервис скрипта синхронизации, фрагмент которого Вами опубликован в предыдущем сообщении.

Скрип сервиса синхронизации счетов.

Здравствуйте, Александра!

В таком случае Вам необходимо на OnBeforeRecordExport добавить следующий парограмный код:

var ContractDataset = Services.GetSingleItemByUSI('ds_Contract');
ApplyDatasetFilter(ContractDataset, 'ID', Dataset('ContractID'), true);
ContractDataset.Open();
var Code1C = ContractDataset('Code1C');
ContractDataset.Close();
var Unit1C = Param.Obj1C.Справочники.ДоговорыКонтрагентов.НайтиПоКоду(Code1C));
if(scr_Dataflow1CUtils_V81.LinkIsAssigned(Unit1C)) {
Select1C.ДоговорКонтрагента = Unit1C.Ref;
}

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

После строки var Unit1C = Param.Obj1C.Справочники.ДоговорыКонтрагентов.НайтиПоКоду(Code1C) экспорт прекращается. Т.к. код договора уникален в пределах контрагента (владельца), попробовала написать var Unit1C = Param.Obj1C.Справочники.ДоговорыКонтрагентов.НайтиПоКоду(Code1C, 1), но все равно происходит сбой.

Возникла ее одна проблема. При экспорте договоров появляются одинаковые записи, которые различаются только по коду. Хотя поле код является ключевым. При этом изменяется поле код в TS.

При поиске в 1С записи, уникальной в пределах владельца
Следует применить метод «ИспользоватьВладельца»

Пример:

НР = СоздатьОбъект("Справочник.НормыРасходов");
НР.ИспользоватьВладельца(Продукция);
НР.НайтиПоКоду(«00000000000001», 1); 

Написала следующий код:

var НР = Param.Obj1C.CreateObject('Справочник.Договоры');
НР.ИспользоватьВладельца('Контрагент');
var ContractDataset = Services.GetSingleItemByUSI('ds_Contract');
ContractDataset.Close();
ApplyDatasetFilter(ContractDataset, 'ID', Dataset.Values('ContractID'), true);
ContractDataset.Open();
var Code1C = ContractDataset.Values('Code1C');
ContractDataset.Close();
var Unit1C = Param.Obj1C.НР.НайтиПоКоду(Code1C,1);
if(scr_Dataflow1CUtils_V77.LinkIsAssigned(Unit1C)) {
Select1C.Договор = Unit1C.Ref;
}

Но по коду все еще не находит.

Нашла ошибку, изменила следующую строку var Unit1C =НР.НайтиПоКоду(Code1C,1);.
Теперь вопрос в том, почему по коду не возвращает значение 1С ((scr_Dataflow1CUtils_V77.LinkIsAssigned(Unit1C)).

Александра, необходимо удаленное подключение для диагностики и проверки настроек. Детали письмом.

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