# Что нового в версии ARTA Synergy 4.1 minsky

## Введение

Версия 4.1 `minsky` выпущена 1 сентября 2019 года. Названа она в честь американского ученого Марвина Ли Минского, удостоенного премии Тьюринга за его огромный вклад в создание, формирование, продвижение и развитие искусственного интеллекта как научного направления.

Основной особенностью версии `minsky` является обновление технологического стека платформы и исключение некоторых устаревших функций. Это значительно упростит дальнейшую разработку новых функций, в особенности тех, которые связаны с формами и с процессами реестров.

Версия 4.1 выпускается как Development-версия и не является LTS. Баги, обнаруженные в версии, будут исправляться, но срок исправлений не гарантируется. Цель выпуска dev-версии - предоставление раннего доступа к новых возможностям Платформы.

## Изменения без поддержки обратной совместимости

Обновление технологического стека платформы повлекло за собой некоторые изменения без поддержки обратной совместимости, которые потенциально могут вызвать неправильную работу реализованного ранее функционала:

1. Исключенные функции платформы:
     1. группы работ
     2. разделы «Обсуждения» и «Ссылки» в файле и документе
     3. модуль «Цели и показатели»
     4. модуль IM (внутренний чат)
     5. встроенный отчет по оргструктуре
     6. мастер первоначальной настройки
     7. мониторинг Хранилища
     8. репликация Хранилища
     9. модуль «Проекты» по умолчанию отключен
2. Обновления технологического стека:
     1. Вместо jboss версии 7.1.3 Synergy теперь использует сервер приложений WildFly версии 14. Подробно об изменениях, касающихся этой версии, и возможных проблемах рассказано в разделе «Переход к использованию WildFly».
     2. Обновлена используемая версия индексатора Lucene. При обновлении системы необходимо будет обновить индексы, используя специальную утилиту, или переиндексировать данные полностью.
     3. Добавлена поддержка системы построения отчетов JasperReports версии 6.6.0. Эта версия позволяет использовать в отчетах не только SQL-запросы, но и данные JSON. Инструкция по работе с этой версией JasperReports приведена в документации.
     4. Обновлены версии Jackrabbit (управление Хранилищем) и Jackson (парсер JSON).
     5. Исключен модуль JBPM, в связи с чем процессы для маршрутов реестров написаны заново. Подробное описание изменений приведено в разделе «Реимплементация процессов».
     6. Полностью обновлен модуль обмена корреспонденцией между организациями Synergy: модуль DF-EX исключен, вместо него реализован модуль Document Exchange. Руководство по его использованию приведено в документации.
3. Обновления функций платформы:
     1. Изменена логика работы метода для установки значения компонента формы «Выбор вариантов» в интерпретаторе. Подробное описание новой логики метода приведено в разделе «Изменение логики работы метода для заполнения значений компонента «Выбор вариантов»«.
     2. Доработана возможность указания ответственного по этапу маршрута должностью. Теперь задача руководителю по выбору ответственного сотрудника приходит не в Ежедневник, а в модуль «Потоки работ».
     3. Изменено назначение прав на внешний модуль. Теперь настроить права доступа к внешнему модулю можно прямо в свойствах этого модуля в Synergy IDE. Возможность настройки доступа к внешним модулям средствами Административного приложения исключена.

## Обновление технологического стека

### Переход к использованию WildFly

WildFly - это новый формат Java EE-сервера приложений, ранее известного как JBoss AS. В Synergy 4.1 используется WildFly 14 с Java 8.

С подробным описанием WildFly 14 можно ознакомиться в официальной документации. Здесь приведем краткое описание изменений, которые непосредственно влияют на процесс работы с Synergy:

- WildFly более строго следит за стартом подсистем. В частности, если hostname машины, где запускается WildFly, не опознан, то не запустится подсистема веб-сервисов, и загрузка приложений остановится. Чтобы это исправить, нужно прописать имя хоста в файле `/etc/hosts`, например, с помощью такой команды:

      # echo "127.0.0.1    $(hostname)" >> /etc/hosts

  Вместо `127.0.0.1` можно указать внешний ip-адрес сервера.

- Конфигурационный файл `standalone-onesynergy.xml` содержит большие изменения, связанные с изменением названий и состава подсистем сервера приложений. Если в вашем старом конфигурационном файле `standalone-onesynergy.xml` не имелось каких-либо собственных изменений (например, добавления очередей, источников данных и прочего), необходимо отвечать `Да` на запрос об изменении этого конфигурационного файла при обновлении.

  Подсказка

  Если у вас имеются собственные изменения, необходимо сделать резервную копию `standalone-onesynergy.xml`, заменить ваш конфигурационный файл на тот, что поставляется с пакетом (то есть, опять же, ответить `Да` на вопрос об изменении файла) и, внимательно изучив различия старой и новой конфигураций (например, используя `diff` или его варианты), произвести необходимые изменения в новой версии конфигурационного файла.

- Состав пакетов `arta-synergy-*` значительно сокращен:

  > - `arta-synergy-jboss` - пакет, содержащий сервер приложений WildFly
  > - `arta-synergy-asforms` - описание форм Synergy
  > - `arta-synergy-deps-jackrabbit` - адаптер для хранилища Jackrabbit; как и прежде, может быть заменен на `arta-synergy-jcrmigrator` или `arta-synergy-jcr4c`
  > - `arta-synergy-esb` - объединенный пакет, содержащий шину событий Synergy и индексатор
  > - `arta-synergy-synergy` - пакет с Synergy и всеми необходимыми библиотеками (которые ранее жили в пакете `arta-synergy-deps*`)
  > - `arta-synergy-utils` - некоторые вспомогательные утилиты

#### Инструкция по исправлению ошибок, возникших после обновления

##### Восстановление работы внешних модулей

1. В зависимостях на библиотеки

   - `compile(group: 'com.google.guava', name: 'guava', version: '14.0.1', transitive: false)`
   - `compile(group: 'org.slf4j', name: 'slf4j-api', version: '1.6.1', transitive: false)`
   - `compile ('org.jboss.spec:jboss-javaee-6.0:3.0.3.Final')`
   - `compile "org.codehaus.jackson:jackson-mapper-asl:1.9.13"`
   - `compile "org.codehaus.jackson:jackson-core-asl:1.9.13"`

   прописать новые версии:

   - `compile(group: 'com.google.guava', name: 'guava', version: '18.0', transitive: false)`
   - `compile(group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25', transitive: false)`
   - `compile ('org.jboss.spec:jboss-javaee-7.0:1.1.1.Final')`
   - `compile "org.codehaus.jackson:jackson-mapper-asl:1.9.2"`
   - `compile "org.codehaus.jackson:jackson-core-asl:1.9.2"`

   Версии для `asf-common` и `util-common` прописать 4.1:

   - `compile(group: 'kz.arta', name: 'asf-common', version: '4.1')`
   - `compile(group: 'kz.arta', name: 'util-common', version: '4.1')`

2. Чтобы приложение деплоилось после деплоя Synergy.ear, необходимо добавить файл `jboss-all.xml` в WEB-INF с содержимым:

>     <jboss umlns="urn:jboss:1.0">
>         <jboss-deployment-dependencies xmlns="urn:jboss:deployment-dependencies:1.0">
>             <dependency name="Synergy.ear" />
>         </jboss-deployment-dependencies>
>     </jboss>

3. При вызове методов API Synergy в PostConstruct методах в WildFly может возникнуть ошибка:

   >     WFLYCTL0348: Timeout after [300] seconds waiting for service container stability. Operation will roll back. Step that first updated t
   >     he service container was 'add' at address '[
   >         ("core-service" => "management"),
   >         ("management-interface" => "native-interface")
   >     ]'

   Если ошибка будет воспроизводится на вашем стенде Synery, то в качестве обходного варианта решения предлагаем вынести обращения к методам API в таймер, который будет запускаться в PostConstruct методе с задержкой 2 минуты. Если вы найдете более элегантное решение, просим сообщить в команду Core Team.

