DIRECTUM 5.5. Коннектор к 1С. Практики использования. Часть 2

10 0

Экспорт записей в регистр сведений 1С

Контактная информация в 1С может храниться либо в справочнике в табличной части «Контактная информация», либо в соответствующем регистре сведений. Все зависит от конфигурации 1С. В коннекторе версии ниже 5.5 для экспорта контактной информации в 1С в обоих случаях требовалось править XSLT-преобразование, что было нелегкой задачей. В новой версии решить эту задачу можно проще через ISBL-вычисление.

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

В этой статье рассмотрим, как экспортировать контактную информацию в 1С в соответствующий регистр сведений, на примере передачи юридического адреса контрагента.

Способ 1

Поскольку контактная информация хранится в отдельном объекте (регистре сведений), а не в справочнике Контрагенты, то логичным вариантом будет создать еще одну настройку обмена.

В новой настройке обмена:

  • в поле *Объект DIRECTUM укажите справочник Организации;
  • в поле *Объект системы укажите регистр сведений Контактная информация.

Наша задача – загрузить в регистр одну строку с полями Представление, Объект, Тип, Вид. В полях необходимо передать значения:

  • в поле ПредставлениеЮридический адрес;
  • в поле Объект – GUID контрагента;
  • в поле Тип – строку «Адрес»;
  • в поле Вид – GUID записи справочника Виды контактной информации с наименованием «Юридический адрес контрагента».

Значение для поля Представление задается визуально в настройке обмена. Значения полей Объект и Вид задается в событии «При выгрузке из DIRECTUM», так как они являются составными. Значение поля Тип можно указать и в визуальной настройке, и в событии, в примере мы укажем его в событии.

В вычислениях события воспользуйтесь функцией Connector1C8v2ConvertRequisiteToTable. С ее помощью дозаполните таблицу TableIntSys необходимыми строками.

Следует обратить внимание на заполнение поля Вид с типом СправочникСсылка.ВидыКонтактнойИнформации. Коннектору требуется, чтобы в этом поле записывался GUID соответствующей записи справочника Виды контактной информации. Узнать GUID записи непосредственно из справочника 1С нельзя, но можно воспользоваться различными обработками.

Получение GUID с помощью обработки Регистрация изменений для обмена:

  • добавьте в план обмена справочник Виды контактной информации и запустите обработку;
  • в поле Узел обмен последовательно выберите план обмена и узел обмена;
  • в дереве объектов выберите справочник Виды контактной информации и в его контекстном меню выберите пункт Добавить регистрацию.
  • в открывшемся сообщении нажмите на кнопку Да;
  • в контекстном меню справочника Виды контактной информации выберите пункт Показать зарегистрированные изменения данного типа. В результате в дереве отобразятся все записи справочника;
  • в контекстном меню нужно записи справочника выберите пункт Результат стандартной выгрузки:

В результате откроется окно с представлением записи в XML-формате. В узле Ref содержится искомый GUID:

Подставьте полученный GUID в текст события «При выгрузке из DIRECTUM».

В итоге текст вычисления примет вид:

  // В событии можно использовать предопределенные переменные:
  //   IntegratedSystemCode – Код интегрированной системы;
  //   DIRECTUMObjectType – тип текущего объекта DIRECTUM;
  //   DIRECTUMObjectName – имя текущего объекта DIRECTUM;
  //   IntSysObjectType – тип текущего объекта 1С;
  //   IntSysObjectName – имя текущего объекта 1С;
  //   TableIntSys – имя временной таблицы с данными в формате 1С;
  //   Action – действие над текущей записью. Возможные значения: "Change" – создание или изменение записи, "Delete" – удаление записи;
  //   GUID – идентификатор текущей записи в 1С;
  //   RecordID – ИД текущей записи DIRECTUM;
  //   RecordCode – код текущей записи DIRECTUM. Если запись удалена, значение остается пустым;
  // Для получения значений других реквизитов используйте функцию ReferenceRequisiteValue.
  // Чтобы записать новые реквизиты в таблицу TableIntSys используйте функцию Connector1C8v2ConvertRequisiteToTable.
  // Переменную Result заполнять не нужно.


  // Юридический адрес.
  KindUrAdress = "b910ecef-9cc8-44e8-b0df-bc705acb83ed"
  Num = 1
  GUIDOrg = IntegratedSystemsObjectLinksGet(IntegratedSystemCode;"Reference";"Контрагенты";;DIRECTUMObjectType;DIRECTUMObjectName;RecordID)
  
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; IntSysObjectType; IntSysObjectName; RecordID; GUID; "Change"; "Главный"; "1"; "Объект"; "СправочникСсылка.Контрагенты"; GUIDOrg)
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; IntSysObjectType; IntSysObjectName; RecordID; GUID; "Change"; "Главный"; "1"; "Тип"; "ПеречислениеСсылка.ТипыКонтактнойИнформации"; "Адрес")
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; IntSysObjectType; IntSysObjectName; RecordID; GUID; "Change"; "Главный"; "1"; "Вид"; "СправочникСсылка.ВидыКонтактнойИнформации"; KindUrAdress)

