Добрый день? Помогите разобраться с интеграцией с 1С. начал изучать стандартную интеграцию и не совсем понял следующее:
1. как перенести например контрагентов и договора из 1С в црм?
2. как получить ID какого либо справочника в скрипте к примеру был такой скрипт на форуме в котором выбираются строковые поля. а как выбрать поля которые относяться к справочникам например контактное лицо контраегента и сам ID контрагента???? подскажите пожалуйста??

   var v8=new ActiveXObject("V81.COMConnector");
        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();
}

Нравится

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

Иван, исходя из Вашего примера, перенос контрагентов в 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.

Спасибо за ответы) сначала я хотел использовать интеграцию выложенную на сайте но не смог разобраться как привязывать значения полей типа справочники например в договорах привязать клиента и тому подобное. и решил сам попробовать написать интеграцию именно для своего случая) буду пробовать.

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