4. Если вы используете resteasy его необходимо прописать через providedCompile:

   >     providedCompile(group: 'org.jboss.resteasy', name: 'resteasy-jaxrs', version: '3.8.0.Final')
   >     providedCompile(group: 'org.jboss.resteasy', name: 'resteasy-multipart-provider', version: '3.8.0.Final')

##### Новый формат очередей

Wildfly интегрирован с Apache ActiveMQ Artemis, поэтому в случае наличия на стенде Synergy кастомных очередей необходимо поменять их формат (в файле `/opt/synergy/jboss/standalone/configuration/standalone-onesynergy.xml`).

Очереди теперь прописываются в разделе `<subsystem xmlns="urn:jboss:domain:messaging-activemq:3.0">` в формате:

    <jms-queue name="ItsmBlockingQueue" entries="queue/ItsmBlockingQueue java:jboss/queues/Integration/ItsmBlockingQueue" durable="true"/>

##### Изменения в скриптах интерпретатора

Скрипты, содержащие строки со `splice`, на Java8 отрабатывают некорректно:

`Array.prototype.splice.call(arguments, 0);`

Необходимо заменить такую строку на следующую:

`var args = Array.prototype.slice.call(arguments);`

Предположим, что скрипт интерпретатора содержал такой код:

    getValue: function(){
        Array.prototype.splice.call(arguments, 0);
        args.push(__SERVER);
        return __CLIENT__.getValue.apply(null, args);
    }

    setValue: function(){
        Array.prototype.splice.call(arguments, 0);
        args.push(__SERVER);
        return __CLIENT__.setValue.apply(null, args);
    }

Исправленный вариант этого кода выглядит так:

    getValue: function(){
        var args = Array.prototype.slice.call(arguments);
        args.push(__SERVER);
        return __CLIENT__.getValue.apply(null, arguments);
    }

    setValue: function(){
        var args = Array.prototype.slice.call(arguments);
        args.push(__SERVER);
        return __CLIENT__.setValue.apply(null, args);
    }

### Обновление Lucene

До версии Synergy 4.0 включительно в качестве индексатора форм, файлов и документов использовался Lucene версии 3.6.2.

В версии Synergy 4.1 используемая версия индексатора была обновлена до 7.3.1. При этом актуальная версия Lucene может не поддерживать некоторые индексы, созданные в предыдущих версиях, и это не является ошибкой Synergy.

#### Утилита для обновления индексов

Пакет `arta-synergy-utils` содержит утилиту для апгрейда индексов Lucene до версии 7. Чтобы ее использовать, нужно:

1. остановить `jboss`:

   >     # /etc/init.d/arta-synergy-jboss stop

2. вызвать команду:

       # /opt/synergy/utils/lucene/upgrade-to-lucene-7.sh

   При необходимости можно передать пути к индексам в командной строке, например:

   >     # /opt/synergy/utils/lucene/upgrade-to-lucene-7.sh /some/index/path /some/other/path

В этом случае файл `/opt/synergy/jboss/standalone/configuration/arta/luceneConfiguration.xml` игнорируется.

В случае успешного апгрейда индексов вывод команды будет таким:

    Reading paths from /opt/synergy/jboss/standalone/configuration/arta/luceneConfiguration.xml:
    /var/lib/synergy/documentIndex /var/lib/synergy/formIndex /var/lib/synergy/index
    ========================
    Upgrade /var/lib/synergy/documentIndex to:
    Lucene version 4.10.4... done.
    Lucene version 5.5.0... done.
    Lucene version 6.3.0... done.
    Lucene version 7.3.1... done.
    ========================
    Upgrade /var/lib/synergy/formIndex to:
    Lucene version 4.10.4... done.
    Lucene version 5.5.0... done.
    Lucene version 6.3.0... done.
    Lucene version 7.3.1... done.
    ========================
    Upgrade /var/lib/synergy/index to:
    Lucene version 4.10.4...done.
    Lucene version 5.5.0... done.
    Lucene version 6.3.0... done.
    Lucene version 7.3.1... done.
    ========================
    Upgrade to Lucene 7 went OK!

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

Внимание

Процедуру полной переиндексации документов, форм и файлов необходимо выполнять независимо от того, какой индексатор используется в Synergy - и для Lucene, и для Elasticsearch.

#### Возможные ошибки

Возможна ситуация, когда утилита не сможет обновить индексы:

    Reading paths from /opt/synergy/jboss/standalone/configuration/arta/luceneConfiguration.xml:
    /var/lib/synergy/documentIndex /var/lib/synergy/formIndex /var/lib/synergy/index
    ========================
    Upgrade /var/lib/synergy/documentIndex to:
    Lucene version 4.10.4...Exception in thread "main" org.apache.lucene.index.IndexFormatTooNewException: Format version is not supported (resource: BufferedChecksumIndexInput(MMapIndexInput(path="/var/lib/synergy/documentIndex/segments_w"))): 8 (needs to be between 0 and 3)
        at org.apache.lucene.codecs.CodecUtil.checkHeaderNoMagic(CodecUtil.java:156)
        at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:348)
        at org.apache.lucene.index.SegmentInfos$1.doBody(SegmentInfos.java:462)
        at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:923)
        at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:769)
        at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:458)
        at org.apache.lucene.index.DirectoryReader.listCommits(DirectoryReader.java:277)
        at org.apache.lucene.index.IndexUpgrader.upgrade(IndexUpgrader.java:150)
        at org.apache.lucene.index.IndexUpgrader.main(IndexUpgrader.java:73)

В этом случае нужно:

1. остановить `jboss`

2. удалить индексы из папки `/var/lib/synergy/`:

   >     # rm -r /var/lib/synergy/documentIndex /var/lib/synergy/formIndex /var/lib/synergy/fileIndex /var/lib/synergy/index

3. запустить `jboss` и выполнить индексирование файлов, форм и документов в Административном приложении

Внимание

Обратите внимание, что при этом также могут быть удалены и кастомные индексы, которые использовались для построения диаграмм, и при индексировании данных эти индексы не будут созданы автоматически. Бизнес-приложениям необходимо самостоятельно пересоздать используемые кастомные индексы.

### Обновление Cassandra

В Synergy 4.1 была обновлен используемый пакет для хранилища Cassandra до версии 2.2. Со всеми нововведениями в этой версии вы можете ознакомиться по ссылке.

Одним из преимуществ новой версии Cassandra является возможность компрессии данных, которая не только обеспечивает экономию дискового пространства, но и увеличивает скорость чтения с диска на 25-35% (согласно официальному заявлению Datastax).

Сравнение экономии дискового пространства при использовании различных алгоритмов сжатия
Метод компрессии | Процент сжатия
--- | ---
LZ4 | 12,54
Snappy | 12,48
Deflate | 33,84

#### Как включить компрессию

При использовании хранилища Cassandra с платформой Arta Synergy следует включать компрессию на таблицах `jcr.properties` и `jcr_ss4c.ss4c`, например, при выборе алгоритма сжатия `DeflateCompressor` команды будут выглядеть следующим образом:

>     cqlsh> ALTER TABLE jcr.properties WITH compression = {'sstable_compression': 'DeflateCompressor'};

>     cqlsh> ALTER TABLE jcr_ss4c.ss4c  WITH compression = {'sstable_compression': 'DeflateCompressor'};

Для отключения компрессии нужно использовать подобную команду:

>     cqlsh> ALTER TABLE jcr.properties WITH compression = {'sstable_compression': ''};

Способы включить/ отключить компрессию на таблицах БД показаны в соответствующей статье Datastax.

### Обновление JasperReports

В новой версии Synergy была добавлена поддержка работы с системой для построения пользовательских отчетов TIBCO Jaspersoft Studio (на момент релиза актуальной является версии 6.6.0). Среди прочих изменений, внедренных TIBCO в этой версии, в применении к Synergy интересна возможность построения отчетов на основе данных JSON и XML.

