Приемы использования вычисляемых реквизитов при настройке коннектора 1С 

Дмитрий Тарасов
Дата создания: 23 мая 2011 в 16:15

Материал подготовлен совместно с Петром Федотовым 

 Рассмотрим несколько примеров, когда нам необходимо не просто передать значение одного реквизита справочника DIRECTUM в аналогичный реквизит справочника 1С, а выполнить какие-нибудь вычисления с реквизитом и уже результат вычисления передать в 1С. Для этого в карточке «Настройки обмена данными с интегрированными системами» для нужного справочника в табличной части надо создать вычисляемый реквизит и задать для него вычисление.

Пример 1. Необходимо настроить синхронизацию справочника Организации DIRECTUM со справочником Контрагенты 1С. Нужно, чтобы реквизит «Юр. / физ. лицо» справочника Контрагенты 1С заполнялся значением «ЮрЛицо». Аналогичного реквизита в справочнике Организации DIRECTUM нет и проблему решить можно с помощью вычисляемых реквизитов. Вычисление для этого реквизита будет таким:

Result = "ЮрЛицо"

В результате в реквизит «Юр. / физ. лицо» справочника Контрагенты 1С мы постоянно будем передавать константу «ЮрЛицо».

Пример 2. Необходимо настроить синхронизацию справочника Персоны DIRECTUM со справочником Физические лица 1С. Нужно, чтобы заполнялись реквизиты «Фамилия», «Имя» и «Отчество» справочника Персоны DIRECTUM. В справочнике Физические Лица 1С ФИО присутствует в виде одной строки в реквизите «Наименование». В этом случае нам на помощь придут вычисляемые реквизиты:

Вычисление реквизита Фамилия:

  FIO = '[Description]'
  Result = SubString(FIO;' ';1)

Вычисление реквизита Имя:

  FIO = '[Description]'
  Result = SubString(FIO;' ';2)

Вычисление реквизита Отчество:

  FIO = '[Description]'
  Result = SubString(FIO;' ';3)

Пример 3. Необходимо настроить синхронизацию справочника Договоры DIRECTUM со справочником Договоры 1С (оба справочника собственная разработка заказчика). Нужно, чтобы реквизит «Состояние договора» типа признак справочника DIRECTUM синхронизировался с реквизитом «Состояние договора» типа справочник «Состояния договоров» справочника 1С. Можно вместо реквизита «Состояние договора» типа признак в справочнике DIRECTUM завести аналогичный реквизит типа справочник и настроить синхронизацию с ним. Можно обойти проблему с помощью вычисляемых реквизитов, но для этого нам нужно будет узнать UUID записей справочника 1С, которые соответствуют значениям реквизита «Состояние договора» типа признак в DIRECTUM. Т.к. я в программировании 1С не силен, то просто добавил на форму записи справочника 1С кнопку и повесил на неё такой обработчик (потом все вернул обратно, как было): 

СправочникСсылка = Справочники.СостоянияДоговоров.НайтиПоКоду(1);
Сообщить("Код = 1; UUID = " + СправочникСсылка.УникальныйИдентификатор());

И повторил этот код для всех записей, благо их было не много. В результате вычисление на реквизите получилось следующее:

  DogState = '[РИТСостДоговора]'
  Result = "00000000-0000-0000-0000-000000000000"
  if Assigned(DogState)
    if DogState == "В стадии заключения"
      Result = "9fa29428-d942-4ef7-b742-ccf411905e1b"
    endif
    if DogState == "Действующий"
      Result = "f6eecbaa-a0a4-49b3-b853-627f6f59fb0e"
    endif
    if DogState == "Завершен"
      Result = "a9f61c04-1422-4d7c-a246-46fef8f963c4"
    endif
    if DogState == "Расторгнут"
      Result = "ff8b6418-9463-4fba-baff-fa768e4912c2"
    endif
  endif

Пример 4. Необходимо настроить синхронизацию справочника Договоры DIRECTUM со справочником Договоры 1С (оба справочника собственная разработка заказчика). Нужно, чтобы в реквизит «Куратор филиала» справочника 1С заносилась информация о филиале, в котором работает руководитель подразделения заключившего договор из справочника DIRECTUM. В справочнике DIRECTUM такого реквизита нет, но есть реквизит «Подразделение» в котором содержится информация о подразделении, заключившем договор. Справочнику Наши организации DIRECTUM соответствует справочник Организации 1С. Предположим, что уже настроена синхронизация данных справочников, причем Код записи справочника Организации (1C) хранится в реквизите "ISBIntNumber" справочника Наши организации (DIRECTUM).  Более наглядно это видно на скриншотах (у реквизита "ISBIntNumber" заголовок «Код 1С»):

