Всем доброго времени суток! Столкнулись со следующей проблемой. Создаем шаблон Email, при сохранении выдает - https://prnt.sc/httbxf.

Картинки сжали по максимуму. Как можно увеличить порог загружаемого шаблона?

Поправка, бьет данную ошибку при отправке. Отправка через раздел Email. Интеграция с сервисом UniOne.

Заранее благодарю!

Нравится

1 комментарий

Алексей, добрый день!

По умолчанию в приложении максимальный размер шаблона – 1,5 Мб. Для изменения необходимо заместить схему CESMaillingProvider. Заместить схему CESMaillingProvider стандартным способом при помощи замещения родительской схемы нельзя. Для замещения CESMaillingProvider необходимо создать свой класс, в котором скопировать весь код из CESMaillingProvider. В кастомном классе уже изменить реализацию метода ValidateTemplateSize, в котором вместо MailingMaxTemplateSize указать свой размер. После этого необходимо в таблице SysMalingProvider изменить значение ClassName для Cloud Email Service на название кастомного класса.

Показать все комментарии

Нужно создать раздел писем.

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

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

Нравится

4 комментария

Здравствуйте, Виталий

Може более подробно описать что Вы имеете ввиду и какая стоит перед Вами бизнес задача?

Denys Diachenko, решил. 

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

changeSelectedSideBarMenu: function() {

                    var moduleConfig = this.getModuleStructure();

                    if (moduleConfig) {

                        var config = "SectionModuleV2/UsrCorrespondenceSectionV2/";

                        this.sandbox.publish("SelectedSideBarItemChanged", config, ["sectionMenuModule"]);

                    }

                }

Радчук Виталий Владимирович,

Попробуйте создать раздел на основе объекта представления, наследующего структуру объекта Активности.

Сам сейчас работаю над этой задачей.

Можем решить совместными усилиями.

Радчук Виталий Владимирович пишет:

так:changeSelectedSideBarMenu

А в какой схеме вы переопределяете этот метод?

 

Показать все комментарии

Все пользователи системы создаются через раздел контакты.

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

Однако при выборе ответственного неактивный сотрудник (уволенный) все равно отображается.

Удалять пользователей из системы нельзя, чтобы сохранить историю. 

Как отфильтровывать значения в поле ответственный только по активным пользователям? 

Спасибо

Нравится

4 комментария

Чтобы при выборе ответственного отображались только неуволенные сотрудники, нужно добавить бизнес-правило на странице.

Здравствуйте, Екатерина!

Данный кейс можно реализовать с помощью бизнес-правил. Более детально Вы можете ознакомиться в статье: https://academy.terrasoft.ru/documents/studio/7-11/nastroyka-biznes-pra…

А глобально нельзя изменить это бизнес-правило? Так как отфильтровывать хочется во всех страницах

Здравствуйте, Екатерина 

Данный вопрос можно решить добавлением атрибута к Вашему поля, типа

attributes: {

            /**

            * Current user contact.

            */

            "ContLOOKUP": {

                lookupListConfig: {

                    filter: function() {

                        var filterGroup = this.Terrasoft.createFilterGroup();

                        var notExistsFilter = this.Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[SysAdminUnit:Contact].Active", 1);

                        filterGroup.addItem(notExistsFilter);

                        return filterGroup;

                    }

                }

            }

        },



где "ContLOOKUP" Ваше кастомное поле в схеме "...PageV2" пакета "Custom"

Показать все комментарии

Добрый день!

Создал кастомную страницу в разделе Активности, добавил деталь Файлы и ссылки активности. В данный момент в данной детали нет возможности настроить колонки и отсортировать файлы (например, по дате создания).

Можно ли как-то добавить доп. колонки к данной детали и настроить сортировку файлов?

Нравится

3 комментария

Попробуйте переопределить метод getGridDataColumns

 

getGridDataColumns: function () {
                var config = this.callParent(arguments);
 
                config["Название колонки"] = {
                    path: "Название колонки",
                    orderPosition: 1,
                    orderDirection: this.Terrasoft.OrderDirection.ASC
                };
 
 
                return config;
            },

 

Здравствуйте!

На Академии присутствует детальная инструкция: https://academy.terrasoft.ru/documents/technic-sdk/7-11/otobrazhenie-dopolnitelnyh-kolonok-na-detali-fayly-i-ssylki