Инструкция по работе с новой версией JasperReports приведена в Руководстве разработчика.

## Обновление функций Платформы

### Реимплементация процессов

В Synergy 4.1 был полностью исключен модуль JBPM, который использовался для управления процессами в документах. Теперь вся реализация процессов полностью включена в ядро платформы.

При этом было изменено поведение так называемых «специальных процессов» - то есть тех, которые выполняются автоматически, без участия пользователя. К специальным процессам относятся:

- назначение на должность
- перевод
- увольнение
- копирование в личное дело
- назначение календаря
- копирование в карточку
- переназначение работ
- отправка документа по форме
- сопоставление в реестр
- событие реестра
- результат запроса
- таймер

Для всех этих типов действий была добавлена возможность запуска группы последовательных этапов в единой транзакции: для этапа со специальным процессом добавлена возможность добавления к нему последовательных подэтапов. Таким образом обеспечивается транзакционная целостность специальных процессов.

#### Изменения без поддержки обратной совместимости

1. В Административном приложении удален раздел «Обслуживание системы» - «Процессы». Обновление процессов после обновления системы не требуется.
2. Удалены методы API, обеспечивающие обновление процессов:
   - `rest/api/admin/processes/available`
   - `rest/api/admin/processes/not_actual`
   - `rest/api/admin/processes/update`
3. Удалена схема базы данных `jbpmdb`.

#### Пример

Рассмотрим синтетический, но достаточно наглядный пример, когда нужно одним приказом об отпуске сотрудника изменить его статус, переназначить его работы на другого сотрудника, скопировать сведения об отпуске в личную карточку сотрудника, а сам приказ - в его личное дело.

Маршрут активации записи реестра приказов может быть таким:

1. Согласование
2. Назначение календаря
3. Копирование в личное дело
4. Копирование в карточку
5. Переназначение работ
6. Регистрация

Сначала добавим этапы «Согласование» и “Назначение календаря”. Текущий вид редактора маршрутов:

Обратите внимание на выделенную кнопку «Добавить последовательный»: эта кнопка активна только для специальных процессов и добавляет новый последовательный подэтап, который будет выполнен в единой транзакции с текущим этапом:

При добавлении нового последовательного подэтапа список доступных типов действий фильтруется: в нем отображаются только специальные процессы.

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

Добавим еще несколько последовательных подэтапов в группу:

Видно, что последовательные этапы нумеруются внутри своей группы.

Полный маршрут реестра приказов выглядит таким образом:

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

Примечание

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

### Новый метод обмена корреспонденцией между организациями Synergy

В новой версии Synergy мы полностью переписали модуль обмена корреспонденцией между организациями Synergy (модуль DF-EX). Вместо него сейчас используется пакет `arta-synergy-doc-exchange`, в котором весь обмен документами полностью реализован с помощью API, без использования почты.

При этом полностью запрещено использование форм старого формата, которые добавлялись в Административном приложении, раздел «Формы»:

Сами файлы форм не будут удалены, но их нельзя больше использовать для обмена документами, а также запрещено добавлять новые формы в этот раздел.

#### Изменения методов API

Для обеспечения полноценного обмена документами были удалены некоторые устаревшие методы и реализованы новые. Все новые методы продокументированы в swagger.

Удаленные методы API:

1. `rest/api/docflow/doc/addDtiIDLink`
2. `rest/api/docflow/doc/getDocumentInfo`
3. `rest/api/docflow/doc/getRegUserByUUID`

Новые методы:

1. `rest/api/docflow/doc/create` - создание документа с карточкой
2. `rest/api/docflow/doc/log` - добавление либо пересохранение данных из хода исполнения документа
3. `rest/api/docflow/doc/register` - отправка документа на регистрацию
4. `rest/api/docflow/doc/reject` - отказ в регистрации документа
5. `rest/api/docflow/doc/save` - сохранение документа с карточкой
6. `rest/api/dictionary/record/edit` - изменение записи справочника

Реализованы новые события документов:

1. `event.docflow.document.change` - документ изменен
2. `event.docflow.document.changeRkk` - изменен РКК документа
3. `event.docflow.document.send.for.registration` - документ отправлен на регистрацию
4. `event.docflow.document.reject` - отказ в регистрации документа
5. `event.docflow.document.finished` - завершено исполнение документа

#### Первичная настройка

После установки пакета `arta-synergy-doc-exchange` нужно перейти по ссылке `<host>:<port>/doc-exchange` и авторизоваться под пользователем с ролью Synergy Developer:

После успешной авторизации будет отображен модуль настройки обмена корреспонденцией. Этот модуль состоит из двух основных частей:

1. «Корреспонденты», позволяющий настроить и синхронизировать список корреспондентов, которые будут обмениваться документами
2. «Настройки», содержащий общие настройки модуля обмена документами.

##### Настройки модуля

Этот раздел содержит подсказки по настройке форм для типов документов: описание и коды компонентов, которые обязательно должны содержаться на форме.

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

Пользователь, указанный в настройках, должен иметь роли «Разработчик Synergy» и «Сотрудник канцелярии».

Внимание

Если на стенде, где установлен doc-exchange, ранее уже был настроен DF-EX, необходимо убедиться, что ни в одном из приложений в Synergy IDE нет справочника с кодом, указанным в настройке «Код справочника корреспондентов» (для этого можно воспользоваться поиском по заголовку объекта):

Если справочник с указанным кодом уже существует в одном из приложений, то нужно:

- либо удалить этот справочник из приложения Synergy IDE;
- либо в настройках doc-exchange указать другой код справочника корреспондентов.

Например:

В этом же разделе указываются настройки отправки документов:

- Интервал повторной отправки (по умолчанию - 600000мс)
- Количество попыток отправки (по умолчанию - 6 попыток)
- Отправлять печатное представление файлов по форме
- Отправлять прочие файлы
- Отправлять ход исполнения исходящего документа

Примечание

Флаг «Отправлять ход исполнения исходящего документа» заменяет собой флаг «Синхронизировать ход выполнения по входящему документу», который использовался в модуле DF-EX.

##### Начало работы

При подключении нового экземпляра Synergy к обмену документами, в том числе и при первичной настройке этого обмена, необходимо:

1. Определить приложение Synergy (в Synergy IDE), в котором будут собраны журналы и типы документов, участвующие в обмене, или создать такое приложение. Указать его код в настройках doc-exchange.

2. В приложении настроить объекты:

   > - журналы для входящих и исходящих документов

   > - форму для исходящих документов, содержащую компонент «Выпадающий список» с идентификатором `exchangeCorrespondent`

   >   > Подсказка

   >   > Если предполагается отправка документа нескольким корреспондентам, то на форму можно добавить динамическую таблицу с произвольным кодом, а в ней разместить выпадающий список `exchangeCorrespondent`.

   > - форму для входящих документов, содержащую компоненты:

   >   - поле «Выпадающий список» с идентификатором `exchangeCorrespondent`, заблокированное от изменения пользователем
   >   - поле «Выпадающий список» с идентификатором `exchangeAuthorCorrespondent`, заблокированное от изменения пользователем
   >   - поле «Однострочный текст» с идентификатором `srcDocumentId`, скрытое

   > - входящий тип документа, для которого указана настроенная дополнительная форма входящих документов

   >   > Внимание

   >   > В типе документа в поле «Способ ввода срока» должен быть выбран вариант «Длительность». В противном случае обмен документами работать не будет.

   > - исходящие типы документов, для каждого из которых указана дополнительная форма исходящих документов

3. В интерфейсе doc-exchange, раздел «Корреспонденты», указать первого корреспондента - собственный экземпляр Synergy:

   > - код - уникальный код корреспондента
   > - наименование корреспондента на трех языках
   > - URL Synergy в формате `http(s)://<host>:<port>/Synergy` - указать хост и порт текущего экземпляра Synergy
   > - URL doc-exchange в формате `http(s)://<host>:<port>/doc-exchange`
   > - логин и пароль пользователя этого экземпляра Synergy, у которого есть роли «Сотрудник канцелярии» и «Разработчик Synergy»
   > - код входящего типа документа, созданного в Synergy IDE
   > - коды исходящих типов документов, созданных в Synergy IDE (если типов исходящих документов несколько, можно перечислить их коды через запятую)

   > Пример заполнения сведений о корреспонденте:

