Добрый день? Помогите разобраться с интеграцией с 1С. начал изучать стандартную интеграцию и не совсем понял следующее:
1. как перенести например контрагентов и договора из 1С в црм?
2. как получить ID какого либо справочника в скрипте к примеру был такой скрипт на форуме в котором выбираются строковые поля. а как выбрать поля которые относяться к справочникам например контактное лицо контраегента и сам ID контрагента???? подскажите пожалуйста??
path='';
db='bd';
user='user';
password='';
debugger;
var sss = GenerateConnectString();
conn = v8.Connect(sss);
var tab = conn.Справочники.Контрагенты;
query = conn.NewObject("Запрос");
query.text = 'ВЫБРАТЬ КПП, ИНН ИЗ Справочник.Контрагенты';
Qresult = query.execute().Choose();
while (tab.next()){
strdat+="(.KPP= "+Qresult.КПП+" "+ " INN= " +Qresult.ИНН+")";
n++;
}
Log.Write(1,strdat);
System.ProcessMessages();
}
Нравится
Иван, исходя из Вашего примера, перенос контрагентов в Terrasoft можно осуществить, например, так:
var tab = conn.Справочники.Контрагенты; query = conn.NewObject("Запрос"); query.text = 'ВЫБРАТЬ КПП, ИНН ИЗ Справочник.Контрагенты'; Qresult = query.execute().Choose(); var AccountDataset = Services.GetNewItemByUSI('ds_Account'); while (tab.next()){ strdat+="(.KPP= "+Qresult.КПП+" "+ " INN= " +Qresult.ИНН+")"; n++; AccountDataset.Append(); AccountDataset.Values('ID') = Connector.GenGUID(); AccountDataset.Values('Name') = Qresult.Название; AccountDataset.Values('INN') = Qresult.ИНН; ... AccountDataset.Post(); } Log.Write(1,strdat); System.ProcessMessages();
Данный скрипт приводится только в качестве примера. Конечно, его можно усовершенствовать, добавив проверку на существование контрагента с таким же названием в базе, а также обработку исключений.
Что касается получения значения справочника, это можно сделать с помощью функции GetDatasetFieldValueByID:
var DictionaryValue = GetDatasetFieldValueByID(DatasetUSI, ID, FieldName);
Для получения значений из выборки Вам необходимо создать запрос на выборку или взять уже существующий в системе датасет (например, ds_Account), отфильтровать его нужным образом, а потом в цикле получать его значения и использовать их нужным Вам образом:
var Dataset = Services.GetNewItemByUSI('ds_Account'); ApplyDatasetFilter(Dataset, 'AccountTypeID', AccountTypeID, true); Dataset.Open(); while (!Dataset.IsEOF) { var AccountID = Dataset.Values('ID'); var PrimaryContactID = Dataset.Values('PrimaryContactID'); ....... Dataset.GotoNext(); } Dataset.Close();
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
Это да) только я хотел перенести не только строковые поля а полностью все поля. строковые поля понятно как переносить а вот те которые ссылаются на справочники нет??? ну например виды контрагентов??? хотел сначало синхронизировать справочники и внести в них поля типа ID1C только незнаю как получить ID1C??? они непонятно где хранятся ?? версия 1С 8.1?
Принцип переноса полей типа "Справочник" примерно такой. В базе Terrasoft во всех таблицах справочников, которые интегрируются с 1С, должно быть поле Code1C или Integration_1C (либо какое-то другое название) для интеграции с 1С. При переносе записи из Terrasoft в 1С в это поле заносится код соответствующей записи в 1С. Также в запросы справочников необходимо добавить фильтр по этому полю.
Дальше алгоритм следующий. Допустим, Вы переносите контрагент из 1С в Terrasoft. Допустим также, что справочник "Виды контрагентов" уже синхронизирован с Terrasoft, и у каждой записи в справочнике Terrasoft заполнено поле Code1C. Тогда:
1. Мы получаем значение поля "Вид контрагента" записи в 1С.
2. Получаем его код 1С в соответствующем справочнике из 1С.
3. Применяем фильтр по этому коду для датасета "Виды контрагентов" в программе Terrasoft.
4. Открываем датасет, и если он содержит строку, получаем значение поля ID. Если датасет строки не содержит, значит, имеет место одна из следующих ситуаций: либо поле "Вид контрагента" не заполнено в 1С, либо нужное значение пока не импортировано из 1С.
5. Открываем для редактирования датасет контрагента, отфильтрованный по записи, которую мы в данный момент импортируем, и заполняем поле, соответствующее виду контрагента, полученным в предыдущем пункте значением.
Пример функции для получения ID записи из справочника Terrasoft по значению поля Code1C:
function GetIDByCode1C(Dataset, Code1C) { if (Dataset.State != dstInactive) { Dataset.Close(); } EnableDatasetFilters(Dataset, false); ApplyDatasetFilter(Dataset, 'Code1C', Code1C, true); Dataset.Open(); var RecordID = GUID_NULL; if (!IsDatasetEmpty(Dataset)) { RecordID = Dataset.Values('ID'); } Dataset.Close(); return RecordID; }
Таким образом, обновление поля "Тип контрагента" в Terrasoft будет выглядеть так:
... AccountDataset.Edit(); ... var AccountTypeDataset = GetSingleItemByCode('ds_AccountType', 'dsAccountTypeIntegration'); AccountDataset.Values('AccountTypeID') = GetIDByCode1C(AccountTypeDataset, AccountTypeCode1C); ... AccountDataset.Post();
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
Спасибо за подробный ответ! единственное что непонятно как получить как раз таки именно ID записи 1С ?
"Лабьяк Олег Игоревич" написал:1. Мы получаем значение поля "Вид контрагента" записи в 1С.
Пример запроса таков
ВЫБРАТЬ ОсновнойДоговорКонтрагента, ИНН, КПП, НаименованиеПолное ИЗ Справочник.Контрагенты
вот как получить поле которое выделено. я так понимаю оно должно иметь вид ID справочника договора.
Qresult.ОсновнойДоговорКонтрагента не работает??? подскажите?
Скорее всего, в данном случае ОсновнойДоговорКонтрагента - это объект типа "Документ". Попробуйте, возможно, получится: ВЫБРАТЬ ОсновнойДоговорКонтрагента.НомерДок, ИНН, КПП...
Для объектов типа "Справочник" в 1С должно работать: ВЫБРАТЬ ТипКонтрагента.Код, ...
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
"Лабьяк Олег Игоревич" написал:ВЫБРАТЬ ТипКонтрагента.Код, ..почему то пишет что такое поле не найдено
вот нашел такую функцию
var ContractID1C = Param.Obj1C.XMLString(Select1C['ОсновнойДоговорКонтрагента'].UUID());
Кажется что работает только я не уверен что это именно то?
может вы подскажите назначение этой функции??
Да, действительно, с восьмой версии 1С появилась возможность идентификации записей, помимо кода 1С, по низкоуровневым ID (подобно GUID'ам в Terrasoft). Так можно идентифицировать справочники и документы, по поводу других объектов не могу сказать. Скорее всего, эта функция - то, что Вам нужно. Если Вы используете утилиту интеграции, то эти значения она записывает в поля 'UID1C' таблиц базы Terrasoft, и именно по этим полям Вам необходимо осуществлять фильтрацию.
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
Спасибо за ответы) сначала я хотел использовать интеграцию выложенную на сайте но не смог разобраться как привязывать значения полей типа справочники например в договорах привязать клиента и тому подобное. и решил сам попробовать написать интеграцию именно для своего случая) буду пробовать.