updateFilters: function (filter) {
 
                    var esq = this.getGridDataESQ();
                    switch(filter) {
                        case "TsOwner":
                            var user = this.Terrasoft.SysValue.CURRENT_USER_CONTACT.value;
                           	esq.filters.add("CurrentUser", this.Terrasoft.createColumnFilterWithParameter(
                                this.Terrasoft.ComparisonType.EQUAL, "TsOwner", user)); 
                            break;
                        case "TsOt": 
                            esq.filters.add("NotCurrentUser", this.Terrasoft.createColumnFilterWithParameter(
                                this.Terrasoft.ComparisonType.EQUAL, "TsOwner", user)); 
                            break;   
                    }
                },

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

Нравится

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

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

Mykhailo Storozhuk,

 {

                    "operation": "insert",

                    "name": "SearchQueryButton",

                    "parentName": "ActionButtonsContainer",

                    "propertyName": "items",

                    "values": {

                        "caption": "Все клиенты филиала",

                        "itemType": Terrasoft.ViewItemType.BUTTON,

                        "style": Terrasoft.controls.ButtonEnums.style.GREEN,

                        "click": {"bindTo": "TsOwnerQueryFilter"},

                        "layout": {

                            "column": 6,

                            "row": 0,

                            // "colSpan": 9,

                            // "rowSpan": 1,

                        },

                    },

                    "index": 2

                },

 

 

  TsOwnerQueryFilter: function () {

                    this.updateFilters("TsOwner");

                },

После того как Вы добавили фильтр нужно получить данные с новым фильтром и перезагрузить страничку реестра через метод this.refreshGridData().

sad

Не помогло. 

Предоставьте код в методе, пожалуйста

Mykhailo Storozhuk, 

initQueryFilters: function (filter) {

                    var esq = this.getGridDataESQ();

                    if (filter == "TsOwner") {

                        var user = '{218A312F-C5FB-4E8F-E053-223E1EAC50CA}'; 

                        esq.filters.add("CurrentUser",

                        this.Terrasoft.createColumnFilterWithParameter(

                            this.Terrasoft.ComparisonType.EQUAL, "TsOwner", user));

                    }

 

                    else if (filter == "TsNotOwner") {

                        var people = '{B1B7A389-130F-6EDB-E040-007F01000437}';

                        esq.filters.add("CurrenNottUser",

                            this.Terrasoft.createColumnFilterWithParameter(

                                this.Terrasoft.ComparisonType.EQUAL, "TsOwner", people));

                    }

                },

 

                updateFilters: function (filter) {

 

                    var esq = this.getGridDataESQ();

                    switch(filter) {

                        case "TsOwner":

                            var user = this.Terrasoft.SysValue.CURRENT_USER_CONTACT.value;

                            esq.filters.add("CurrentUser", this.Terrasoft.createColumnFilterWithParameter(

                                this.Terrasoft.ComparisonType.EQUAL, "TsOwner", user)); 

                            break;

                        case "TsNotOwner": 

                            esq.filters.add("NotCurrentUser", this.Terrasoft.createColumnFilterWithParameter(

                                this.Terrasoft.ComparisonType.EQUAL, "TsOwner", user)); 

                            break;   

                    }

 

                    this.reloadGridData();

 

                },

 

 

2 метода, ни один не работает. привязаны к кнопке на странице. 

По логике в разделе должен обновлить и применить фильтр 