4. Сохранить внесенные сведения, нажав на кнопку «Сохранить».

   > Корреспондент будет добавлен в общий список корреспондентов. При этом в указанном приложении Synergy IDE будет создан справочник корреспондентов, содержащий один элемент - текущего корреспондента.

5. В Synergy IDE в формах для входящих и исходящих документов, созданных на шаге 2, в свойствах `exchangeCorrespondent` и `exchangeAuthorCorrespondent` указать справочник «Справочник корреспондентов организаций»; в качестве значения компонента указать колонку «Код»:

Далее можно приступать к добавлению новых корреспондентов.

#### Добавление нового корреспондента

Корреспонденты могут располагаться как на одном и том же экземпляре Synergy, так и на отдельных (в случае, если документы должны передаваться между разными Synergy, имеющими разные URL). С точки зрения doc-exchange никакой разницы между этими вариантами нет.

В общем случае процесс настройки нового корреспондента начинается в Synergy IDE:

1. в приложении с кодом, указанным в настройках doc-exchange, нужно создать тип входящего документа, указав для него дополнительную форму для входящего документа

2. в этом же приложении создать типы исходящих документов (один или несколько), указав для них дополнительную форму исходящего документа

   > Внимание

   > Каждый корреспондент независимо от того, расположен он на общем с другими корреспондентами экземпляре Synergy или на отдельном, должен иметь уникальные коды типов документов.

3. в интерфейсе doc-exchange добавить нового корреспондента:

   > В данном случае, находясь на Synergy `http://192.168.3.224:8080`, указываем корреспондента `syn2` с другого экземпляра `http://192.168.4.40:8080`, где также установлен пакет `arta-synergy-doc-exchange`, приложение Synergy IDE со специальными формами входящих и исходящих типов документов.

   > Экземпляр Synergy `http://192.168.4.40:8080` содержит еще одного корреспондента с собственными типами входящих и исходящих документов, с уникальным кодом `syn2_filial`, но общими URL Synergy и doc-exchange.

#### Группы корреспондентов

Часто возникает потребность отправки документа одновременно нескольким корреспондентам. Для случая, когда набор корреспондентов постоянный (например, в случае отправки документа из Центрального аппарата всем филиалам), удобно использовать группы корреспондентов.

Группы добавляются таким же образом, что и корреспонденты. В диалоге настройки корреспондента необходимо включить флаг «Является группой». После этого необходимо будет отметить тех корреспондентов, которые будут входить в группу:

#### Синхронизация

Обмен документами посредством doc-exchange построен на том, что у каждого корреспондента, участвующего в обмене, есть доступ к общему справочнику корреспондентов и одному и тому же набору его элементов. В терминах Synergy синхронизация корреспондентов - это приведение элементов справочника корреспондентов к одному и тому же состоянию на всех экземплярах Synergy, участвующих в обмене.

Примечание

1. Синхронизация необходима только в том случае, когда в обмене документами участвуют организации, расположенные по разным URL Synergy. Если все корреспонденты расположены на одном и том же экземпляре Synergy, то выполнение синхронизации не требуется.
2. Группы корреспондентов не синхронизируются.

Для корректной синхронизации рекомендутся:

1. на одном экземпляре Synergy (в интерфейсе doc-exchange) добавить сведения обо всех корреспондентах, включая тех, что расположены на текущем стенде

2. нажать на кнопку «Синхронизировать»

   > > Внимание

   > > Предварительно необходимо убедиться, что на каждом экземпляре Synergy, где расположены указанные корреспонденты, установлен пакет `arta-synergy-doc-exchange`.

   > В случае успешной синхронизации в списке корреспондентов будут указаны дата и время последней синхронизации:

3. открыть интерфейс doc-exchange на другом экземпляре Synergy: список корреспондентов будет содержать синхронизированные элементы, настроенные на исходном стенде.

##### Пример: отправка и получение документов

В качестве примера рассмотрим вариант настройки корреспондентов и сам процесс обмена документами между организациями:

1. на стенде 1 в Synergy IDE настроено приложение, содержащее специальные формы, журналы и типы входящих и исходящих документов для одного корреспондента `syn1`;

2. на стенде 2 в Synergy IDE настроено другое приложение, содержащее формы, журналы и типы документов для трех корреспондентов:

   > - `syn2`
   > - `syn2_filial`
   > - `syn2_filial2`

3. на стенде 1 в интерфейсе doc-exchange добавлены все четыре корреспондента:

   > Находясь на стенде 3.224, добавляем корреспондента-себя и корреспондентов с соседнего стенда 4.40.

   > Пример настройки корреспондента-филиала `syn2_filial2`.

4. синхронизируем корреспондентов, нажав на кнопку «Синхронизировать» в верхней части экрана; после сообщения о начале синхронизации у каждого корреспондента в списке будут указаны статус синхронизации и время последней удачной синхронизации:

   > В результате синхронизации в справочнике корреспондентов на стенде 4.40 будут добавлены элементы, соответствующие корреспондентам.

5. перейдем к doc-exchange на стенде 2, обновим список корреспондентов и убедимся, что там уже были автоматически добавлены все корреспонденты:

Теперь в клиентской части Synergy на стенде 1 создадим новый документ исходящий документ в журнале:

> Выбран тип документа, указанный как исходящий для корреспондента. Ниже стандартных полей РКК документа располагаются дополнительные поля формы, добавленной для этого типа документа - в нашем случае это выпадающий список настроенных корреспондентов.

Заполним краткое содержание документа, а в дополнительных полях формы типа документа выберем нужного корреспондента:

> В нашем случае доступна отправка только одному корреспонденту, потому что на стенде не были настроены группы, а на форме исходящего документа выбор корреспондентов не был помещен в динамическую таблицу.

На следующем шаге мастера регистрации документов добавим вложения для исходящего документа:

> Внимание

> Все исходящие документы, отправляемые посредством doc-exchange, обязательно должны содержать вложения. Документы без вложений будут зарегистрированы в исходящем журнале отправителя, но не будут отправлены корреспондентам-получателям.

Зарегистрируем документ, откроем его карточку и проверим ход выполнения:

> В ходе выполнения исходящего документа отображено, что он был отправлен корреспонденту «Синерджи 4.40» и находится там в статусе «На регистрации».

Перейдем на стенд корреспондента-получателя и проверим его журнал входящих документов:

> Документ получен.

В мастере регистрации входящего документа указан его тип документа, канцеляр-отправитель, а в дополнительных полях - корреспондент-автор:

Зарегистрируем входящий документ, а потом вернемся на исходный стенд и проверим ход выполнения исходящего документа:

> В ходе выполнения исходящего документа отображен его номер регистрации как входящего у корреспондента-получателя.

Если у исходящего документа до момента его регистрации был ход выполнения, он также будет передан корреспондентам:

> Документ был отправлен от корреспондента «Синерджи 4.40» корреспонденту «Синерджи 3.224». До его отправки документ был согласован сотрудниками организации-автора, что и отображено в его ходе выполнения.

### Подключаемые библиотеки в Интерпретаторе

При разработке часто возникает потребность использовать в скриптах интерпретатора один и тот же код - собственные методы или внешние библиотеки. Ранее для этого приходилось в каждом экземпляре скрипта интерпретатора добавлять коды этих библиотек.

Мы реализовали возможность использования в скриптах интерпретатора библиотек, добавленных в пользовательские компоненты. Теперь код, который ранее повторялся в нескольких скриптах, можно вынести в один пользовательский компонент. На сервере при выполнении скрипта интерпретатора также будут выполняться все скрипты его подключенных библиотек.