Чтобы передать другую контактную информацию, нужно в регистр сведений передать несколько строк и в каждой строке заполнить поля Представление, Вид, Тип, Объект. В этом случае реквизит Представление необходимо заполнить в событии «При выгрузке из DIRECTUM». Таким образом не потребуется создавать несколько настроек обмена.

В итоге текст вычисления в событии «При выгрузке в DIRECTUM» со всей контактной информацией примет вид:

  // В событии можно использовать предопределенные переменные:
  //   IntegratedSystemCode – Код интегрированной системы;
  //   DIRECTUMObjectType – тип текущего объекта DIRECTUM;
  //   DIRECTUMObjectName – имя текущего объекта DIRECTUM;
  //   IntSysObjectType – тип текущего объекта 1С;
  //   IntSysObjectName – имя текущего объекта 1С;
  //   TableIntSys – имя временной таблицы с данными в формате 1С;
  //   Action – действие над текущей записью. Возможные значения: "Change" – создание или изменение записи, "Delete" – удаление записи;
  //   GUID – идентификатор текущей записи в 1С;
  //   RecordID – ИД текущей записи DIRECTUM;
  //   RecordCode – код текущей записи DIRECTUM. Если запись удалена, значение остается пустым;
  // Для получения значений других реквизитов используйте функцию ReferenceRequisiteValue.
  // Чтобы записать новые реквизиты в таблицу TableIntSys используйте функцию Connector1C8v2ConvertRequisiteToTable.
  // Переменную Result заполнять не нужно.


  // Добавить контактную информацию.
  ObjType = "InformationRegister"
  ObjName = "КонтактнаяИнформация"

  // Юридический адрес.
  UrAdressDIR = ReferenceRequisiteValue("ОРГ";RecordCode;"Содержание2";;;)
  KindUrAdress = "b910ecef-9cc8-44e8-b0df-bc705acb83ed"
  Num = 1
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Объект"; "СправочникСсылка.Контрагенты"; GUID)
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Тип"; "ПеречислениеСсылка.ТипыКонтактнойИнформации"; "Адрес")
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Вид"; "СправочникСсылка.ВидыКонтактнойИнформации"; KindUrAdress)
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Представление";; UrAdressDIR)

  // Почтовый адрес
  PostAddress = ReferenceRequisiteValue("ОРГ";RecordCode;"Дополнение2";;;)
  Num = 2
  KindPostAddress = "e921d2c4-0bd7-11df-aeeb-0019bbc830b4"
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Объект"; "СправочникСсылка.Контрагенты"; GUID)
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Тип"; "ПеречислениеСсылка.ТипыКонтактнойИнформации"; "Адрес")
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Вид"; "СправочникСсылка.ВидыКонтактнойИнформации"; KindPostAddress)
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Представление";; PostAddress)

  // Телефон
  Phone = ReferenceRequisiteValue("ОРГ";RecordCode;"Дополнение4";;;)
  KindPhone = "c5bb357f-c3b0-48ba-8a12-a42cbf99a845"
  Num = 3
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Объект"; "СправочникСсылка.Контрагенты"; GUID)
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Тип"; "ПеречислениеСсылка.ТипыКонтактнойИнформации"; "Телефон")
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Вид"; "СправочникСсылка.ВидыКонтактнойИнформации"; KindPhone)
  Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Представление";; Phone)

  // E-mail
  // Найти в ТЧ "Добавочные реквизиты".
  Org = References.ОРГ.GetObjectByCode(RecordCode)
  DS = Org.DetailDataSet(2)
  DS.First
  while not DS.EOF
    if DS.Requisites("ВидДопРеквТ2").DisplayText == "E-mail"
      Email = DS.Requisites("СодержаниеТ2").DisplayText
      Num = 4
      KindEmail = "52435d39-16df-44b9-8373-719f7e4b7e0b"
      Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Объект"; "СправочникСсылка.Контрагенты"; GUID)
      Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Тип"; "ПеречислениеСсылка.ТипыКонтактнойИнформации"; "АдресЭлектроннойПочты")
      Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Вид"; "СправочникСсылка.ВидыКонтактнойИнформации"; KindEmail)
      Connector1C8v2ConvertRequisiteToTable(TableIntSys; ObjType; ObjName; RecordID; Num; "Change"; "Главный";; "Представление";; Email)
    endif
    DS.Next
  endwhile