Прошу прощения, правильнее будет переопределить метод initQueryFilters и потом вызывать метод reloadGridData. Пример кода:
define("ContactSectionV2", [], function() {
    return {
        entitySchemaName: "Contact",
          attributes: {
            "UsrTest": {
                "dataValueType": Terrasoft.DataValueType.BOOLEAN
         }
        },
        methods: {
            onTestClick: function() {
                this.set("UsrTest", true);
                this.reloadGridData();
            },
              initQueryFilters: function(esq) {
                this.callParent(arguments);
                //номер в пп
                var usrTestFilter = this.get("UsrTest");
                if (usrTestFilter) {
                    esq.filters.add("UsrTestFiltertest", 
                      esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Name", "111"));
                }
            }
        },
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "insert",
                "parentName": "ActionButtonsContainer",
                "propertyName": "items",
                "name": "MainContactSectionButton",
                "values": {
                    itemType: Terrasoft.ViewItemType.BUTTON,
                    caption: "Button test",
                    click: { bindTo: "onTestClick" },
                    "layout": {
                        "column": 1,
                        "row": 6,
                        "colSpan": 1
                    }
                }
            }
        ]/**SCHEMA_DIFF*/
    };
});

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

 Добрый день!
На странице не отображается изображение.

Вот добавленный элемент в массиве diff:

{

"name": "PhotoDocumentBackContainer",

"itemType": Terrasoft.ViewItemType.CONTAINER,

"layout": { "column": 0, "row": offset + 4, "colSpan": 24, "rowSpan": 1 },

"items": [

{

"name": "PhotoDocumentBack",

"getSrcMethod": "getPhotoDocumentBack",

"onPhotoChange": "onPhotoChange",

"readonly": true,

"generator": "ImageCustomGeneratorV2.generateCustomImageControl",

"onImageClick": {

"bindTo": "onPhotoDocumentBackClick"

}

}

]

}