Проводили данный опыт давным-давно.

Все что вам необходимо это добавить данный метод

getGridSettingsMenuItem: function() {
	return this.getButtonMenuItem({
		Caption: "Настройка колонок",
		Click: {"bindTo": "openGridSettings"}
	});
}

Таким образом вы сможете получить доступ к стандартной настройке колонок в этой детали)

Сортировка настраивается в методе:

getGridDataColumns: function() {
	return {
		"Id": {path: "Id"},
		"SysAdminUnit": {path: "SysAdminUnit"},
		"SysAdminUnit.SysAdminUnitTypeValue": {path: "SysAdminUnit.SysAdminUnitTypeValue"},
		"Name": {path: "KmName", orderPosition: 1, orderDirection: Terrasoft.OrderDirection.DESC}
	};
}

Кстати у выше упомянутой статьи странно, но уровень сложности очень высокий, хотя кастомизация ну если не типовая, то тривиальная.

Показать все комментарии

Всем доброго времени суток.

Версия 7.11.

На клиенте можно открыть любую страницу (допустим, по клику на кнопку), зная её ссылку. Для этого в обработчик клика добавляем:

var hash = /**путь до страницы**/;
this.sandbox.publish("PushHistoryState", {hash: hash});

Вопрос такой - а как это сделать внутри задания-сценария бизнес-процесса? Просто открыть для текущего пользователя некую страницу, зная её ссылку, перенаправить его.

В мастере БП есть стандартные элементы "Открыть страницу редактирования" и "Преднастроенная страница", но интересует страница раздела Обращений CaseSection - её нет в списке допустимых для открытия преднастроенных, и к тому же там идёт перенаправление по ссылке странного вида: ProcessCardModuleV2, а нужно просто #SectionModuleV2/CaseSection/

Хотелось бы получить скрипт для любой ссылки. Спасибо.

Нравится

7 комментариев

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

Альмухаметов Булат

добрый вечер, спасибо за идею.

Не подскажете, как правильно отправить сообщение из БП? Пробую вот по этой инструкции: https://academy.terrasoft.ru/documents/technic-sdk/7-11/clientmessagebr… компилятор ругается на MsgChannelUtilities в задании-сценарии. Что ещё нужно подключить?

Нашёл. Отправляю таким способом:

 

// Публикация сообщения по WebSocket.
var userConnection = Get<UserConnection>("UserConnection");
Terrasoft.Configuration.MsgChannelUtilities.PostMessage(userConnection, "OpenCaseSection", "messageText");
return true;

В переопределённом ClientMessageBridge  на клиенте соответственно доработал метод:

onMessageReceived: function(scope, response) {
					this.callParent(arguments);
					if (response.Header.Sender == "OpenCaseSection"){
						console.log(response);
						this.sandbox.publish("PushHistoryState", {hash: "SectionModuleV2/CaseSection/"});
					}
				},

Но теперь проблема при перенаправлении: i {message: "Message PushHistoryState is not defined in BaseSch…aModuleV2 (ViewModule_clientMessageBridge) module"}

Соответственно, вопрос - где именно происходит подписка на PushHistoryState, и как выглядит обработчик?

Смородинов Денис,

думаю, нужно добавить сообщение

"PushHistoryState": {
					mode: this.Terrasoft.MessageMode.BROADCAST,
					direction: this.Terrasoft.MessageDirectionType.PUBLISH
				},

 

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

Альмухаметов Булат,

спасибо, так работает.

Показать все комментарии

Как на детали "Связи" в объекте активности убрать поля: заказы, проект, документы, так как эти объекты не используются в системе?

Изображение удалено.

 

Заранее спасибо.

Нравится

2 комментария

Здравствуйте, Екатерина!

 

Базовыми средствами внести данные изменения не получится. Необходимо выполнить замещение базовой схемы EntityConnectionsDetailV2

Подобная проблема уже рассматривалась ранее Вы можете ознакомиться с решением тут - https://community.terrasoft.ru/questions/kak-ubrat-ne-nuznoe-pole-v-rod…

Для проделывания данной операции хватит всего лишь удалить соответствующие записи из таблицы EntityConnection. Соотношение идёт в ней вроде по Id (или UId) объекта - Id (или UId) колонки.