Способ 2

В первом способе мы создали две настройки обмена: одну для экспорта контрагентов, другую для экспорта контактной информации.

Чтобы экспортировать данные через одну настройку обмена:

  • в событие «При выгрузке из DIRECTUM» добавьте вычисления из первого способа;
  • в тексте преобразования добавьте информацию, о том, что вместе с записью справочника будут загружены записи регистра сведений:
          <Правило>
            <Код>КонтактнаяИнформация</Код>
            <Источник>РегистрСведенийЗапись.КонтактнаяИнформация</Источник>
            <Приемник>РегистрСведенийЗапись.КонтактнаяИнформация</Приемник>
          </Правило>

В итоге текст преобразования примет вид:

  <ПравилаОбмена>
      <ВерсияФормата>2.01</ВерсияФормата>
      <Ид>{ИдПравил}</Ид>
      <Наименование>DIRECTUM --> УПП 1.3</Наименование>
      <ДатаВремяСоздания>{ДатаВремяСозданияПравил}</ДатаВремяСоздания>
      <Источник>DIRECTUM</Источник>
      <Приемник>UPP31 (Д000025)</Приемник>
      <Параметры />
      <Обработки />
      <ПравилаКонвертацииОбъектов>
          <Правило>
            <Код>Контрагенты</Код>
            <ПослеЗагрузки>
              Если Метаданные.ПланыОбмена.Найти("{ExchangePlan}") = Неопределено Тогда
                ВызватьИсключение "План обмена ""{ExchangePlan}"" не найден!";
              КонецЕсли;
              Узел = ПланыОбмена["{ExchangePlan}"].НайтиПоКоду("{NodeCode}");
              Если Не ЗначениеЗаполнено(Узел) Тогда
                ВызватьИсключение "Узел с кодом ""{NodeCode}"" не найден!";
              КонецЕсли;
              Объект.ОбменДанными.Отправитель = Узел;
            </ПослеЗагрузки>
            <ГенерироватьНовыйНомерИлиКодЕслиНеУказан>true</ГенерироватьНовыйНомерИлиКодЕслиНеУказан>
            <Источник>СправочникСсылка.Контрагенты</Источник>
            <Приемник>СправочникСсылка.Контрагенты</Приемник>
            <СинхронизироватьПоИдентификатору>true</СинхронизироватьПоИдентификатору>
          </Правило>
          <Правило>
            <Код>КонтактнаяИнформация</Код>
            <Источник>РегистрСведенийЗапись.КонтактнаяИнформация</Источник>
            <Приемник>РегистрСведенийЗапись.КонтактнаяИнформация</Приемник>
          </Правило>
      </ПравилаКонвертацииОбъектов>
      <ПравилаОчисткиДанных />
      <Алгоритмы />
      <Запросы />
    </ПравилаОбмена>

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

Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий