Материал подготовлен совместно с
Петром Федотовым
Рассмотрим несколько примеров, когда нам необходимо не просто передать значение одного реквизита справочника 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, например, в отчетах, в действиях справочников, в различных агентах и т.п.