Для пользовательских компонентов был добавлен новый флаг «Использовать в скриптах интерпретатора». Этот флаг альтернативный по отношению к флагу «Использовать в формах»: нельзя включить оба флага одноременно:

В свойствах скрипта интерпретатора добавлен новый раздел «Библиотеки», где отображаются названия всех Пользовательских компонентов, у которых включен флаг «Использовать в скриптах интерпретатора»:

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

### Доработка форм

Мы продолжаем расширять возможности работы с формами Synergy.

#### Представления формы

В новой версии была добавлена возможность создания представлений формы - вариантов внешнего вида и компоновки компонентов формы.

Настроив несколько представлений для одной формы, разработчик Synergy сможет отрегулировать верстку формы для различных экранов - от мобильных до широкоформатных.

Другой вариант использования представлений - предоставление пользователю частичного отображения формы посредством Конструктора приложений или внешнего проигрывателя форм.

В Synergy IDE для форм добавлена новая дочерняя папка «Представления», которая создается автоматически вместе с формой:

При этом печатное представление формы вынесено в отдельную дочернюю ноду формы.

В контекстном меню папки «Представления» есть один пункт - «Добавить представление».

Имя нового представления должно соответствовать тем же правилам, что и имя папки в IDE, то есть должно состоять только из букв латинского алфавита, цифр и символа `_`, и не должно начинаться с цифры:

Созданное представление можно переименовать или удалить с помощью его контекстного меню.

Вкладка представления открывается внутри вкладки формы:

По сути представление формы - это способ расположения уже существующих компонентов основной формы. Поэтому в редакторе представления все компоненты представлены в виде двух основных разделов: «Новые» и «Существующие».

К новым компонентам относятся компоненты «Неизменяемый текст», «Таблица» и «Изображение». При этом функциональность компонента “Таблица” здесь существенно урезана - например, нельзя сделать таблицу динамической:

Все компоненты основной формы, в том числе настроенные динамические таблицы, расположены в существующих компонентах и сгруппированы по типам:

Рабочая область редактора представлений содержит основную таблицу, в которой расположены компоненты представления.

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

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

Динамическая таблица при добавлении в представление состоит из одной ячейки основного блока таблицы и одной ячейки заголовка, если он был настроен:

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

Аналогично, если выделена ячейка основного блока динамической таблицы, слева будут отображены только компоненты из блоков этой таблицы:

Таким образом «перемешать» как компоненты разных динамических таблиц, так и компоненты из заголовка и блоков одной таблицы невозможно.

##### Использование представлений форм

В Конструкторе приложений компонент «Проигрыватель форм» содержит специальное свойство «Код представления». В этом свойстве можно указать название представления, настроенного для формы:

При использовании внешнего проигрывателя форм для отображения нужного представления используется метод `showView`:

`this.player.model.showView(viewCode)`

#### Новый компонент «Вычисляемое поле»

Очень часто возникает необходимость выполнить какие-либо арифметические операции с числами на форме. Ранее это можно было сделать только с помощью блокирующего процесса.

Мы реализовали новый тип компонента, который называется «Вычисляемое поле». Этот компонент позволяет производить вычисления с компонентами формы на основе настроенной формулы. Вычисления выполняются как на стороне клиента, так и на стороне сервера:

1. при изменении значения поля, участвующего в выражении (в том числе в режиме предпросмотра формы в конструкторе), агрегирование значений компонентов в динтаблице выполняется также при изменении количества блоков в таблице;
2. при изменении выражения (в конструкторе);
3. при создании и открытии записи по форме;
4. при сохранении данных по форме.

##### Описание компонента

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

Настройки вычисляемого поля:

##### Синтаксис формул

Поддерживаемые действия:

- арифметические (+, -, *, /);
- агрегирование значений компонентов (сумма `SUM`, среднее арифметическое `AVG`, минимум `MIN`, максимум `MAX`, количество элементов `COUNT`);
- сравнения (<, <=, >, >=, =, !=);
- условный оператор `IF(<условие>, <значение, если истина>, <значение, если ложь>)`.

Обращение к компоненту:

- `${cmp-id}`, `${cmp-in-static-table}` - значение указанного компонента;
- `#{cmp-id}` - значение компонента `cmp-id`, расположенного в динтаблице, текущий блок (применяется только для формул в компонентах, расположенных в этом же блоке динтаблицы);
- `@{dyntable.cmp-id}` - массив значений компонента `cmp-id` из всех блоков динтаблицы `dyntable`.

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

Выражение может быть оформлено разными способами:

- с использованием арифметических действий: `(${cmp1}+${cmp2})/3`
- с использованием функций агрегирования: `MIN(@{dyntable.cmp1})`, `AVG(${cmp1},${cmp2})`
- комбинированный вариант: `COUNT(@{dyntable.cmp1})*${cmp1}+1`

В выражениях допускается использование id компонентов любого типа. Операции выполняются с `key` компонентов, если они есть, если нет - то с `value`. Если ключ/значение хотя бы одного из используемых в выражении операндов (компонента или константы) - не число, или указан несуществующий компонент, то выражение считается некорректным.

При невозможности вычисления выражения (например, при делении на ноль) оно также считается некорректным.

В случае, если в компоненте указано некорректное выражение, в режиме конструктора и заполнения формы в этом компоненте отображается текст `#NUM!#`.

##### Работа с динамическими таблицами

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

1. Выражение добавлено в компонент, расположенный в динтаблице:

   > - если в выражении используется агрегирование значений компонентов, расположенных в этой же таблице, то выражение считается некорректным;
   > - если в выражении используются арифметические действия с компонентами, расположенными в этой же таблице, то операции должны выполняться для компонентов в одном блоке;
   > - допускается в выражении использовать агрегирование значений компонентов, расположенных в другой динамической таблице.

2. Выражение добавлено в компонент, расположенный вне динтаблицы, и использует компонент в динтаблице:

   > - если компонент из динтаблице используется без агрегирования, то выражение считается некорректным;
   > - допускается в выражении использовать агрегирование значений компонентов, расположенных в разных динтаблицах.

Работа с массивами

> Здесь массив - набор значений компонента `cmp` во всех блоках динтаблицы `dyntable`.

Массив может быть указан только в качестве аргумента функции агрегирования: `AVG(@{dyntable.cmp})`. Во всех остальных случаях при использовании массива в формуле выражение считается некорректным, в том числе при использовании массива в качестве аргумента арифметических операций: выражение вида `SUM(@{dyntable.price}*@{dyntable.count})` будет считаться некорректным.

##### Пример

Рассмотрим пример формы «Заказ» со списком товаров и итоговой суммой. Форма может выглядеть так:

Коды компонентов, которые будут участвовать в вычислениях:

- динамическая таблица со списком товаров: `itemList`
- цена за единицу товара: `price`
- количество: `count`

Сначала добавим компонент для вычисления стоимости товара в таблице. Для этого в столбец «Стоимость» добавим компонент «Вычисляемое поле» с кодом `value`:

Теперь нужно в настройках этого компонента указать формулу для вычисления:

Формула выглядит так: `#{price}*#{count}`. Здесь:

- обращение к компонентам выполняется с использованием символа `#`, потому что необходимо использовать значение из текущей строки динамической таблицы;
- значения компонентов `price` и `count` должны быть перемножены между собой.

Настроенная формула отображается в компоненте при просмотре формы в конструкторе:

Проверить вычисления можно в режиме заполнения формы:

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

Теперь настроим вычисление итоговой стоимости. Для этого на форму добавим еще один компонент «Вычисляемое поле» и настроим для него формулу:

Используется формула `SUM(@{itemList.value})`. Здесь:

- `SUM()` - суммирование компонентов, перечисленных в скобках;
- `@{itemList.value}` - обращение к компоненту `value`, расположенному в динамической таблице `itemList`.

Результатом вычисления будет сумма всех значений компонента `value` во всех строках динтаблицы.

Проверим формулу в режиме заполнения формы:

Таким образом на форме можно выполнять арифметические действия без использования скриптинга и блокпроцессов.

