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

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

 

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

 

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 = ..." нужно дописать условие, для этого нужно взять информация с записи детали. Как это можно сделать?

Нравится

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

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

 

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

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

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

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

 

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

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

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

 

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

 

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

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

Vladimir,

UsrParent - это название колонки родителя, т.к если это продукт в счете, то UsrParent - будет колонка Invoice.

 

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

Тогда получить ответственный со страницы можно через код, обратившись в var parent = item.get("UsrParent"), а затем parent.Owner;

 

Но опять предварительно "добавить" эту колонку в таблицу, через метод getGridDataColumns

 

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

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

Cпасибо за пояснение, но у меня всё равно не работает, что колонку  связи с родителем указывал, что название схемы родителя. 



Получается, надо из детали вызвать метод getGridDataColumns в нём указать колонку: "<колонка связи с родителем>.<Необходимая колонка>": {path: "<колонка связи с родителем>.<Необходимая колонка>"}, правильно? или как-то подругому?

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

Vladimir пишет:

getGridDataColumns в нём указать колонку: "<колонка связи с родителем>.<Необходимая колонка>": {path: "<колонка связи с родителем>.<Необходимая колонка>"},

На версии 7.16.1 не работает, общались с тех. поддержкой.

Такой кейс реализовать не возможно в этой версии

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

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

 

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

 

Нравится

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

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

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

Для этого, полю на странице Объект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

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

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

Нашел пример реализации в поле примечание (почти в любом объекте.

В БД выглядит примерно так:

&lt;div&gt;Тестовое &lt;span style="color:#c73920;"&gt;&lt;strong&gt;примечание&lt;/strong&gt;&lt;/span&gt;.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;раз&amp;nbsp;&lt;/li&gt;
&lt;li&gt;два&lt;/li&gt;
&lt;li&gt;три&lt;/li&gt;
&lt;/ol&gt;
 
 
 
&lt;div&gt;&amp;nbsp;&lt;/div&gt;

 

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

Как можно обойти ограничение в 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)

Текст прокси



   

     

   





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

Нравится

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