Можно добавить в справочник Договоры (DIRECTUM) реквизит «Филиал», в который записывать «Нашу организацию» руководителя подразделения и настроить синхронизацию этого реквизита с реквизитом «Куратор филиала» справочника 1С. А можно в настройках интеграции создать вычисляемый реквизит и все вычисления произвести в нем. Рассмотрим второй вариант, тогда  вычисление для этого реквизита будет таким:

  IntegratedSystemCode = '1С81'  //код системы 1с из справочника DIRECTUM
  Environment = Object.Environment
  V8AppIndex = Environment.IndexOfName('V8App') //проверяем наличие переменной окружения, созданной ранее коннектором
  if V8AppIndex <> -1
    V8App = Environment.Values(V8AppIndex)
  else    //если не нашли, то создадим
    V8App = Connector1C81Get1C80Application(IntegratedSystemCode) //получаем 1С app
    Environment.SetVar("V8App";V8App)  //установить переменную окр. для использования в следующей итерации
  endif

  // Определим филиал куратора (руководителя подразделения)
  PodrCode = '[Подразделение]'
  Podr = References.ПОД.GetObjectByCode(PodrCode)
  KuratorCode = Podr.Работник
  Kurator = References.РАБ.GetObjectByCode(KuratorCode)
  KuratorFilialCode = Kurator.НашаОрг
  KuratorFilial = References.НОР.GetObjectByCode(KuratorFilialCode)
  OrgCode = KuratorFilial.ISBIntNumber
  // Обратимся к объектной модели 1С, чтобы найти запись по коду
  Record1C = V8App.Справочники.Организации.НайтиПоКоду(OrgCode)
  UUID = Record1C.УникальныйИдентификатор()
  Result = V8App.String(UUID)

В результате в реквизит «Куратор филиала» справочника Договоры (1С) будет передано значение UUID записи справочника Организации (1С), которому соответствует «Наша организация» (DIRECTUM) руководителя подразделения заключившего договор.

Пример 5. Необходимо настроить синхронизацию справочника Договоры DIRECTUM со справочником Договоры 1С (оба справочника собственная разработка заказчика). Нужно, чтобы в реквизит «Куратор» справочника 1С заносилась информация о Персоне, которая является руководителем подразделения заключившего договор из справочника DIRECTUM. В справочнике DIRECTUM такого реквизита нет, но есть реквизит «Подразделение» в котором содержится информация о подразделении, заключившем договор. Справочнику Персоны DIRECTUM соответствует справочник Физические лица 1С. Предположим, что уже настроена синхронизация данных справочников, причем Код записи справочника Персоны (DIRECTUM) хранится в реквизите «ВнешнийКлюч» справочника Физические лица (1С).  Более наглядно это видно на скриншоте:

Опять же, можно добавить в справочник Договоры (DIRECTUM) реквизит «Куратор», в который записывать «Персону» руководителя подразделения и настроить синхронизацию этого реквизита с реквизитом «Куратор» справочника 1С. А можно в настройках интеграции создать вычисляемый реквизит и все вычисления произвести в нем. Рассмотрим второй вариант, тогда  вычисление для этого реквизита будет таким:

  IntegratedSystemCode = '1С81'  //код системы 1с из справочника DIRECTUM
  Environment = Object.Environment
  V8AppIndex = Environment.IndexOfName('V8App') //проверяем наличие переменной окружения, созданной ранее коннектором
  if V8AppIndex <> -1
    V8App = Environment.Values(V8AppIndex)
  else    //если не нашли, то создадим
    V8App = Connector1C81Get1C80Application(IntegratedSystemCode) //получаем 1С app
    Environment.SetVar("V8App";V8App)  //установить переменную окр. для использования в следующей итерации
  endif

  // Определим куратора (руководителя подразделения)
  PodrCode = '[Подразделение]'
  Podr = References.ПОД.GetObjectByCode(PodrCode)
  KuratorCode = Podr.Работник
  Kurator = References.РАБ.GetObjectByCode(KuratorCode)
  KuratorPersCode = Kurator.Персона

  // Найдем соответствующую запись, обратившись к объектной модели 1С
  // Сформируем запрос к 1С
  VQuery = V8App.NewObject("Query")
  VQueryText = 'select C.Code from Справочник.ФизическиеЛица as C where C.ВнешнийКлюч = "'&KuratorPersCode&'"'
  VQuery.Text = VQueryText
  VQueryResult = VQuery.Execute
  // Обработаем результат запроса
  if not VQueryResult.IsEmpty
    VQueryRecords = VQueryResult.Choose
    VQueryRecords.Next
    VRecordCode = V8App.XMLString(VQueryRecords.Get(0))
    // Найдем запись по коду
    Record1C = V8App.Справочники.ФизическиеЛица.НайтиПоКоду(VRecordCode)
    UUID = Record1C.УникальныйИдентификатор()
    Result = V8App.String(UUID)
  else
    Result = "00000000-0000-0000-0000-000000000000"
  endif 

