Погуглив по сайту я вижу, что самый рекомендуемый способ это сделать - 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 можно будет получить значения из этой таблицы.

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

 

Показать все комментарии
Создание раздела
регистрация раздела
7.11
sales

Добрый день!

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

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

Нравится

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. В ней можете посмотреть как добавляются уже существующие поля и по аналогиии добавить свои.

Показать все комментарии
excel
отчеты
7.11
sales

Добрый день, Коллеги! Поделитесь пжлст какими  методами получаете отчет с выгрузкой в эксель такого плана:

Продукт -  Постащик -  Счет - и т.д.,

т.е, данные с детали Продукты в счете .

При этом их нужно отфильтровать за период и по Состоянию оплаты счета.

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

 

Спасибо!!

Нравится

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

Мы создавали сначала раздел, вынесли его в отдельное рабочее место. Потом добавили его в виде детали в счет и всё что туда добавлялось - падало в наш раздел, где мы уже всё фильтровали и только после этого делали выгрузку.

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

Alex Zaslavsky,

Спасибо большое! Думаю подойдет решение! В  карточку в разделе нужно все поля с детали добавить или как связь именно с деталью сделать? 

Елена К,

У нас изначально не было раздела "Счет" (bpm'online sales team), и мы создали этот раздел, потом под него создали раздел "продукт в счете" и, собственно, на основе этого раздела уже прикрепили деталь к разделу Счет. 

Я так понимаю, что у Вас уже рабочая система? Тогда я не знаю как Вам на основе стандартного объекта "продукт в счете" создать раздел, поэтому и дописал, что, возможно, Вам помогут знатоки. Я в этом не силён.

Alex Zaslavsky,

В любом случае большое спасибо!)

 

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

Доброго дня.

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

Сейчас выглядит так: после заполнения полей по кнопке запускается процесс. Если цепочка прошла ок, то выводится автогенерируемая страница "Успешно", далее по цепочке если не открывать страницу редактирования, открывается карточка с незаполненными полями. Поэтому помещаем элемен "открыть станицу редактирования". К сожалению, она генерирует активность, которую надо сохранить. 

То есть мешает это лишнее "Сохранить".

Или есть способ генерировать некий messagebox  не уходя с карточки или способ открыть существующую карточку без создания активности?

Нравится

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

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

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

Алгоритм такого решения уже рассматривался здесь.

Логвин Андрей Витальевич,

Доброго дня. К сожалению, решение не об этом.

Дело в том, что элемент "открыть страницу редактирования" генерирует таск и выводит на карточке кнопки "Save", "Perform Later", "Cancell". 

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

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

Вопрос такой: как перейти с помощью БП в карточку любого раздела для последующей работы без вывода этих кнопок? Ну и без генерации таска.

 

ZAN,

В базовой логике пользовательскими средствами поменять кнопки на Октрыть страницу редактирования не удастся (чтобы убрать кнопку Сохранить). И такой подход не совсем корректый, так как представим, что Вы открыли страницу без кнопки, в итоге элемент не сможет завершиться, так как переход дальше по процессу выполняется именно по нажатию на кнопку, и процесс зависнет в состоянии Выполняется.

Я бы решал так:

1. Запускать процесс из необходимой карточки (условно, Счет), например, установив запуск через запуск по записи.  После этого выполнить все необходимые действия по процессу, отправить сигнал на обновление значений всех полей карточки Счет, как описано в предыдущем комментарии и в посте (и добавьте в using процесса Terrasoft.Configuration). Таким образом, Вы сможете обойтись без лишнего открытия страницы редактирования, и поля будут заполнены.

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

Похожий кейс тут: https://community.terrasoft.ru/questions/zaversenie-processa

Будем колхозить...

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