Добрый день.

Настраиваю интеграцию с LDAP, не происходит импорт пользователей, только групп. Опытным путём выяснил что проблема в последнем фильтре "Фильтрация пользователей группы Active Directory". Скрипт который указан в родной документации не работает.

Посоветуйте какой фильтр в нём можно применять. Например если у всех пользователей sAMAccountType=805306368 можно ли его там использовать?

Нравится

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

Добрый день, Иван.

Фильтр, указанный в документации правильный - это родной фильтр MS. Он может не отрабатывать, если в качестве синхронизируемых объектов указывается орг.единица, а не директория. В таком случае можно использовать в фильтре любой общий атрибут для пользователей, если его нет - создать такой для них.

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

Коллеги, здравствуйте.

Появился вопрос по поводу настройки падежей в печатных формах. 

Кто нибудь сталкивался с такой задачей? Как это возможно реализовать?

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

Нравится

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

Роман, здравствуйте!

В базовой версии такой возможности нет.

Вы можете реализовать свой собственный макрос - https://academy.terrasoft.ru/documents/technic-sdk/7-11/kak-sozdat-makr…

Либо попробовать использовать стороннее решение - https://marketplace.terrasoft.ru/app/declension-names-printable-forms-b…

И подключить к этому Machine Learning

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

Погуглив по сайту я вижу, что самый рекомендуемый способ это сделать - FileStream, однако, я не нашел подробной инструкции как это правильно делать. Вот включил я на сервере, а что дальше?

Например, когда создается файловый объект, бинарные данные в нем VARBINARY(MAX), и FileStream здесь выбрать не получается. ALTER COLUMN?

Еще сервер требует ALTER COLUMN Id ADD ROWGUIDCOL!

Плюс надо создать файловую группу FileStream и минимум 1 файл в этой группе.

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

Нравится

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

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

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

Единственное чем могу помочь, это полезной информацией:

 https://docs.microsoft.com/ru-ru/sql/relational-databases/blob/filestream-sql-server

https://www.red-gate.com/simple-talk/sql/learn-sql-server/an-introduction-to-sql-server-filestream/

https://logicalread.com/sql-server-filestream-part1-mo01/#.WosMgKhuaUk

Майкрософт - это конечно, хорошо, но меня волнует вопрос насколько BPM совместима с этой технологией?

Ну вот я, допустим сделаю это всё на сервере разработки, но это же не перенесется через СВН!

Также, что будет, если я захочу что-то поменять в этой таблице в конфигураторе и пересохраню ее? Всё отвалится?

Алексей-Карягин,

Проверили работу FileStream с базой bpmonline.

Необходимо включить FileStream на серевера, после в БД создать FileGroup, и добавить File, тогда будет возможность создавать в БД таблици которые MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY. 

Поскольку изменить существующие таблицы для работы с FileStream не удастся, есть возможность только в существующую БД добавить новые таблицы.

Для того что бы в БД получать данные таких таблиц необходимо в конфигурации добавить схему в которой указать что это [Представлении в базе данных]

Тогда создав отдельно в БД таблицу с таким же именем как и у схемы, в bpm'online можно будет получить значения из этой таблицы.

В случае с существующими таблицами/схемами не получиться, поскольку необходимо изменять структуру БД, что повлияет на работоспособность базового функционала.

 

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

Добрый день!

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

Не мог бы кто-нибудь предоставить пошаговую инструкцию по созданию и регистрации нового раздела без использования мастера разделов?

Нравится

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

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

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

Ниже приведен приблизительный алгоритм реализации (объект «OrderProduct»):

1) Создать страницу раздела.

Для этого Вам необходимо создать схему AlDOrderProductSectionV2 со следующим кодом:

define("AlDOrderProductSectionV2", [],
	function() {
		return {
			entitySchemaName: "OrderProduct",
			messages: {},
            mixins: {},
            attributes: {},
            methods: {},
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
		};
	}
);

 

2) Для объекта "OrderProduct" уже есть запись в таблице SysModuleEntity (объекты разделов). Для получения Id записи необходимо выполнить скрипт:

select SysModuleEntity.Id from SysModuleEntity
join SysSchema
on SysSchema.UId = SysModuleEntity.SysEntitySchemaUId
where SysSchema.Name = 'OrderProduct'

 

