Ниже представлен список изменений, с которыми вы можете ознакомится уже сейчас, активировав демоверсию ELMA365.
После 13. 12. 2023 все изменения станут доступны нашим клиентам в их активных компаниях. Обратите внимание, список может быть расширен после релиза.
Документооборот
1. TEAM-7115 В поставках SaaS Enterprise и On-premises Enterprise реализована возможность параллельного вызова функций в шаблоне, по которому генерируются документ. Для включения применяется фича-флаг enableConcurrencyTemplateMapper. Количество параллельных потоков устанавливается переменной окружения ELMA365_MAX_NUMBER_OF_WORKERS_TO_EXECUTE_FUNCTIONS. По умолчанию задано значение 5.
2. TEAM-12981 В разделе Администрирование > Файлы теперь можно указать определённые форматы файлов, которые будут доступны для загрузки в систему. Для добавления записи о разрешённом файле на странице указывается его формат и общепринятая сигнатура, которая идентифицирует тип файла.
3. TEAM-19839 Появилась возможность с помощью виджета Навигация по папкам указать папку иерархического справочника, в которую будет добавлен элемент, при его создании.
4. TEAM-20840 В настройках виджета Подпись приложения в качестве провайдера по умолчанию теперь можно указать провайдер, настроенный с помощью пользовательского модуля для подписания элементов.
5. TEAM-21224 В настройках нумератора приложения добавлена опция Присваивать номер при создании элемента. При её включении значение системного свойства Индекс используется в качестве нумератора и присваивается при открытии формы создания приложения.
6. TEAM-21873 Появилась возможность включить ограничение на изменение и добавление версии файла, прикрепленного к элементу приложения. Для этого в настройках виджета Версии файла нужно включить опцию Только для чтения.
7. TEAM-22163 В уведомлении об ошибке, возникающей при формировании файла формата .xlsx по шаблону, добавлено указание неверно сгенерированных ячейки и столбца.
8. TEAM-22614 Добавлена функция PasteImage. Она позволяет добавить изображение из контекста приложения или процесса в файл, генерируемый по шаблону.
Примеры использования:
- {PasteImage({$image})} — ширина и высота подставляются из исходного изображения;
- {PasteImage({$image}, 200)} — ширина 200 пикселей, автоматически заданная высота с сохранением пропорций изображения;
- {PasteImage({$image}, 200, 400)} — ширина 200 пикселей, высота 400;
- {PasteImage({$image}, auto, 400)} — автоматически заданная ширина с сохранением пропорций изображения, высота 400;
- {PasteImage({$image}, 200, 400, true)} — ширина 200, высота 400, изображение будет обрезано вместо масштабирования.
Отчёты
TEAM-20959 В отчётах теперь можно использовать поля приложений, которые не участвуют в поиске (не выбрана опция Поиск и сортировка). В самом отчете поиск по этим полям недоступен, за исключением колонки с агрегацией.
При создании связи между источниками данных по-прежнему можно использовать только те поля, для которых выбрана опция Поиск и сортировка.
Если у поля в приложении-источнике отменить опцию Поиск и сортировка, то:
- по колонке отчета, привязанной к полю, пропадает фильтрация;
- если поле использовалось для связи – появится ошибка при получении данных. Так же ошибка будет при попытке пересохранить отчет, в котором уже есть невалидные данные.
CRM
1. TEAM-22297 При постановке задачи CRM на пользователя добавлено отображение пересечений задачи с событиями в его календаре. Это позволит менеджеру по продажам легче планировать свои активности, не переходя дополнительно в интерфейс календаря.
2. TEAM-23333 В разделе Администрирование в подразделе Почта добавлена возможность управления допустимыми почтовыми сервисами. Таким образом, Администратор системы сможет разрешать пользователям подключать в раздел Почта только сервисы, отвечающие политике безопасности компании.
3. TEAM-23441 Добавлена возможность экспорта и импорта настроек cтадий прогрева.
4. TEAM-23819 Обновлен дизайн окна Обнаружено пересечение событий. В рамках редизайна:
- увеличено окно;
- добавлено отображение аватара пользователя;
- сделана группировку по дате;
- добавлено отображение данных о событии, когда календарь недоступен для пользователя.
API, SDK
1. TEAM-4153 Реализовано отслеживание событий сервера в сценарии на клиенте.
Для некоторых решений важно решить кейс обновления информации на странице пользователя в реальном времени. Сейчас приходится периодически обращаться к серверу за этими данными, а это может снизить общую скорость работы системы. Чтобы реагировать на актуальные изменения мы добавили возможность в сценариях клиента подписываться на определенные события элементов приложений.
Флаг enableSubscriptionOnEventsFromScript включает возможность использования функций подписания на события системы в TS SDK API. По умолчанию в редакции SaaS флаг выключен.
В данный момент можно подписаться на события элементов приложений: создание, обновление, удаление.
Подписка создается динамически сценарием на клиенте. Подписаться и отписаться от событий можно в любое время пока виджет существует. При уничтожении виджета (обычно при переходе на другие страницы), подписка автоматически уничтожается.
Например, можно подписаться на события создания новых заявок и обновлять отчет:
Код:
await System.events.subscribe().onAppItemCreate(Context.fields.zayavka.app, async (events) => {
const event = events[0];
const zayavka = await event.data.fetch();
// Тут обновляем данные отчета и перерисовываем графики
updateReportWithNew(zayavka);
})
.all();
2. TEAM-17757 Добавлена возможность обработки API запросов в модулях с частичным совпадением
Для построения более гибких модулей интеграции мы добавили в Методы API возможность перехватывать вложенные запросы по шаблону. Например, теперь можно указать путь для метода: files/* и в метод будут попадать все вложенные пути: files/1234, files/upload/small и т.д.
Такой метод можно удобно использовать из TSSDK с добавлением withFragment:
Вызов соответствует /files
Код:
Namespace.api.files.call({
method: 'GET',
})
Вызов соответствует files/upload/small
Код:
Namespace.api.files.withFragment("upload/small").call({
method: 'POST',
})
3. TEAM-20751 Реализована возможность строгой валидации значений полей. Добавили настройку Степень валидации для полей типа Номер телефона и Электронная почта с вариантами "Предупреждать о неверном значении" и "Запрещать неверные значения".
Для обратной совместимости для поля типа Номер телефона по умолчанию задано Предупреждать о неверном значении, а для поля типа Электронная почта -- Запрещать неверные значения.
4. TEAM-21870 Добавлена danger-опция для метода setPortalUserAsInternal()
Метод setPortalUserAsInternal конвертирует внешнего пользователя во внутреннего. Но настройки аутентификации для внутреннего и внешнего порталов могут сильно отличаться. Ранее для пользователей с подключенным OAuth этот метод всегда выдавал ошибку. Теперь добавлена опция _unsafe_ignore_oauth : bool. Использовать эту опцию нужно крайне осторожно, т.к. такой конвертированный пользователь сможет попасть в систему, только если настройки провайдера входа OAuth полностью совпадают для внешнего и внутреннего порталов.
5. TEAM-22357 Реализована возможность получать логотип из настроек портала в его заголовок.
Добавлен метод в объект портала: Namespace.portal.getSettings(), который предоставляет доступ к настройкам брендирования портала. Например: logoImg = await settings.branding.logo.getDownloadUrl();
6. TEAM-19189 Добавлены методы Web API для создания пакета файлов, получения ссылок на скачивание и изменение. Если обработка запроса прошла без ошибок, в ответе вы увидите код 200. Если хотя бы в один файл вернулся с ошибкой, будет получен код ответа 422.
- Массовая загрузка файлов из ссылок. Выполняет загрузку N-количества файлов на временное хранение по внешним ссылкам для скачивания файлов.
Код:
method: POST
path: /pub/v1/disk/uploads/from-link
Входные данные:
Код:
{
downloadLinks: string[], // ссылки на загрузку файлов
}
Ответ :
Код:
{
items: {
hash: string, // идентификатор тела файла
error: string, // если произошла ошибка, будет указан ее текст, идентификатора в данном случае не будет
}[], // идентификаторы загруженных тел файлов
}
Пример запроса:
Код:
POST {host}/pub/v1/disk/uploads/from-link
Content-Type: application/json
{
"downloadLinks": ["https://hosting.example/image.png", "https://hosting.example/imageOther.png"]
}
- Массовое получение ссылок на загрузку файлов по их идентификаторам в хранилище. В запросе принимает список идентификаторов тел файлов. В ответе — список элементов, содержащих идентификатор файла, сгенерированную ссылку или текст ошибки, возникшей при генерации. Порядок структур в ответе соответствует порядку идентификаторов в запросе.
Код:
method: POST
path: /pub/v1/disk/links/upload
Входные данные:
Код:
{
hashesList: string[], // идентификаторы загруженных тел файлов
}
Ответ:
Код:
{
items: {
hash: string, // идентификатор тела файла
link: string, // ссылка для upload файла
error: string // ошибка произошедшая в процессе генерации, если есть ошибка, ссылки не будет
}[], // ссылки на загрузку файлов
}
Пример запроса:
Код:
POST {host}/pub/v1/disk/links/upload
Content-Type: application/json
{
"hashesList": ["ef15ff99-763f-4337-be9b-632af8a26e9d","5c018be7-6590-4d3a-9864-bc7f96cfe682"]
}
- Массовое получение ссылок на скачивание файлов по их идентификаторам в хранилище. В запросе принимает список идентификаторов тел файлов. В ответе — список элементов, содержащих идентификатор файла, сгенерированную ссылку или текст ошибки, возникшей при генерации. Порядок структур в ответе соответствует порядку идентификаторов в запросе.
Код:
method: POST
path: /pub/v1/disk/links/download
Входные данные:
Код:
{
hashesList: string[], // идентификаторы загруженных тел файлов
}
Ответ:
Код:
{
items: {
hash: string, // идентификатор тела
link: string, // ссылка на download файла
error: string // ошибка, которая может произойти в результате генерации, например - недостаточно прав, если указана ошибка - ссылки нет
}[], // ссылки на загрузку файлов
}
Пример запроса:
Код:
POST {host}/pub/v1/disk/links/download
Content-Type: application/json
{
"hashesList": ["ef15ff99-763f-4337-be9b-632af8a26e9d", "5c018be7-6590-4d3a-9864-bc7f96cfe682"]
}
- Массовая инициализация файлов из идентификаторов тел. Необходима для завершения массовых операций по генерации ссылок для загрузки или загрузки файлов по ссылке. На вход принимает список данных для создания файла. Данные должны содержать идентификатор тела файла, его имя и идентификатор директории, куда он будет сохранен. В ответ посылает список структур, содержащих результирующий файл или описание ошибки. Порядок структур в ответе соответствует порядку файлов в запросе.
Код:
method: `POST`
path: `/pub/v1/disk/files`
Входные данные:
Код:
{
files: {
name: string, // имя файла
directory: uuid, // идентификатор, куда будет загружен файл
hash: uuid, // идентификатор тела
comment: string | undefined, // комментарий указываемый при создании файла
}[], // данные для создания файлов
}
Ответ:
Код:
{
items: {
file: File, // модель файла
error: string // ошибка, которая может произойти в результате выполнения операции
}[], // ссылки на загрузку файлов
}
Пример запроса:
Код:
POST {host}/pub/v1/disk/files
Content-Type: application/json
{
“files”: [ { “name”: “file_name.txt”, “directory”: “3275f155-a705-43be-acf4-f9a325ca2a46”, "hash: “55a87462-9420-477b-b6f6- d09375d8e1e2”, “comment”: “некоторый файл для примера” }]
}
- Массовое удаление файлов и перемещение их в корзину. Выполняется при наличии прав. Если при удалении произошла ошибка, она будет указана в ответе. На вход принимает список идентификаторов файлов. В ответ посылает список структур, содержащих результирующий идентификатор файла или описание ошибки. Порядок структур в ответе соответствует порядку Идентификаторов Файлов в запросе.
Код:
method: PATCH
path: /pub/v1/disk/files/deleted
Входные данные:
Код:
{
fileIds: string[], // идентификаторы загруженных тел файлов
}
Ответ:
Код:
{
items: {
id: string, // идентификатор файла
error: string, // если произошла ошибка, будет указан ее текст, идентификатора в данном случае не будет
}[], // идентификаторы удаленных файлов
}
Пример запроса
Код:
PATCH {host}/pub/v1/disk/files/deleted Content-Type: application/json { “fileIds”: [“728a4077-c9f4-48f6-849b-68951556914a”, “0c0dd437-223c-4c94-8504-26fee0ee859b”] }
Примечание. Если все элементы в ответе без ошибок код ответа должен быть 200. Если хотя бы в один вернулся с ошибкой, код 422
Виджеты
1. TEAM-13824 Добавлено поле Код свойства в настройки виджета Строка формы.
2. TEAM-15337 Для пользовательских виджетов добавлена возможность задать HTML-стили по умолчанию.
В конструкторе виджета в хлебных крошках можно выбрать корневой элемент, зайти в его настройки и задать значения по умолчанию. В том числе HTML стили. Может быть полезно например для того, чтобы растягивать виджет на всю ширину экрана.
3. TEAM-21216 Полностью отключен переход в мобильный режим интерфейса в браузерах.
Теперь для десктопного приложения или браузера в десктопе работет десктопный режим. При этом устанавливается минимальная ширина. То есть при попытке сузить браузер ниже минимального размера появится горизонтальный скролл.
В мобильном приложении или мобильном браузере по умолчанию включается мобильный режим. Перейти в режим отобржаения десктопа на мобильном устройстве можно, включив в настройках браузера Версия для ПК.
Для планшетов отображение зависит от ориентации.
4. TEAM-21440 Добавлена возможность создать виджет для тулбара.
В конструкторе виджета на вкладке настройки добавлена опция Отображать виджет в заголовке с кнопками в формах. При ее включении виджет можно будет поместить в заголовок с кнопками в формах (приложений, процессов).
5. TEAM-18043 Внесены изменения в настройки виджетов:
- для виджета Кнопка: Настройка Событие по нажатию переименована в Выполняемый сценарий и теперь доступна при выборе типа действия Сценарий.
- для виджета Выпадающее окно: Параметры HTML стили/классы перенесены из вкладки Основные в Системные.
6. TEAM-20272 В виджете Связанные элементы теперь можно настраивать ширину колонок с помощью метода drag-n-drop. Настроенная ширина сохранится для всех форм приложения.
EQL
TEAM-23311 В EQL добавлена поддержка функции относительных дат. Примеры использования:
[__createdAt] = RelativeDatetime('-1m', '-1m') -- за прошлый месяц
[__createdAt] IN RelativeDatetime('0d', '0d') -- за текущий день
Проекты
1. TEAM-21306 Реализована возможность добавления подзадач в режиме редактирования календарного плана проекта.
В пункты плана с типом Задача добавлена возможность добавлять вложенные задачи и процесс. В контекстном меню задачи добавлен пункт Добавить задачу и Добавить процесс.
В верхней панели над списком задач изменен контрол +Задача. Теперь справа от кнопки есть раскрывающееся меню с выбором типа задачи. Таким образом задача нужного типа создается сразу, без необходимости выбора типа задачи на форме.
2. TEAM-23012 В приложении Элемент плана проекта добавлено новое значение Отправить на контроль в атрибут Контроль. Это обновление позволяет более гибко настраивать контроль за выполнением проектных задач в бизнес-процессах.
Пользователи
TEAM-4337 В разделе Системные справочники добавлено приложение Сотрудники. Оно позволяет хранить список сотрудников компании и сопоставлять их с пользователями системы. Элементы приложения создаются автоматически в следующих случаях:
- при приглашении пользователя через раздел Администрирование;
- при авторизации пользователя через OAuth/SAML, если в этих модулях включена опция создания пользователя при авторизации;
- при импорте пользователей из AD/LDAP, если в модуле включена опция Автосоздание сотрудника.
Авторизация
1. TEAM-17357 Реализована поддержка alias для oauth редиректов. На стороне провайдера авторизации нужно указать два Redirect URI: без алиаса и с алиасом.
При таких настройках, пользователи смогут входить в ELMA365 через oauth и по адресу компании по умолчанию и по адресу с алиасом
2. TEAM-22689 Сквозная авторизация OAuth2.
В блоке Внешние провайдеры аутентификации, в настройке Способ аутентификации по умолчанию появилась опция Сквозная авторизация. Опция доступна, если выполнены оба условия:
- включена только опция Разрешить OAuth2 аутентификацию или только Разрешить SAML аутентификацию
- добавлен только один провайдер
Если выбрана опция Сквозная авторизация, при переходе на страницу авторизации в ELMA365 пользователь будет автоматически перенаправлен в провайдер авторизации.
Обновление разделов
TEAM-22658 При мягком обновлении частично заблокированного решения игнорируются зависимости разблокированного раздела от заблокированного. Т.е. при мягком обновлении такого решения:
- НЕ обновляются структуры из разблокированного раздела, если для них найдены конфликты или зависимости от других структур
- обновляются структуры из заблокированного раздела, если для них найдены зависимости от разблокированного раздела
- обновляются структуры из заблокированного раздела, если для структур из разблокированного раздела найдены зависимости от заблокированного раздела
- НЕ обновляются структуры из заблокированного раздела, если для них найдены конфликты или зависимости от заблокированного раздела