#### Поиск в компоненте «Выпадающий список»

Мы добавили возможность использовать текстовый поиск в компоненте «Выпадающий список». Это удобно при работе с большим количеством элементов в списке. Например, список содержит города Казахстана:

Для того, чтобы использовать в поле текстовый поиск, нужно в настройках компонента «Выпадающий список» включить флаг «Позволять поиск»:

После этого в поле списка можно вводить текст, который будет использоваться как фильтр элементов списка:

#### Изменение логики работы метода для заполнения значений компонента «Выбор вариантов»

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

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

##### Пример

Предположим, что на форме расположен компонент «Выбор вариантов», элементами которого являются элементы справочника:

Создадим новый скрипт интерпретатора с кодом:

    var form = platform.getFormsManager().getFormData (dataUUID);
    form.load();
    //в компоненте checklist включить элементы item1 и item3, остальные отключить
    form.setValue("checklist","item3, item1");
    form.save();
    var result=true;
    var message = "OK";

С помощью пробного запуска проверим работу скрипта на тестовой записи:

После выполнения скрипта в записи выделены только те элементы, которые были перечислены в методе `setValue`, остальные элементы выключены:

### Доработка процесса указания ответственного по этапу маршрута должностью

Часто возникает необходимость в этапе маршрута реестра указать в качестве ответственного не конкретного сотрудника, а некоторую должность. Ранее в этом случае руководителю указанной должности необходимо было выбрать ответственного по этому этапу через модуль «Ежедневник»:

У такой реализации было несколько проблем:

1. руководителю, несмотря на наличие новой заметки в Ежедневнике, не отображался счетчик новых уведомлений (на иконке модуля);
2. пока руководитель не выбрал ответственного сотрудника, в ходе выполнения документа либо указывался этап без ответственного, либо вовсе не отображался текущий этап - в зависимости от того, содержится ли текущий этап в шаблоне маршрута или напрямую в маршруте реестра.

Мы изменили это поведение, реализовав новый процесс «Выбор исполнителя» - работа руководителю должности по выбору исполнителя. Эта работа, как и все остальные, отображается в потоке работ руководителя:

Полный алгоритм определения руководителя, который должен выбрать ответственного исполнителя для работы в случае, когда на указанную должность назначено два или более сотрудников:

- проверяется наличие у руководителя подразделения, к которому относится должность, заместителей;

  > - если для подразделения должности есть ровно один заместитель, то работа по выбору ответственного ставится ему;
  > - если для подразделения должности есть несколько заместителей, то им всем будут созданы параллельные работы по выбору ответственного; как только один из заместителей завершил свою работу, она завершается и у остальных.

- если для подразделения должности нет заместителей, то проверяется наличие И.О. руководителя;

  > - если есть И.О., то ему и ставится работа по выбору ответственного;

- если у подразделения должности не найдено ни заместителей, ни И.О., то выполняется поиск руководителя подразделения;

  > - если руководитель нашелся - ему ставится работа по выбору ответственного.

- в случае, когда в подразделении не найдены ни заместители, ни И.О., ни руководитель, то все проверки повторяются на уровень выше, для родительского подразделения.

Альтернативные потоки событий:

- если на указанную должность не назначено ни одного пользователя, маршрут прерывается с комментарием: «Нет ни одного пользователя, назначенного на указанную должность»;
- если на должность назначен ровно один пользователь, то выбор исполнителя не запускается - в качестве исполнителя автоматически указывается этот пользователь, ему и создается работа;
- если для должности нет ни одного руководителя, заместителя или И.О. вплоть до корневого подразделения, маршрут прерывается с комментарием: «Нет ни одного руководителя для указанной должности».

#### Метод API

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

URL метода: `rest/api/workflow/work/set_responsibles`

Параметры:

- `workID` - `UUID` работы
- `responsibles` - массив UUID пользователей должности, которым будет назначена работа

#### Событие создания работы по выбору ответственного

При создании работы по выбору ответственного генерируется событие `event.workflow.choose.user.create`, параметрами которого являются код этапа маршрута реестра и `UUID` указанной в качестве ответственного должности.

#### Действия при обновлении

При обновлении Synergy с версии `hamming` на версию `minsky` все запущенные процессы по выбору ответственного будут перенесены из Ежедневника руководителя в его потоки работ.

#### Пример

В маршруте реестра был добавлен этап «Работа», где в качестве ответственного была выбрана должность “Менеджер по продажам”:

На эту должность назначено несколько сотрудников.

После отправки на активацию записи этого реестра выполняется поиск заместителя, И.О. или руководителя того подразделения, к которому относится эта должность - в нашем случае подразделения «Отдел продаж Астана» - и ему создается работа с формулировкой “Необходимо выбрать пользователя для выполнения работы”:

Для завершения работы нужно нажать на кнопку «Выбрать исполнителя». Откроется диалог выбора пользователей:

Пользователи здесь уже отфильтрованы согласно указанной должности.

Руководитель должен выбрать сотрудника для выполнения этапа маршрута и завершить свою работу, нажав на кнопку «Выбрать».

Доступен выбор нескольких сотрудников: в этом случае для них будут созданы параллельные работы.

Работа по выбору ответственного отображается и в ходе выполнения документа:

### Доработка внешних модулей

В новой версии Synergy мы доработали возможность настройки внешних модулей.

#### Назначение прав на внешний модуль с помощью групп пользователей

Ранее настройка доступа к внешнему модулю выполнялась в Административном приложении:

В новой версии мы реализовали назначение прав на внешний модуль в самом редакторе этого модуля в Synergy IDE:

При экспорте и импорте приложения Synergy IDE также будут перенесены и указанные во внешнем модуле группы пользователей.

##### Действия при обновлении

При обновлении системы в таблицу прав внешнего модуля будут добавлены служебные группы, соответствующие подразделениям и должностям организационной структуры, у которых был доступ к этому модулю.

Внимание

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

1. подразделению доступен внешний модуль, но у некоторых сотрудников этого подразделения доступ к модулю отключен;
2. подразделению в целом модуль недоступен, но некоторым сотрудникам этого подразделения был предоставлен доступ к нему.

#### Расширение возможности авторизации по ключам

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

Обновить ключ можно с помощью метода API `rest/api/person/update_auth_key_expire`.

При изменении данной настройки во внешнем модуле будет изменен период устаревания всех активных ключей этого модуля.

### Сравнение дробных чисел в фильтрах реестров

До версии 4.0 включительно сравнение чисел в фильтрах реестров выполнялось с отбрасыванием дробной части. Например, в фильтр с условием «число меньше или равно 3» попадают записи, в которых числовое поле равно `2.8`, `3.2`, `3.6`:

В новой версии мы исправили эту проблему. Теперь при проверке выполнения условия фильтра сравнение чисел выполняется корректно:

Фильтр «число меньше или равно 3» содержит только одну запись, где значение числового поля равно `2.8`:

### Импорт элементов в справочник

При разработке бизнес-приложений часто возникает потребность добавить в справочник большое количество элементов. Мы реализовали возможность импорта элементов справочника из файлов `xls`, `xlsx`, `csv`.

Кнопка импорта расположена в разделе «Элементы» редактора справочника:

#### Общее описание процесса импорта

##### Сопоставление импортированных элементов элементам справочника

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

После импорта файла выполняется проверка его структуры. Для того, чтобы строки файла были успешно сопоставлены элементам справочника, необходимо, чтобы значения ячеек первой строки совпадали с кодами столбцов справочника.

- Для каждой строки файла, начиная со второй, будет создан новый элемент справочника.
- Если для столбца файла не нашлось совпадения с кодом столбца справочника, этот столбец будет проигнорирован.
- Если в файле нет столбца с заголовком, совпадающим с кодом столбца справочника (с точностью до локали), то соответствующие поля для элементов справочника останутся пустыми.

На этом этапе могут возникнуть ошибки:

1. В выбранном файле нет ни одного столбца, заголовок которого соответствует коду столбца справочника. Импорт не выполняется, система отображает сообщение об ошибке с текстом:

   > Не удалось распознать содержимое файла. Заголовки столбцов в файле должны совпадать с кодами столбцов справочника.

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

   > Не удалось распознать содержимое файла. Файл содержит столбцы с дублирующимися заголовками.

##### Переводимые столбцы

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

В общем случае каждому переводимому столбцу справочника могут соответствовать несколько столбцов в файле с заголовками вида `<код_столбца>/<код_локали>`.

Случай 1: переводимому столбцу справочника соответствует один столбец в файле с заголовком `<код_столбца>`. В этом случае для каждого импортируемого элемента в каждой локали, в том числе в локали по умолчанию, будет указано одно и то же значение соответствующей строки файла.

Случай 2: переводимому столбцу справочника соответствует несколько столбцов в файле с заголовком `<код_столбца>/<код_локали>`. В этом случае в переводах каждого элемента будет указано соответствующее локали значение из столбца файла.

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

Если в заголовке столбца в файле указан несуществующий код локали, этот столбец будет проигнорирован.

##### Результат проверки

Если проверка структуры импортируемого файла завершилась успешно, то отображается диалог с примером элементов, которые будут добавлены в результате импорта:

На этом этапе можно оценить, насколько корректно был сформирован файл для импорта, и отменить импорт при необходимости. Непосредственно создание новых элементов справочника будет выполнено после нажатия на кнопку «Импортировать».

#### Пример

Предположим, нужно импортировать в справочник перечень городов Казахстана, причем названия городов должны быть указаны на трех языках.

Сначала настроим справочник «Города»:

Справочник содержит три поля:

- `code` - код элемента, поле будет служить ключом для справочника;
- `distr` - название области, переводимое поле;
- `city` - название города, переводимое поле.

Далее нужно заполнить файл, который будем импортировать:

Первой строкой в таблице указаны коды столбцов справочника, для переводимых столбцов через `/` указаны коды локалей.

Подсказка

Коды локалей настраиваются в Настройках платформы, раздел «Настройки системы» - “Региональные настройки” - “Языки”.

Локалью системы по умолчанию является та, которая указана в таблице первой:

Теперь импортируем созданный файл в справочник Synergy IDE:

Превью результатов импорта выглядит так:

В этом диалоге можно открыть переводы отдельного поля и проверить, как они были заполнены. Например, для города Акколь переводы выглядят таким образом:

Видно, что локали `ru` и `kk`, настроенные в файле, были заполнены соответствующими значениями. Для локалей `en` и `jp`, которые не были указаны в файле, был использован перевод из локали по умолчанию (локаль `ru`).

Выполним импорт элементов из файла:

Таким образом значительно упрощается задача импорта большого количества элементов в справочники Synergy.

## Особенности установки ARTA Synergy 4.1 minsky

### Процесс обновления

Перед установкой:

1. обязательно прописать hostname сервера (см. раздел «Переход к использованию Wildfly»):

   >     # echo "127.0.0.1    $(hostname)" >> /etc/hosts

2. при необходимости создать резервные копии конфигурационных файлов:

   > - `/etc/default/arta-synergy-jboss`
   > - `/opt/synergy/jboss/bin/standalone.conf`
   > - `/opt/synergy/jboss/standalone/configuration/standalone.xml`
   > - `/opt/synergy/jboss/standalone/configuration/standalone-full.xml`
   > - `/opt/synergy/jboss/standalone/deployments/Synergy.ear/META-INF/jboss-deployment-structure.xml`
   > - `/opt/synergy/utils/configs/nginx/synergy-base`
   > - `/opt/synergy/jboss/standalone/configuration/arta/esb/docIndex.xml`
   > - `/opt/synergy/jboss/standalone/configuration/arta/esb/fileIndex.xml`
   > - `/opt/synergy/jboss/standalone/configuration/arta/esb/formIndex.xml`
   > - `/opt/synergy/jboss/standalone/configuration/standalone-onesynergy.xml`
   > - `/opt/synergy/jboss/standalone/deployments/Synergy.ear/META-INF/application.xml`
   > - `/opt/synergy/jboss/standalone/configuration/arta/api-observation-configuration.xml`

3. сделать резервные копии баз данных и Хранилища