Показать все комментарии

Коллеги, Добрый день.

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

Как это можно сделать?

 

Нравится

1 комментарий

Здравствуйте, Екатерина!

 

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

 

Более подробно можно прочитать на академии Террасофт - https://academy.terrasoft.ru/documents/studio/7-11/nastroyka-spiska-rab…

Показать все комментарии

Добрый день!

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

Нравится

5 комментариев

Во встроенном процессе объекта. В дизайнере объекта нажмите Дополнительно -> открыть процесс. Исходный код будет храниться в метаданных объекта в экранированном виде, там можно смотреть все изменения из SVN.

Альмухаметов Булат,

у меня возникла проблема, может Вы мне сможете помочь?

Есть сторонний пакет, он закрыт для изменений. В нем в объект добавлен обработчик при добавлении записи, и он работает некорректно. Сам объект я изменить не могу, а если создать замещающий, то методы родительского выполнятся всё равно. Не подскажете, есть ли решение?

Добрый день. В замещающем объекте вы можете переопределить методы родителя и не вызывать базовую реализацию.

Кот Владимир Владимирович,

А подскажите, пожалуйста, каким образом я могу переопределить методы родителя в сущности типа "объект"?

В "Дополнительно -> Открыть процесс" я могу увидеть родительские методы, но не имею понятия как их переопределить.

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

base.TryProcessComplete(changeType);

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

Показать все комментарии

Добрый день! Проблема с сервисом DataService. В процессе разработки была произведена небольшая интеграция с сайтом клиента, однако в процессе переноса на боевую среду (в облаке) возникла ошибка следующего вида: невозможно выполнить какой-либо запрос (напр. SelectQuery):

Возвращается код ошибки 403 и ответ вида: 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>403 - Forbidden: Access is denied.</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;}
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;}
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;}
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id="header"><h1>Server Error</h1></div>
<div id="content">
 <div class="content-container"><fieldset>
  <h2>403 - Forbidden: Access is denied.</h2>
  <h3>You do not have permission to view this directory or page using the credentials that you supplied.</h3>
 </fieldset></div>
</div>
</body>
</html>

ЕМНИП, необходимо при начале работы с сервисом отключить CSRF-проверку подлинности. Не подскажете, в чём может быть проблема? Спасибо. 

Нравится

1 комментарий

Здравствуйте, Иван

Данное поведение возникло в следствие некорректного отключения защиты от CSRF-атак.

Ошибку исправили на Вашем сайте и временно отключили защиту от CSRF-атак. Прошу обновить страницу с очисткой кеша.

Также напоминаю, что при следующем обновлении сайта, защита от CSRF-атак будет включена автоматически и для корректной работы Вашей интеграции в последующем Вам необходимо доработать Вашу интеграцию по инструкции https://academy.terrasoft.ru/documents/technic-sdk/7-11/zashchita-ot-cs…

Показать все комментарии

Всем доброго времени суток. Версия 7.11.

Создал два процесса. В обоих просто задание-сценарий, запуск по пустому сигналу. Код внутри первого:

var userConnection = Get<UserConnection>("UserConnection");
 
string processName = "UsrLogNowDate";
string jobName = processName + "Job";
string jobGroupName = jobName + "Group";
 
int startOffset = 80; // 80 секунд
AppScheduler.RemoveJob(jobName, jobGroupName);
var job = AppScheduler.CreateProcessJob(jobName, jobGroupName, processName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(jobName + "Trigger", jobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
 
return true;

В Usings соответственно добавлены: 

Quartz.Impl

Quartz

Quartz.Impl.Triggers

Terrasoft.Core.Scheduler

UsrLogNowDate - это второй процесс, представляет собой простое логирование текущей даты в справочник UsrTriggersLog. Код второго:

var userConnection = Get<UserConnection>("UserConnection");
new Insert(userConnection).Into("UsrTriggersLog").Set("Name", Column.Parameter(DateTime.Now.ToString())).Set("Description", Column.Parameter("Записано автоматически.")).Execute();
return true;

Оба процесса компилируются без ошибок, второй при запуске по кнопке нормально логирует требуемую запись.

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

Где ошибка? Как правильно запускать такие процессы в 7.11?

Нравится

1 комментарий

Добрый день!



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

Показать все комментарии