Добрый день!
Есть следующая задача: проэкспортировать счета в 1С. В счетах есть поле справочника [Контрагент] и поле справочника [Договор]. Договора подчинены справочнику Контрагенты. Если просто добавить соответствие полей из клиентской части, то договора не экспортируются, т.е. надо прописать соответствие в скрипте. Насколько я поняла нужно выбрать контрагента текущего счета и по коду в пределах подчинения найти договор. Но с языком 1С я не знакома, каким образом это можно сделать?
Нравится
Здравствуйте, Александра.
Уточнните, пожалуйста:
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();
В случае, если у Вас при синхронизации договоров используется другое ключевое поле, фильтровать необходимо именно по нему. Обратите внимание, в запросе договоров должны быть созданы фильтры по наименованию и клиенту.
В договорах есть код,который уникален в пределах владельца (Контрагента).
При синхронизации договоров используются следующие ключевые поля: Код, Наименование, Контрагент. При импорте счетов договора появляются, в функции 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)).
Александра, необходимо удаленное подключение для диагностики и проверки настроек. Детали письмом.