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

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

 

Меняю доступность поля так:
 

generateActiveRowControlsConfig: function(id, columnsConfig, rowConfig) {
    this.columnsConfig = columnsConfig;
    var gridLayoutItems = [];
    var currentColumnIndex = 0;
    this.Terrasoft.each(columnsConfig, function(columnConfig) {
        var cellConfig = this.getActiveRowCellConfig(columnConfig, currentColumnIndex);
        var columnName = columnConfig.key[0].name.bindTo;
        if (columnName === "UsrOwner") {
            cellConfig.enabled = this.$IsOwner && this.$IsNewStage; // Это атрибуты, проставляются с помощью сообщения с карточки
        }
        if (!cellConfig.hasOwnProperty("isNotFound")) {
            gridLayoutItems.push(cellConfig);
        }
        currentColumnIndex += cellConfig.layout.colSpan;
    }, this);
    this.applyBusinessRulesForActiveRow(id, gridLayoutItems);
    var viewGenerator = this.Ext.create(this.getRowViewGeneratorClassName());
    viewGenerator.viewModelClass = this;
    var gridLayoutConfig = viewGenerator.generateGridLayout({
        name: this.name,
        items: gridLayoutItems
    });
    rowConfig.push(gridLayoutConfig);
}

В строку "cellConfig.enabled = ..." нужно дописать условие, для этого нужно взять информация с записи детали. Как это можно сделать?

Нравится

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

Добрый вечер.

 

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

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

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

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

 

Коллеги из террасофт обещали с этим разобраться, но воз и ныне там. Если что обращение SR-0978724

Кажется я нашел, как боролся с данным багом.

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

 

            getGridDataColumns: function() {
                var baseGridDataColumns = this.callParent(arguments);
                var gridDataColumns = {
                    "UsrParent.Owner": {path: "UsrParent.Owner"},
                };
                return Ext.apply(baseGridDataColumns, gridDataColumns);
            },

 

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

Как на карточку добавить форматированный текст.

 

Нужна возможность изменять стили шрифта, добавление маркеров. 

 

Нравится

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

Евгений добрый день!

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

Для этого, полю на странице ОбъектPageV2 необходимо добавить свойство "contentType": Terrasoft.ContentType.RICH_TEXT.
Привожу пример:

"operation": "insert",
                "name": "STRINGbaebcf1f-19a9-4e0c-ad77-168823fbe505",
                "values": {
                    "contentType": Terrasoft.ContentType.RICH_TEXT,
                    "layout": {
                        "colSpan": 24,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 6,
                        "layoutName": "ProfileContainer"
                    },
                    "bindTo": "String1",
                    "enabled": true
                },
                "parentName": "ProfileContainer",
                "propertyName": "items",
                "index": 6

Дима Вовченко,

А в базовом функционале где то есть пример?

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

Как можно обойти ограничение в 5000 записей при чтении коллекции в процессе?

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

Нравится

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

Kalymbet Anastasia,

а как действовать в таких случаях, когда надо обработать более 5000 записей?

Владимир, добрый день!
 

 

Описанное вами поведение является корректным для базовой логики. Дело в том, что вычитка коллекции записей больше 5000 чрезмерно влияет на производительности, по этому на уровне приложения установлено ограничения по количеству одновременной обработки записей в элементе "Читать данные" в размере 5000. Больше указанного значение в настройки установить нет возможности и об этом говорит уведомление в ходе настройки процесса. 

Можно же придумать в базовой логике обрабатывать "пачками" по 5000. И быстродействие не пострадает, и лимит искусственный будет не нужен

Владимир Соколов,

В данный момент это выполнить невозможно по указанным причинам. 

Существует пожелание на увеличение данного значения. Я добавлю Ваше обращение для повышения приоритета и реализации в будущих версиях.

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

Привет, комьюнити,

Может кто-то сталкивался с похожей проблемой. В разделе Requests на стадии Completed 2 обязательных поля (прописаны бизнес правилами). Кликаю на стадию Completed, система выдает информационное сообщение о необходимости заполнить поля. Первое поле типа Справочник(контакт) , второе Дата. Открываю справочник, нажимаю кнопку добавить новый контакт. Происходит редирект на страницу контакта, заполняю информацию, сохраняю. Система перекидывет назад на форму заявки, но подсвечивает уже предыдущий статус, а не completed. Но если сохранить изменения, то сохраняет в статусе Completed. В чем может быть проблема? 

Нравится

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

Добрый день!

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

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

 

В вашем примере в момент создания контакта стадия не была сохранена (так как условие не было выполнено), именно при этом после сохранения записи контакта, приложение возвращает назад на предыдущую стадию. 

 

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

 

Также детальнее с выполнением кейсов и бизнес-правил Вы можете ознакомится на Академии:

https://academy.terrasoft.ru/docs/7-17/user/biznes_processy/nastrojka_d…

 

https://academy.terrasoft.ru/docs/user/kastomizacija_no_code/nastrojka_…

 

 

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

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

Воспользовался статьей Академии для показывания на странице редактирования (Page) обычной кнопки в контейнере ActionsMenuButton. Кнопка должна отображаться или скрываться по условию, по полю из схемы объекта, это условие проверяется при загрузке страницы. 

 

В коде страницы был создан Атрибут:

 

Метод:

Кнопка:

После этого кнопка стала активной не при первом открытии записи, а  после обновления этой страницы в браузере по F5.

При отладке атрибут undefined. Испытано несколько способов, включая лукапный атрибут из примера с запросом esq. Теперь появилось значение в атрибуте в методе init, но при заходе отладчика в метод что включает активность кнопки условие правильно возвращает true, однако кнопка активной не становится.

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

 