Во время установки: необходимо принять рекомендованные изменения конфигурационных файлов и решения по изменению/удалению пакетов Synergy:

    The following NEW packages will be installed:
      arta-synergy-webdav{a}
    The following packages will be upgraded:
      arta-synergy-deps-jackrabbit arta-synergy-esb{b} arta-synergy-jboss{b} arta-synergy-synergy{b} arta-synergy-utils
    5 packages upgraded, 1 newly installed, 0 to remove and 154 not upgraded.
    Need to get 847 MB of archives. After unpacking 282 MB will be used.
    The following packages have unmet dependencies:
     arta-synergy-jboss : Conflicts: arta-synergy-deps-mysqldriver (<= 5.1.42) but 5.1.42 is installed.
     arta-synergy-synergy : Conflicts: arta-synergy-jbpm but 3.11-r2 is installed.
     arta-synergy-esb : Conflicts: arta-synergy-indexator (<= 4.1-r1~181119.114741) but 4.0-r1~181030.182506 is installed.
    The following actions will resolve these dependencies:

         Remove the following packages:
    1)     arta-synergy-deps-mysqldriver
    2)     arta-synergy-indexator
    3)     arta-synergy-jbpm

    Accept this solution? [Y/n/q/?] y

    Configuration file `/etc/default/arta-synergy-jboss'
     ==> Modified (by you or by a script) since installation.
     ==> Package distributor has shipped an updated version.
       What would you like to do about it ?  Your options are:
        Y or I  : install the package maintainer's version
        N or O  : keep your currently-installed version
          D     : show the differences between the versions
          Z     : start a shell to examine the situation
     The default action is to keep your current version.
    *** arta-synergy-jboss (Y/I/N/O/D/Z) [default=N] ? y
    Installing new version of config file /etc/default/arta-synergy-jboss ...

    Configuration file `/opt/synergy/jboss/bin/standalone.conf'
     ==> Modified (by you or by a script) since installation.
     ==> Package distributor has shipped an updated version.
       What would you like to do about it ?  Your options are:
        Y or I  : install the package maintainer's version
        N or O  : keep your currently-installed version
          D     : show the differences between the versions
          Z     : start a shell to examine the situation
     The default action is to keep your current version.
    *** standalone.conf (Y/I/N/O/D/Z) [default=N] ? y
    Installing new version of config file /opt/synergy/jboss/bin/standalone.conf ...

    Configuration file `/opt/synergy/jboss/standalone/configuration/standalone.xml'
     ==> File on system created by you or by a script.
     ==> File also in package provided by package maintainer.
       What would you like to do about it ?  Your options are:
        Y or I  : install the package maintainer's version
        N or O  : keep your currently-installed version
          D     : show the differences between the versions
          Z     : start a shell to examine the situation
     The default action is to keep your current version.
    *** standalone.xml (Y/I/N/O/D/Z) [default=N] ? y
    Installing new version of config file /opt/synergy/jboss/standalone/configuration/standalone.xml ...

    Configuration file `/opt/synergy/jboss/standalone/configuration/standalone-full.xml'
    ==> Modified (by you or by a script) since installation.
     ==> Package distributor has shipped an updated version.
       What would you like to do about it ?  Your options are:
        Y or I  : install the package maintainer's version
        N or O  : keep your currently-installed version
          D     : show the differences between the versions
          Z     : start a shell to examine the situation
     The default action is to keep your current version.
    *** standalone-full.xml (Y/I/N/O/D/Z) [default=N] ? y

    Configuration file `/opt/synergy/jboss/standalone/deployments/Synergy.ear/META-INF/jboss-deployment-structure.xml'
     ==> Modified (by you or by a script) since installation.
     ==> Package distributor has shipped an updated version.
       What would you like to do about it ?  Your options are:
        Y or I  : install the package maintainer's version
        N or O  : keep your currently-installed version
          D     : show the differences between the versions
          Z     : start a shell to examine the situation
     The default action is to keep your current version.
    *** jboss-deployment-structure.xml (Y/I/N/O/D/Z) [default=N] ? y

### После обновления

1. Если используется хранилище Cassandra, проверить конфигурационный файл `/opt/synergy/jboss/standalone/deployments/Synergy.ear/META-INF/application.xml`, он должен содержать следующий блок:

   >     <module>
   >         <ejb>ArtaJCR.war</ejb>
   >     </module>

   а файл `/opt/synergy/jboss/standalone/deployments/Synergy.ear/META-INF/jboss-deployment-structure.xml` - блок

   >     <sub-deployment name="AiBean.jar">
   >         <dependencies>
   >             <module name="deployment.Synergy.ear.ArtaJCR.war"/>
   >         </dependencies>
   >     </sub-deployment>

2. Если используется индексатор Elasticsearch, включить его в нужных конфигурационных файлах в папке `/opt/synergy/jboss/standalone/configuration/arta/esb/`

3. Выполнить обновление БД в Административном приложении Synergy

4. Остановить `jboss` и выполнить утилиту для обновления индексов Lucene (см. раздел «Обновление Lucene»):

   >     # /opt/synergy/utils/lucene/upgrade-to-lucene-7.sh

   В случае успешного апгрейда индексов вывод команды будет таким:

   >     Reading paths from /opt/synergy/jboss/standalone/configuration/arta/luceneConfiguration.xml:
   >     /var/lib/synergy/documentIndex /var/lib/synergy/formIndex /var/lib/synergy/index
   >     ========================
   >     Upgrade /var/lib/synergy/documentIndex to:
   >     Lucene version 4.10.4... done.
   >     Lucene version 5.5.0... done.
   >     Lucene version 6.3.0... done.
   >     Lucene version 7.3.1... done.
   >     ========================
   >     Upgrade /var/lib/synergy/formIndex to:
   >     Lucene version 4.10.4... done.
   >     Lucene version 5.5.0... done.
   >     Lucene version 6.3.0... done.
   >     Lucene version 7.3.1... done.
   >     ========================
   >     Upgrade /var/lib/synergy/index to:
   >     Lucene version 4.10.4...done.
   >     Lucene version 5.5.0... done.
   >     Lucene version 6.3.0... done.
   >     Lucene version 7.3.1... done.
   >     ========================
   >     Upgrade to Lucene 7 went OK!

   > При возникновении ошибок при обновлении индексов нужно их удалить и выполнить переиндексацию. Подробное описание приведено в разделе «Обновление Lucene».

5. В конфигурационном файле nginx прописать строки вида:

       location /asforms {
           proxy_pass              http://127.0.0.1:8080/asforms;
       }

6. После повторного старта `arta-synergy-jboss` в Административном приложении переиндексировать формы, файлы и документы.

7. Проверить, что все дочерние `war` успешно задеплоены. Из-за перехода к использованию Wildfly возможно, что некоторые приложения не будут запущены:

   >     22:46:14,491 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 105) MSC000001: Failed to start service jboss.deployment.unit."itsm.war".component.java:global/ItsmStartupBean.START: org.jboss.msc.service.StartException in service jboss.deployment.unit."itsm.war".component.java:global/ItsmStartupBean.START: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
   >             at org.jboss.as.ee.component.ComponentStartService$1.run(ComponentStartService.java:57) [wildfly-ee-14.0.0.Final.jar:14.0.0.Final]
   >             at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [rt.jar:1.8.0_131]
   >             at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_131]
   >             at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
   >             at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
   >             at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
   >             at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
   >             at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_131]
   >             at org.jboss.threads.JBossThread.run(JBossThread.java:485)
   >     Caused by: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
   >             at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:163) [wildfly-ee-14.0.0.Final.jar:14.0.0.Final]
   >             at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:134) [wildfly-ee-14.0.0.Final.jar:14.0.0.Final]
   >             at org.jboss.as.ee.component.BasicComponent.createInstance(BasicComponent.java:88) [wildfly-ee-14.0.0.Final.jar:14.0.0.Final]
   >             at org.jboss.as.ejb3.component.singleton.SingletonComponent.getComponentInstance(SingletonComponent.java:127)
   >             at org.jboss.as.ejb3.component.singleton.SingletonComponent.start(SingletonComponent.java:141)
   >             at org.jboss.as.ee.component.ComponentStartService$1.run(ComponentStartService.java:54) [wildfly-ee-14.0.0.Final.jar:14.0.0.Final]
   >             ... 8 more
   >     Caused by: javax.ejb.EJBException: WFLYEJB0442: Unexpected Error
   >             at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:250)
   >             at org.jboss.as.ejb3.tx.CMTTxInterceptor.requiresNew(CMTTxInterceptor.java:388)
   >             at org.jboss.as.ejb3.tx.LifecycleCMTTxInterceptor.processInvocation(LifecycleCMTTxInterceptor.java:68)
   >             at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) [jboss-invocation-1.5.1.Final.jar:1.5.1.Final]
   >             at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
   >             at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) [jboss-invocation-1.5.1.Final.jar:1.5.1.Final]
   >             at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45) [wildfly-ee-14.0.0.Final.jar:14.0.0.Final]
   >             at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) [jboss-invocation-1.5.1.Final.jar:1.5.1.Final]
   >             at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:60) [jboss-invocation-1.5.1.Final.jar:1.5.1.Final]
   >             at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) [jboss-invocation-1.5.1.Final.jar:1.5.1.Final]
   >             at org.jboss.as.ejb3.component.singleton.StartupCountDownInterceptor.processInvocation(StartupCountDownInterceptor.java:25)
   >             at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) [jboss-invocation-1.5.1.Final.jar:1.5.1.Final]
   >             at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53) [jboss-invocation-1.5.1.Final.jar:1.5.1.Final]
   >             at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:161) [wildfly-ee-14.0.0.Final.jar:14.0.0.Final]
   >             ... 13 more
   >     Caused by: java.lang.NoSuchMethodError: kz.arta.itsm.rest.SettingsApi.readJsonResult(Ljava/net/HttpURLConnection;)Lorg/codehaus/jackson/JsonNode;
   >             at kz.arta.itsm.rest.SettingsApi.loadCalendar(SettingsApi.java:49)
   >             at kz.arta.itsm.bean.StartupBean.loadSettings(StartupBean.java:51)
   >             at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_131]
   >             at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [rt.jar:1.8.0_131]
   >             at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_131]
   >             at java.lang.reflect.Method.invoke(Method.java:498) [rt.jar:1.8.0_131]
   >             at org.jboss.as.ee.component.ManagedReferenceLifecycleMethodInterceptor.processInvocation(ManagedReferenceLifecycleMethodInterceptor.java:96) [wildfly-ee-14.0.0.Final.jar:14.0.0.Final]
   >             at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) [jboss-invocation-1.5.1.Final.jar:1.5.1.Final]
   >             at org.jboss.as.ee.component.AroundConstructInterceptorFactory$1.processInvocation(AroundConstructInterceptorFactory.java:28) [wildfly-ee-14.0.0.Final.jar:14.0.0.Final]
   >             at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) [jboss-invocation-1.5.1.Final.jar:1.5.1.Final]
   >             at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) [wildfly-ee-14.0.0.Final.jar:14.0.0.Final]
   >             at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) [jboss-invocation-1.5.1.Final.jar:1.5.1.Final]
   >             at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:237)
   >             ... 26 more

   > В случае возникновения такой проблемы обратитесь к рекомендациям по восстановлению работы внешних модулей (см. раздел «Переход к использованию WildFly»).

Read the Docs v: minsky

Versions
  latest
  minsky
  master

Downloads
  pdf
  docx
  htmlzip
  epub

On Read the Docs
  Project Home
  Builds

Free document hosting provided by Read the Docs.