3) Получив SysModuleEntity.Id необходимо зарегистрировать сам раздел.

Для регистрации раздела необходимо добавить запись в таблицу SysModule.

Запрос приблизительно следующий:

insert into SysModule
(SectionSchemaUId, Code, SysModuleEntityId, CardSchemaUid, SectionModuleSchemaUid, CardModuleUid)
values
(/*Uid созданной на первом шаге схемы*/, /*Код раздела*/, /*Результат запроса из второго пункта*/, /*UID незамещенной схемы OrderProductPageV2 из таблицы SysSchema*/, /*DF58589E-26A6-44D1-B8D4-EDF1734D02B4*/, /*4E1670DC-10DB-4217-929A-669F906E5D75*/)

Также необходимо заполнить значения полей:

Caption, Image16, Image20, ModuleHeader, Image32d, LogoId

 

4) Добавьте раздел в нужное рабочее место

В результате очистки кеша, Redis и перезахода в систему раздел будет в нужном рабочем месте, но без кнопки "Добавить".

 

5) Скрипт добавит кнопку:

update SysModuleEdit
set ActionKindCaption = 'Добавить продукт к заказу'
where SysModuleEntityId = (select SysModuleEntity.Id from SysModuleEntity
join SysSchema
on SysSchema.UId = SysModuleEntity.SysEntitySchemaUId
where SysSchema.Name = 'OrderProduct')

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

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

Add comment

Одеяненко Юлия,

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

Иван, проверила сама данную инструкцию - она работает, после выполнения всех действий раздел появляется в списке разделов для добавления в рабочее место, после добавления открывается. Также, если у Вас версия 7.11+, рекомендуем после выполнения всех действий сгенерировать исходный код и скомпилировать конфигурацию (связано с появлением статического контента в новых версиях). Также рекомендуем установить у созданной в п.1 схемы в качестве родителя BaseSectionV2

Одеяненко Юлия,

Спасибо, Юлия! Новый раздел действительно появился в списке добавления в рабочее место, в прошлый раз я этого не заметил (к своему стыду).

После добавления он долго не появлялся в основном меню и подвисал при сохранении с надписью "регистрация раздела", но в конечном итоге после перекомпиляций и сбросов редиса появился, но зависал при попытке его открыть. Отладчик показал, что сбой в загрузке происходит в схеме ProfileUtilities в методе getDefaultGridSettings() на строке:

var columnName = config.primaryDisplayColumn.name;

config.primaryDisplayColumn приходил undefined, в итоге я остановил выполнение в этом месте и в консоли вручную задал его значение:

config.primaryDisplayColumn = {

  name: "Name" //Подставил имя столбца из моего объекта

};

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

Еще раз спасибо!

Одеяненко Юлия,

Юлия, к сожалению, я столкнулся с новой проблемой:

в добавленном разделе нельзя настроить фильтры. Я добавил объект ***Folder, и унаследовал его от базовой группы. Теперь фильтрацию можно сохранить, но элемент меню "показать группы" отсутствует, они видны только после добавления новой группы, и работают не так, как хотелось бы.

Не могли бы Вы мне помочь, рассказав, какие действия мне необходимо выполнить для того, чтобы этот функционал заработал корректно?

Небеддаг Иван Владимирович,

для того, чтоб можно было настраивать группы в новом разделе, необходимо создать 2 новых объекта с названиями в БД, которые формируются определенным образом:

1) *название объекта раздела*Folder (например, ContactFolder), родитель - "Базовая группа ( Base )" (BaseFolder);

2) *название объекта раздела*InFolder (например, ContactInFolder), родитель - "Базовый элемент в группе ( Base )" (BaseItemInFolder).

Параметры объектов указывайте аналогичные тем, которые установлены у объектов группы для базовых разделов, например, у тех же ContactFolder и ContactInFolder. Также в объекте *...*InFolder необходимо указать у колонки "Folder" справочник - объект *...*Folder из п.1, а также создать справочную колонку, которая будет ссылаться на объект раздела. Пример - http://prntscr.com/jz06kf.

Примечание. Если Вы регистрируете раздел на основании объекта, в названии которого отсутствует префикс (например, Usr), то у объектов в п.1 и 2 тоже префикса не должно быть. Можно временно отключить необходимость префикса в системной настройке SchemaNamePrefix. 

Иван Небеддаг пишет:

config.primaryDisplayColumn приходил undefined, в итоге я остановил выполнение в этом месте и в консоли вручную задал его значение:config.primaryDisplayColumn = {   name: "Name" //Подставил имя столбца из моего объекта };

Подскажите пожалуйста где именно в консоли вы задали значение? И что за "имя столбца объекта" подставили?

Идрисов Артур Ильдарович,

Имя столбца объекта можете подставить любое, лишь бы оно в Вашем объекте было. Можете использовать "Id", не ошибетесь. 

А на первый вопрос даже не знаю, что ответить. Вы просто ставите точку останова перед строкой, где происходит ошибка, переходите во вкладку консоль и пишете config.primaryDisplayColumn = {   name: "Id" }, после чего продолжаете выполнение кода.

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

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

Добрый день!

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

Нравится

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

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

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

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

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

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

Нравится

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

Иван, если я Вас правильно понял, Вы имеете в виду детль Сеансы .

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

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

Всем привет!

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

Поэтому возник вопрос, можно ли переопределить действие этой кнопки?

Какой метод отвечает за обработку пунктов меню "задача", "звонок", "email".

Так же вопрос,  как можно скрыть данную кнопку с этой страницы?

Сейчас создана отдельная кастомная кнопка, которая выполняем нужные мне действия. Поэтому есть второй вопрос: Как скрыть вообще кнопку с флажком?

Может есть какой-то обработчик отвечающий за видимость этой кнопки?

Нравится

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

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

Кнопку можно изменить и скрыть. Например, убрать/скрыть кнопку можно так - в замещающей схеме в разделе diff написать 

{
	"operation": "remove",
	"name": "addActions"
}

Или же переопределить метод getQuickAddButtonVisible. Методы обработчики на пункты меню добавляются в методе initQuickAddMenuItems из миксина QuickAddMixin.

Для того что бы определить это я сделал следующее: открыл консоль разработчика (F12), на нужном элементе на странице нажал правую кнопку мыши, выбрал Inspect. У меня открылась вкладка Elements и выделилась строка с нужным элементом. После префикса «ActivityPageV2» я увидел название элемента «addActions». Далее в глобальном поиске(Ctrl-shift-f) я запустил поиск. Нашел ссылку на BasePageV2. Увидел diff данного «флажка», а также интересные методы «QuickAddMenuItems» и «getQuickAddButtonVisible». Нашел данные методы, поставил точки останова, перегрузил страницу, и далее с помощью клавиш F10 и F11 проследил цепочку вызовов.

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

Помогите пожалуйста отфильтровать справочное поле на клиенте,

У меня есть объект CreditCard у которого есть деталь [залоговое обеспечение] они связаны между собой через колонку  [залоговое обеспечение].CCId(идентификатор кредитной карты).

Так же в объекте [залоговое обеспечение] есть справочное поле [Контакт] собственно именно его я и хочу отфильтровать. Чтобы в нем появлялись только те контакты которые присутствуют в другой детали в CreditCard - CC_TxParticipant(деталь) которые связаны так же как и [залоговое обеспечение] через колонку CCId(идентификатор кредитной карты).

 

В детали CC_TxParticipant есть два справочных поля - 1. Контакт 2. Тип контакта, так вот я не совсем понимаю как сделать так чтобы во время фильтра отсеивались контакты с определенным типом.

 

Сейчас для фильтрации только [Контактов] из CC_TxParticipant я делаю так:

"lookupListConfig": {
"filters": [
function() {
...
var allParticipantsFilter = this.Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[CC_TxParticipant:Participant:Id].CC", master.value);
...
    }
]

где master.value = идентификатор CreditCard, потом добавляю фильтр в общий фильтр и так далее, таким образом я получаю только тех контактов которые присутствуют в детали CC_TxParticipant именно этого CreditCard

-----------------

Попробую объяснить подробнее

Есть следующие объекты:

 

0.[CreditCard] - к нему относятся 2 детали:

1.[CC_TxParticipant] - связана с [CreditCard] через колонку CCId(идентификатор [CreditCard])

2.[CC_CollateralData] - связана с [CreditCard] через колонку CCId(идентификатор [CreditCard])

 

В объекте [CC_TxParticipant] есть справочное поле Контакт, и справочное поле с типом участника.

В объекте [CC_CollateralData] есть справочное поле Контакт которое требуется отфильтровать таким образом, чтобы появлялись только те контакты которые находятся в детали объекта [CC_TxParticipant], кроме тех у которых скажем Тип участника не равен *какой то айди*.

На данный момент у меня получилось только отфильтровать таким образом чтобы отображались только те контакты которые находятся в объекте [CC_TxParticipant] без учета их типа.

master.value  в коде выше как раз является идентификатором [CreditCard]

Понимаю что объяснение получилось запутанное, поэтому заранее прошу прощения

Нравится

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

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

Что бы отсеять контакты по типу нужно добавить фильтр где в качестве сравнения будет конфигурационная константа или id «типа контакта» (таблица ContactType). Например:

filterGroup.add("IsEmployeeType", Terrasoft.createColumnFilterWithParameter(                            Terrasoft.ComparisonType.EQUAL, "Contact.Type", ConfigurationConstants.ContactType.Employee));

При этом нужно не забыть указать зависимость на «ConfigurationConstants»:

define("ContactPageV2", ["ConfigurationConstants"],
function(ConfigurationConstants) {

Все типы констант вы можете посмотреть при отладке.

Или же можно сделать запрос используя id из таблицы ContactType:

 filterGroup.add("IsEmployeeType", Terrasoft.createColumnFilterWithParameter(                           Terrasoft.ComparisonType.EQUAL, "Contact.Type",” 806732EE-F36B-1410-A883-16D83CAB0980”));

 

VladKapitanchyk,

Добрый день,

Спасибо за совет, к сожалению построение обычного фильтра не составляет проблемы, мой вопрос несколько сложнее

Сериков Асхат Кайратович пишет:

VladKapitanchyk,

 мой вопрос несколько сложнее

Добрбый день! Если мы не правильно поняли, то просьба переформулировать запрос либо объяснить "на пальцах" . Мы ради будем помочь.

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

Добрый день,

прошу прощения за такой запутанный вопрос, переформулировал, надеюсь получилось

Добрый день.

Спасибо за совет, к сожалению построение обычного фильтра не составляет проблемы

Вам нужно составить фильтр из 2 условий. Т.е. добавить в фильтр группу 2 фильтра(фильтр контактов которые находятся в детали объекта [CC_TxParticipant], и фильтр контактов у которых Тип участника не равен *какой то айди*). На академии можно посмотреть. https://academy.terrasoft.ua/documents/technic-sdk/7-11/primenenie-filt…

VladKapitanchyk,

День добрый,

Разобрался, пытался перемудрить зачем то.

Спасибо большое

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

Добрый день. Учитывая помощь из поста (https://community.terrasoft.ru/questions/podklucenie-globalnogo-poiska)В connectionString указал путь к файлу SQLite и он сейчас выглядит таким образом:

    

    

    guest@localhost:5672/" />

при запуске приложения появилось такое:

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

При этом по указаному пути появился файл GlobalSearch.db

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

Далее пытаюсь выполнить такой пост-запрос:

$params = @{"ApiKey"= ""; "SiteName"="C:\BPMonline_GlobalSearchServices_1.0.0.136_711\DB\GlobalSearch.db"}

Invoke-WebRequest -Uri "http://localhost:81/GlobalSearch/0/addsite" -Method POST -Body $params 

получаю ошибку

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

В чем может быть причина?

Нравится

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

Здравствуйте, Максим!

Параметр SiteName – это не путь к БД а название сайта, должен совпадать с названием БД.

А путь к БД SqlLite указыватся в ConnectionString.config

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

 

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

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

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

Можно вынести параметры агрегации по объекту (Курсы валют) на виджет, чтобы можно было менять тип валюты и дату за которую выбирать данные

Нравится

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

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

Если вы хотите изменять Сумму в зависимости от изменения Валюты и Курса, то можно добавить зависимость Суммы от  этих полей в attributes и добавить метод пересчёта Суммы.

Например:

    attributes: {

            "Сумма": {

                dependencies: [

                    {

                        columns: ["Валюта", "Курс"],

                        methodName: "название_метода"

                    }

                ]

            }

        }

Логику метода реализовать отдельно.

Demchenko Olha,

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

и это на панели итогов, пользователю нельзя менять сам Показатель (виджет)

Колодяжный Владислав Эдуардович,

Стандартными стредсвами такое нельзя сделать.

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

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

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