Вопросы:

1. есть ли способ сразу получить значение атрибута в init , не привязывая к нему инициализирующий его метод который содержит esq запрос к базе ? Дело в том что запрос выполняется синхронно с загрузкой страницы.

2. как можно проверить отправку получение сообщения sandbox в браузере?

3. Верно ли что если я напишу в каком-нибудь методе this.set("АтрибутАктивностиКнопки") то привязанная к этому атрибуту активность кнопки поменяется сразу? Визуально. То есть кнопка заблокируется / станет серой ? 

Нравится

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

Посмотрите пример теме  по ссылке, я там писал в комментариях в чем проблема, в том примере проверка видимости была у "действия", а у вас на кнопке, смысл такой же. https://community.terrasoft.ru/questions/dinamecheskaoe-izmenenie-aktiv…

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

Добрый день!

На вновь установленной on-site версии 7.16.2 Sales (PostgreSQL) отсутствует функционал поиска и объединения дублей. На ранее установленной on-site версии 7.14.0 Bank Customer Journey (MSSQL)  данный фунционал присутствовал сразу, без установки дополнительных программ.
Подскажите, нужно ли делать установки, описанные в статье  https://academy.terrasoft.ru/docs/user/razvertyvanie_onsite/nastrojka_konteinernikh_komponentov/massovyj_poisk_dublej/nastroit_massovyy_poisk_dubley , либо функционал поиска и объединения дублей можно добавить стандартными настройками системы (если да, просьба написать какими) 

Нравится

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

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

 

На MsSql поиск дублей (для разделов контрагенты, контакты и лиды) работал без микросервиса, т.к. происходил через процедуры внутри базы, для PostgreSQL этих процедур к сожалению нет.

Трефилов Павел Сергеевич,

Спасибо за информацию!

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

Есть кейс, на первой стадии пользователю надо заполнить несколько полей, для полей созданы бизнес-правила по типу Если Стадия = Стадия 1, то Поле 1 обязательно к заполнению. Если не заполнить поле и попробовать сохранить кейс - правило сработает, покажет ошибку и не позволит сохранить кейс. Но пользователь может просто нажать на следующую стадию, тогда появится ошибка о незполненном поле, но кейс всё равно перейдёт на вторую стадию и будет сохранён.

Задача в том, чтобы не позволять так обходить требование заполнять поля. Пока вижу это так: в момент перехода по стадиям (может, в методе OnSaved) проверять заполнены ли поля, и если не заполнены - не позволять менять стадию.

Какой лучший(или рекомендуемый) способ выполнения этой задачи ? Описанный вариант с методом OnSaved подойдёт ?

Нравится

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

Мы делаем немного по-другому - даём менять стадию, но не даём сохранить, пока все поля не будут заполнены

Для этого:

  • создать атрибуты для обязательности полей
  • использовать в бизнес-правилах сравнение не поля Стадия, а атрибутов
  • создать метод вычисления атрибутов в зависимости от стадии
  • в onDiscardChangesClick (если пользователь нажмёт Cancel) снова вызываем метод обновления атрибутов
Показать все комментарии

Добрый день, коллеги!

 

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

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

 

Если это возможно, прошу рассказать, как это реализовать

Спасибо!

Нравится

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

Павел, здравствуйте!

Выполнение фоновых процессов можно вынести в RabbitMQ (7.17.0 и выше), в таком случае не придётся увеличивать maxthreadcount и, как следствие, нагрузка на приложение снизится.

Инструкция:
1. Развернуть сервер RabbitMQ версии 3.8.0 или выше на своем сервере:
Для режима разработки: В docker (сразу с vhost): 
docker run -d --name some-rabbit -e RABBITMQ_DEFAULT_VHOST=VirtualHostName -p 15672:15672 -p 5672:5672 rabbitmq:3-management

2. Создать виртуальный хост:  https://www.rabbitmq.com/vhosts.html
Например, так:
curl -u guest:guest -X PUT http://host:15672/api/vhosts/VirtualHostName

3. Настроить ConnectionStrings.config
<add name="messageBroker" connectionString="amqp://guest:guest@host:5672/VirtualHostName" />, где VirtualHostName - название virtual host, созданного в п.2.

4. Изменить настройки в /Terrasoft.WebApp/Web.config (net framework), Terrasoft.WebHost.dll.config (net core)

 

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

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

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

Нравится

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

Добрый день, Евгений!

Эта таблица используется для хранения необходимой метаинформации для синхронизации Exchange календарей, задач и контактов. При очистке этой таблице может возникнуть проблема со синхронизацией писем (будут дублироваться записи в Exchange), по этому мы не рекомендуем удалять записи из таблицы SysSyncMetaData. 

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

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

Добрый день!
Потребовалось отловить запрос через fiddler который уходит с серверной стороны сайта.
Что пробовал
Базовые настройки в гайдах фидлера которые пробовали:
1) прописать в Terrasoft.WebApp\Web.config прокси
2) прописать в machine.config прокси
3) прописать через cmd netsh winhttp set proxy 127.0.0.1:8888)
Текст прокси
<system.net>
   <defaultProxy enabled = "true" useDefaultCredentials = "true">
     <proxy autoDetect="false" bypassonlocal="false" proxyaddress="http://127.0.0.1:8888" usesystemdefault="false" />
   </defaultProxy>
</system.net>

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

Нравится

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

Сергей, здраствуйте!
Вам может помочь в решении статья  по работе с fiddler.

Тут на видео пример https://www.youtube.com/watch?v=gnCKXw5gnzI

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