В результате в реквизит «Куратор» справочника Договоры (1С) будет передано значение UUID записи справочника Физические лица (1С), которому соответствует «Персона» (DIRECTUM) руководителя подразделения заключившего договор. 

Пример 6. Иногда нужно из одной записи DIRECTUM сделать две записи в разных справочниках 1С. При этом если эти записи еще и связаны между собой, т.е. в реквизите одной из записей выбрана вторая, то в этом случае нужно иметь возможность получить UUID ссылку на первую запись, чтобы передать её в справочный реквизит второй записи. Это можно сделать только через конструкцию CHANGE_TO_UUID_IDDIR.  Подобную ситуацию разберем в этом примере.

Необходимо настроить синхронизацию справочника Договоры DIRECTUM со справочником Договоры 1С (оба справочника собственная разработка заказчика). Нужно, чтобы в реквизит «Договор» справочника 1С заносилась информация о Договоре из справочника Договоры не газовые 1С, которому соответствует запись справочника Договоры DIRECTUM. Если соответствующего договора в справочнике Договоры не газовые 1С нет, то нужно создать в этом справочнике запись и ссылку на неё поместить в реквизит «Договор» справочника Договоры 1С.  Предполагается, что код договора DIRECTUM хранится в реквизите «Внешний ключ» справочника Договоры не газовые 1С. Более наглядно это видно на скриншоте:

Вычисление для реквизита «Договор» будет следующим:

    IntegratedSystemCode = '1С81'  //код системы 1с из справочника DIRECTUM
  Environment = Object.Environment
  V8AppIndex = Environment.IndexOfName('V8App') //проверяем наличие переменной окружения, созданной ранее коннектором
  if V8AppIndex <> -1
    V8App = Environment.Values(V8AppIndex)
  else    //если не нашли, то создадим
    V8App = Connector1C81Get1C80Application(IntegratedSystemCode) //получаем 1С app
    Environment.SetVar("V8App";V8App)  //установить переменную окр. для использования в следующей итерации
  endif

  // Определим, есть ли такой договор в 1С
  Code = '[Код]'
  Dogovor = References.ДГВ.GetObjectByCode(Code)

  // Найдем соответствующую запись в 1С
  // Сформируем запрос к справочнику 1С
  VQuery = V8AppTemp.NewObject("Query")
  VQueryText = 'select C.Code from Справочник.ДоговорыНеГазовые as C where C.ВнешнийКлюч = "'&Trim(Dogovor.SYSREQ_CODE)&'"'
  VQuery.Text = VQueryText
  VQueryResult = VQuery.Execute
  // Если такой договор есть, то получим его UUID
  if not VQueryResult.IsEmpty
    VQueryRecords = VQueryResult.Choose
    VQueryRecords.Next
    VRecordCode = V8AppTemp.XMLString(VQueryRecords.Get(0))
    Record1C = V8AppTemp.Справочники.ДоговорыНеГазовые.НайтиПоКоду(VRecordCode)
    UUID = Record1C.УникальныйИдентификатор()
    Result = V8AppTemp.String(UUID)
  else
    // Если такого договора нет, то сформируем новый UUID
    Result = "CHANGE_TO_UUID_" & Dogovor.SYSREQ_ID
  endif

Вычисление:   

Result = "CHANGE_TO_UUID_" & Dogovor.SYSREQ_ID

вернет нам сначала строку вида «CHANGE_TO_UUID_ID», которая затем будет преобразована в реальный UUID номер.

В результате в реквизит «Договор» справочника Договоры (1С) будет передано значение UUID записи справочника Договоры не газовые (1С), которому соответствует «Договор» (DIRECTUM), либо будет сформирован новый UUID, если такого договора еще нет.

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

ЗначениеФункции = V8App.Справочники.Контрагенты.НашаФункция(Параметр)

Также нужно помнить, что при использовании подключения к 1С через вычисления или создание новой переменной окружения, приведет к использованию еще одной лицензии. Об этом не стоит забывать разрабатывая доработки к коннектору.

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

 

понравилась 4 пользователям

Комментарии
Комментарии доступны только для зарегистрированных пользователей.




Теги
4.7 4.8 awards isbl is-builder sql server бизнес-решение введение в is-builder видео дайджест документ интеграция клик настройка отчет разработка сообщество справочник сценарий функция
показать все теги