Метод getPhotoDocumentBack возвращает ссылку на изображение (http://10.204.3.15/static/folderId/photoId.jpeg)                            
Но когда страница  начинает загружаться ссылка на изображение http меняется на https (см. скрин), и по этой причине фото не отображается.
Подскажите пжл почему происходить редирект? 

 

Нравится

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

Жаксыбек, а в коде получившейся веб-страницы это изображение упомянуто по http, по https или вообще без упоминаний протокола? Сам сайт работает только по какому-то протоколу или по обоим?

Здравствуйте, Александр.

Ссылка будет доступным если обратиться только по http.

Само приложение перенастроен c http на https, но думаю должно поддерживать оба протокола.

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

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

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

При использовании EntitySchemaQuery возникла необходимость сделать case insensitive фильтр по строковой колонке (в C#) (то есть чтобы по "ааа" находились и "ааа", и "АаА").

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

Нравится

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

Можете по средством Linq, полученное значение из запроса сразу приводить к нижнему регистру, а потом сравнивать с вашим значением(тоже приведенным к нижнему регистру)

Литвинко Павел,

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

nickolay_dolgopolov,

Тогда, попробуйте через:

text.IndexOf(Искомое значение, StringComparison.OrdinalIgnoreCase)
Показать все комментарии

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

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

Нравится

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

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

Уточните, пожалуйста, как именно Вы получаете значение системной настройки? Есть листинг кода? 

 

Вильшанский Дмитрий, 

this.Terrasoft.SysSettings.querySysSettingsItem('SlaCalculationEnabled', function (slaEnabled) {console.log(slaEnabled)})

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

Добрый день.

Ошибка не совсем правильно передает суть проблемы. Дело в правах – т.е. у пользователя нет прав на данную настройку.

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

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

Возникла задача отправлять пользователям е-мейлы, содержащие html  с картинками, которые не хранятся на внешних ресурсах (то есть url нельзя указать как источник). Пробовал сделать через base64, но outlook не отображает такие картинки. Вопрос: как отправляются, например, письма с оценками (как на скриншоте)?

Судя по исходникам письма, для картинок создаются cid. Нашел файл EstimateLinksGenerator, но он, во-первых, генерирует именно base64, во-вторых, не могу найти, где он вызывается. Буду очень благодарен за пример кода, создающего html со встроеннными картинками для отображения в outlook.

 

PS используем версию 7.6, но есть возможность смотреть в код 7.11

Прикрепленные файлы

Нравится

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

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

Для отображения оценок исполузуется макрос EstimateLinksGenerator.
Каким образом это реализовано можно посмотреть в статье

Но такие макросы работают толькло в разделе Обращения при отправке письма по шаблону. Это связано с тем что в обращениях для обработки тела письма используется InvokableMacrosHelperService, который знает как работать с такими макросами (которые реализуют IMacrosInvokable).

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

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

Есть ли у кого-нибудь понимание какие модули использует BPM для навигации по истории.

Я например встречал класс Terrasoft.Router и также sandbox.publish() для навигации.

Может есть что почитать по этому поводу?

 

Нравится

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

Хм, а в контексте какой задачи появился такой вопрос?

У меня после закрытия преднастроенной страницы в процессе происходит возврат не туда, куда бы хотелось. Так как используется BasePageV2.onCloseCardButtonClick() и CustomProcessPageV2Utilities.acceptProcessElement().

Если используется только BasePageV2.onCloseCardButtonClick(), то поведение правильное.

Кисловский Михаил Андреевич,

Если еще более конкретно, то я бы хотел чтобы последовательно отработал такой код

1. this.acceptProcessElement();

2. this.sandbox.publish("PushHistoryState", {hash: "GoToDirection"})

 

но this.acceptProcessElement() переадресует меня в другое расположение и вторая строчка не отрабатывает.

Всем спасибо!

Подошло Terrasoft.Chain()

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

Доброго времени, форумчане.

Возникла следующая потребность:
Есть сайт, на котором оформляются заказы, после оформления они передаются в bpm.
На странице заказа в bpm вставил Iframe сайта на котором оформляются заказы.
Цель: при открытии заказа в bpm нужно, чтобы в Iframe передавались данные авторизации(чтобы зайти в кабинет) и открывался аналогичный заказ на сайте для возможности его редактирования.

Есть ли возможность сделать это и вообще передавать данные в Iframe средствами bpm?

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

Нравится

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

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

У нас, к сожалению нет готовых решений для реализации автоматизированной интеграции с IFrame.

Можете воспользоваться стандартными средствами экспорта из bpm и загружать данные в IFrame вручную.

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

С уважением, Анастасия.

Кирилл, всё что вам нужно есть тут:smile:

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

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

Являюсь новичком на форуме, хотя уже достаточно перелопатил по теме SVN, но так и не понял.

Возможно ли загрузить каким-то средствами и зафиксировать уже имеющийся код(из пакета Custom) в хранилище SVN?
С новыми пакетами проблем нет. При попытке зафиксировать пакет Custom всплывает такое сообщение.

"Пользовательский пакет не может быть зафиксирован в хранилище".

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

Подскажите, пожалуйста, кто что знает по данной теме.

Нравится

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

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

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

Илья, спасибо за ответ.

Продолжу вопрос :smile:

На данный момент (досталось в наследство) в пакете "Custom" находится около 400 элементов и разнести их по отдельным пакетам будет делом всей моей жизни. Есть идея, что эти элементы можно скопировать в новый пакет, который уже будет синхронизирован с SVN. Но есть один момент.

Была найдена информация про пакет Custom.

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

Как вы думаете можно ли скопировать элементы в новый пакет, который уже будет синхронизирован с SVN? Может есть ещё варианты?

Ох, как я вас понимаю...
А особенно если с "выездом" в отдельные пакеты паралельно вам надо будет разрабатывать в своих пакетах расширяя то что в Custom это боль.
Предлагаю грязный трюк:
Создаете пустой пакет между Custom и редакционнымSoftKey_RUS
Потом прям на уровне бд в SysSchema - все схемы которые дочерние для Custom, апдейтите для них колонку SysPackageId на значение нового созданного вами пакета.
В теории - всё...
Дальше фиксируете его в SVN ну и собственно сможете вклинить любые ваши пакеты доработок между ним и Custom-ом если надо будет что-то расширять.

Отпишитесь пожалуйста - вышел каменный цветок или нет.
По идее все делается за 15 мин :)

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

update SysSchema set SysPackageId = '42C32F84-0E99-4A7B-8CEF-0A2BD30CF8F7' -- newPackage
where SysPackageId = 'AC5A5588-77FF-4CD0-B5D6-9561546E3D22' -- Custom
 
update SysPackageSchemaData set SysPackageId = '42C32F84-0E99-4A7B-8CEF-0A2BD30CF8F7' -- newPackage
where SysPackageId = 'AC5A5588-77FF-4CD0-B5D6-9561546E3D22' -- Custom
 
update SysPackageReferenceAssembly set SysPackageId = '42C32F84-0E99-4A7B-8CEF-0A2BD30CF8F7' -- newPackage
where SysPackageId = 'AC5A5588-77FF-4CD0-B5D6-9561546E3D22' -- Custom
 
update SysPackageSqlScript set SysPackageId = '42C32F84-0E99-4A7B-8CEF-0A2BD30CF8F7' -- newPackage
where SysPackageId = 'AC5A5588-77FF-4CD0-B5D6-9561546E3D22' -- Custom

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

Ну да я как-то забыл про "Данные" и "Скрипты" но вы по аналогии сделали все верно.
Последствий быть не должно...
Фактически вы можете произвести по базе поиск ID-ника пакета Custom и собственно посмотреть где он там еще задействован, но скорее всего со схемами и модулями он уже никак связан не будет.
Нет связи - нет проблем... остальные Id и UId остались без изменений.

Теперь вы можете при необходимости спокойно расширять/замещать логику и объекты объявленные ранее в Custom и размещать это в обособленных пакетах между Custom и пакетов в который переехали.

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

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

Илья, благодарю за помощь!

Надеюсь новый функционал уже не за горами!:smile:

"Шумков Виталий" написал:Отразится ли это на последующей работе конфигурации неизвестно, буду тестировать.


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

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

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

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

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

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

Версия 7.6.0.1265

Нравится

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

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

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

Также за эти кнопки отвечают следующие элементы:
DataGridActiveRowOpenAction
DataGridActiveRowCopyAction
DataGridActiveRowDeleteAction

Вы можете задать их видимость в схеме созданного Вами раздела.

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

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

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

Как лучше мне это сделать?

Нравится

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

Здравствуйте, Сергей!

Вы можете видимость поля задать бизнес правилом. Параметр видимости будет определяться в момент открытия страницы редактирования (Вам необходимо переопределить метод onEntityItialized()). Замещенный метод onEntityItialized() должен вызывать родительский, а также проверять вхождение пользователя в роли (используйте ESQ по объекту SysAdminUnitInRole). Обратите внимание, что один пользователь может входить в несколько ролей.

Сформировал запрос к таблице SysAdminUnitInRole по своей Id

SELECT *
FROM            dbo.SysAdminUnit sa LEFT JOIN
                         dbo.SysAdminUnitInRole saur ON sa.Id = saur.SysAdminUnitId
WHERE sa.Id = 'мой Id'

Вернуло 3 строки - это означает, что в меня есть 3 роли?

Да, это значит что Администратор с sa.Id = 'мой Id' входит в три роли
Если вы выполните

SELECT saur.SysAdminUnitId, saur.SysAdminUnitRoleId
FROM            dbo.SysAdminUnitInRole saur
Where saur.SysAdminUnitId = 'мой Id'

То увидите айдишники ролей

Спасибо за подсказку, пытался вывести название ролей:

SELECT saur.SysAdminUnitId, saur.SysAdminUnitRoleId, s.Name
FROM            dbo.SysAdminUnitInRole saur Left JOIN
                         dbo.SysAdminUnit s ON saur.SysAdminUnitId = s.Id
WHERE saur.SysAdminUnitId = 'мой Id'

Результат имя моего контакта. Может я неправильно делаю?

так ваш запрос и выводит имя контакта из s.Name (SysAdminUnit)

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

select s.Name 
from SysAdminUnit s
where s.id in (
select saur.SysAdminUnitRoleId
from dbo.SysAdminUnitInRole saur
where saur.SysAdminUnitId = 'мой Id'
)

Вот только одна запись похоже тоже будет вашим контактом, т.к. есть соответствие одинаковых id в SysAdminUnitInRole

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