Добрый день.

У меня такой вопрос. Можно ли вызвать бизнес-процесс из скрипта c#?

Нравится

3 комментария
UserConnection userConnection = HttpContext.Current.Session[@"UserConnection"] as UserConnection;
ProcessSchemaManager processSchemaManager = (ProcessSchemaManager)userConnection.GetSchemaManager(@"ProcessSchemaManager");
ProcessSchema processSchema = processSchemaManager.GetInstanceByName(@"GetManager"); //вместо GetManager вставить название БП
Process process = processSchema.CreateProcess(userConnection);
 
if (processSchema.Parameters.ExistsByName(@"ContactNum"))
{
	process.SetPropertyValue(@"ContactNum", var1);
}
process.SetPropertyValue(@"ManagerNum", var2);//можно не проверять на существование параметра
...набиваем параметрами процесс...
process.Execute(userConnection);

"Варфоломеев Данила Викторович" написал:

UserConnection userConnection = HttpContext.Current.Session[@"UserConnection"] as UserConnection;

ProcessSchemaManager processSchemaManager = (ProcessSchemaManager)userConnection.GetSchemaManager(@"ProcessSchemaManager");

ProcessSchema processSchema = processSchemaManager.GetInstanceByName(@"GetManager"); //вместо GetManager вставить название БП

Process process = processSchema.CreateProcess(userConnection);



if (processSchema.Parameters.ExistsByName(@"ContactNum"))

{

        process.SetPropertyValue(@"ContactNum", var1);

}

process.SetPropertyValue(@"ManagerNum", var2);//можно не проверять на существование параметра

...набиваем параметрами процесс...

process.Execute(userConnection);

Спасибо.
Но почему-то это не хочет работать в скрипте бизнес-процесса. Выкидывает ошибку: Невозможно получить экземпляр схемы типа "Terrasoft.Core.Process.UsrProcess2Schema".

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

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

Добрый день.
Ситуация следующая:
Есть два замещающих объекта Case. Один находится в пакете для разработке. Второй - в пакете Custom. Возникла необходимость реализовать логику в casePage, затрагивающую поля из Case в пакете Custom. Но дилемма в том, что логика должна быть реализована в пакете для разработки.
Вопрос как перенести объект Case из Custom в пакет для разработки (слить два замещающих объекта), чтобы не затереть существующую логику, уже реализованную в Case пакета разработки?

Нравится

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

Добрый день, Игорь!

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

Во-первых, нужно проверить не нарушена ли у Вас иерархия пакетов. Пакет Custom должен быть последним в иерархии всегда. И по-хорошему наследоваться от всех других пакетов в системе и от пакета разработки, но это уже не обязательно.

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

Слияние необходимо выполнить для 2-х типов схем: EntitySchema и ClientUnitSchema

Рассмотрим слияние EntitySchema:

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

Рассмотрим слияние ClientUnitSchema:

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

1.Открываем обе схемы в дизайнерах. Если посмотреть на содержимое схем, то можно заметить, что некоторые свойства объекта содержат значение (в данном случае diff). Пример на скриншоте "image2".
2. Дальше необходимо анализировать содержимое каждого элемента в diff-е.
3. Ищем совпадающие элементы по полям «opperation» и «name»
4.Анализируем значение полей свойства «values»:
- Если в новой версии такого поля нет, то добавляем
- Если в новой версии такое поле есть, то подменяем его значение
5. Если в схеме, в которую переносим данные, нет элементов с соответствующими полями «opperation» и «name», то переносим элемент целиком. Пример на скриншоте image3
6. Выполняем п.п. 3-5 для всех элементов объекта, который возвращает функция.
7. После переноса/слияния всех данных, схему из пакета Custom можно удалить.

Михаил, здравствуйте!
Спасибо за ответ!
Как раз таки слияние ClientUnitSchema не взывает затруднения.
А вот к EntitySchema есть вопросы. Не затрётся ли содержимое переносимых полей при реализации описанной схемы?

Добрый день, Игорь!
Описанный ранее метод слияния EntitySchema вполне рабочий и несколько раз сам его применял.
Если все делать согласно инструкции, то проблем быть не должно. Единственный совет, откройте данные объекты (который будете удалять и который будете изменять) в разных браузерах, так будет надежнее. Если у Вас есть предостережения, Вы можете протестировать на тестовой сборке.

Всё получилось. Спасибо.

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

Добрый день.
Необходимо получить выборку из справочника City, где не заполнено поле RegionId
Делаю Get запрос:

Url сайта>/0/ServiceModel/EntityDataService.svc/CityCollection?$filter=Region/Id eq guid'00000000-0000-0000-0000-000000000000'

В ответ приходит:

version="1.0" encoding="utf-8"?> xml:base="http:///0/ServiceModel/EntityDataService.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">>http:// сайта>/0/ServiceModel/EntityDataService.svc/CityCollection></span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"text"</span><span style="color: #000000; font-weight: bold;">></span></span>CityCollection<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">>>2016-10-31T13:34:09Z> rel="self" title="CityCollection" href="CityCollection" />> />>>

Если подставить в фильтр Id существующего региона, то фильтр отрабатывает корректно.

Как реализовать данный кейс?

Нравится

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

Уважаемые коллеги!

Помогите пжл. разобраться с проблемой отмены процессы средствами БП.
Дело в том, что мне необходимо отменить процесс, запущенный ранее...
Для эти целей я смоделировал соответствующий процесс (см. вложенный файл).
При наступлении определенного события этот процесс отменяет ранее запущенный процесс, фиксирует такую отмену в Журнале процессов.
Однако, при наступлении предыдущего события, отмененный процесс вдруг "оживает" и выполняет свою миссию...
Замечу, однако, что при ручной отмене процесса непосредственно в журнале процессов, отмененный процесс "не оживает"...

Что делать?

Нравится

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

Примерно такой вид должен быть. Отменять процесс необязательно - будет выполнена одна из веток (т.е., если до таймера наступит изменение напоминания, то на верхнюю ветку процесс больше и не пойдет)

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

Спасибо за совет! Только данная конструкция никак не подходит - до таймера надо еще кучу элементов вставить считать данные, вычислить время до напоминания, а только потом это время вставить в таймер...
Или, возможно, я чего-то не так делаю....

"Ифутин Юрий Борисович" написал:Спасибо за совет! Только данная конструкция никак не подходит - до таймера надо еще кучу элементов вставить считать данные, вычислить время до напоминания, а только потом это время вставить в таймер...

вставляйте до ветвления

Спасибо Владимир!

Процесс работает в следующем виде (см. вложенный файл). Работает хорошо...

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

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

"Ифутин Юрий Борисович" написал:В случае двух и более изменений напоминания

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

Тогда при изменении завершится первый процесс. И начнется второй.
При следующем изменении завершится второй, и начнется первый.

Спасибо, Владимир!

Дело в том, что для этой опции активности нет понятия "добавлен", есть только "изменен" - то есть, либо напоминание "включено" либо "выключено" (да/нет).
То есть, с точки зрения системы, добавление напоминания- это и есть изменение из состояния "нет" в состояние "да" (галочка).
А в поле "Дата напоминания" также формируются только два состояния - "Не заполнено" (нет никакой даты) и "Заполнено" (есть дата)

И вот, как придумать два разных старта пока не знаю...
Жду Вашей помощи, коллеги!!!

Хм... Я не проверял, как работает, но для Notification есть и added, и modified

Большое спасибо, Владимир!

Получилось! (См. вложенный файл)

Однако, еще надо учесть, что данный процесс должен быть отменен, если:
- напоминание отменено
- задача выполнена до даты напоминания
- задача отменена до даты напоминания

Но, если добавлять в процесс такие события в структуру «ИЛИ по событиям» – возникает ошибка: "Элемент удалить невозможно, так как он используется в процессе"... (см. вложенный файл)

Поделитесь коллеги пжл. решением данного вопроса...

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

Учтите еще, что напоминание может быть не только по задаче

"Ифутин Юрий Борисович" написал:Получилось! (См. вложенный файл)

А зачем вы сделали 2 одинаковых процесса? Мне кажется, что достаточно было одного, но с двумя входами

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

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

"Ифутин Юрий Борисович" написал:добавить "удалить".

на удаление вход не нужен, а нужен выход - там, где в другой ветке ожидаем изменения по таймеру.

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

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

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

Коллеги, помогите пжл. найти ошибку...

Здравствуйте, Юрий!

Средствами приложения запись не удаляется, если она участвует в процессе. Вы можете удалить запись, используя запрос в БД.
Примеры запросов на удаление описаны по ссылке:
https://academy.terrasoft.ru/documents/technic-sdk/7-8/postroenie-zapro…

Добрый вечер, Алексей!

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

PS.
С наступающим Вас праздником Единения!..

Юрий, добрый вечер! Вашу задачу можно решить вообще без разработки, просто правильно изменив схему самого процесса.
Для этого процесс должен быть один. Запускаться он должен или при создании нового напоминания, или при изменении даты существующего.
При этом логика его следующая: он распараллеливается в начале и или завершается так, как вы указали в первом процессе, или сразу идет на выход после изменения даты (как нижняя ветка второго процесса).
Т.о. при создании напоминания запустится экземпляр 1 БП. Если дата изменится, этот экземпляр отменится. Но запустится экземпляр 2 этого же процесса. И будет также выполняться, пока не завершится, или пока не изменится опять дата. И так сколько угодно раз.

"Бондарь Наталия" написал:Если дата изменится, этот экземпляр отменится. Но запустится экземпляр 2 этого же процесса. И будет также выполняться, пока не завершится, или пока не изменится опять дата. И так сколько угодно раз.

Да, такую схему и обсуждали. Но если кто-то захочет удалить это напоминание, то не сможет это сделать, так как по нему запущен процесс.

"Владимир Соколов" написал:
Бондарь Наталия пишет:

Если дата изменится, этот экземпляр отменится. Но запустится экземпляр 2 этого же процесса. И будет также выполняться, пока не завершится, или пока не изменится опять дата. И так сколько угодно раз.

Да, такую схему и обсуждали. Но если кто-то захочет удалить это напоминание, то не сможет это сделать, так как по нему запущен процесс.

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

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

Добрый день.

Создала деталь с выбором из справочника [ConfigItemModel] (создавала на основе примера: создание детали...)
Для детали был создан объект [UsrModelCIInSupplies].
Возникли ошибки при вызове окна справочника

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

2 ошибка. Вы выборе данных, они не вставляются в объект [UsrModelCIInSupplies].
изображение 2

Сам код детали

define("UsrSchema5Detail", ["ConfigurationEnums"],
        function(enums) {
        return {
                entitySchemaName: "UsrModelCIInSupplies",
                attributes: {},
                messages: {},
                methods: {
                        //колонки выбираемые запросом
                        getGridDataColumns: function() {
                                return {
                                        "Id": {path: "Id"},
                                        "UsrConfigItemModel": {path: "UsrConfigItemModel"},
                                        "UsrConfigItemModel.Name": {path: "UsrConfigItemModel.Name"}
                                };
                        },
                        //конфигурирует и отображает модальное окно справочника
                        openUsrConfigItemModelLookup: function() {
                                //конфигурирует объект
                                var config = {
                        //название схемы объекта, записи которого будут отображены в справочнике
                                        entitySchemaName: "ConfigItemModel",
                                        //множественный выбор
                                        multiSelect: true,
                                        //колонки, которые будут отображены в справочнике
                                        columns: ["Name"]
                                };
                                var UsrConsumablesId = this.get("MasterRecordId");
                                if (this.Ext.isEmpty(UsrConsumablesId)) {
                                        return;
                                }
                                //экземпляр класса [EntitySchemaQuery]
                                var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                                        //установка корневой схемы
                                        rootShemaName: this.entitySchemaName
                                });
                                //добовление колонки [Id]
                                esq.addColumn("Id");
                                //добавление колонки [id] из схемы [UsrConfigItemModel]
                                esq.addColumn("UsrConfigItemModel.Id", "UsrConfigItemModelId");
                                //Создание и добаление фильтров в коллекцию запроса
                                esq.filters.add("filterUsrConsumables",
                                this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "UsrConsumables", UsrConsumablesId));
                // Получение всей коллекции записей и отображение ее в модальном окне справочника.
                                esq.getEntityCollection(function(result) {
                                        var existsUsrConfigItemModelCollection = [];
                                        if (result.success) {
                                                result.collection.each(function(item) {
                                                        existsUsrConfigItemModelCollection.push(item.get("UsrConfigItemModelId"));
                                                });
                                        }
                                        // Добавление фильтра в конфигурационный объект.
                                        if (existsUsrConfigItemModelCollection.length > 0) {
                                                var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
                                                        existsUsrConfigItemModelCollection);
                                                existsFilter.comparisonType = this.Terrasoft.ComparisonType.NOT_EQUAL;
                                                existsFilter.Name = "existsFilter";
                                                config.filters = existsFilter;
                                        }
                                        // Вызов модального окна справочника
                                        this.openLookup(config, this.addCallBack, this);
                                }, this);
                        },
                        //обработчик события сохранения страницы редактирвоания
                        onCardSaved: function() {
                                this.openUsrConfigItemModelLookup();
                        },
//открывает справочник МКЕ в случае если странца была редактирвоания РМ была ранее сохранена
                        addRecord: function() {
                                var masterCardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
                                var isNewRecord = (masterCardState.state === enums.CardStateV2.ADD ||
                                masterCardState.state === enums.CardStateV2.COPY);
                                if (isNewRecord === true) {
                                        var args = {
                                                isSilent: true,
                                                messageTags: [this.sandbox.id]
                                        };
                                        this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
                                        return;
                                }
                                this.openUsrConfigItemModelLookup();
                        },
                        //добавление выбранных продуктов
                        addCallBack: function(args) {
                                //экземпляр класса пакетного запроса BatchQuery
                                var bq = this.Ext.create("Terrasoft.BatchQuery");
                                var UsrConsumablesId = this.get("MasterRecordId");
                                //коллекция выбранных в справочнике данных
                                this.selectedRows = args.selectedRows.getItems();
                                //колекция, передаваемая в запрос
                                this.selectedItems = [];
                                // Копирование необходимых данных.
                                this.selectedRows.forEach(function(item) {
                                        item.UsrConsumablesId = UsrConsumablesId;
                                        item.UsrConfigItemModelId = item.values;
                                        bq.add(this.getUsrConfigItemModelInsertQuery(item));
                                        this.selectedItems.push(item.values);
                                }, this);
                                //выполнение пакетного запроса, если он не пустой
                                if (bq.queries.length) {
                                        this.showBodyMask.call(this);
                                        bq.execute(this.onUsrConfigItemModelInsert, this);
                                }
                        },
                        //возвращает запрос на добавление текущего объекта
                        getUsrConfigItemModelInsertQuery: function(item) {
                                var insert = Ext.create("Terrasoft.InsertQuery", {
                                        rootShemaName: this.entitySchemaName
                                });
                                insert.setParameterValue("UsrConsumables", item.UsrConsumablesId,
                                this.Terrasoft.DataValueType.GUID);
                                insert.setParameterValue("ConfigItemModel", item.UsrConfigItemModelId,
                                this.Terrasoft.DataValueType.GUID);
                                return insert;
                        },
                        //метод, вызываемый при добавлении записей в реестр детали
                        onUsrConfigItemModelInsert: function(response) {
                                this.hideBodyMask.call(this);
                                this.beforeLoadGridData();
                                var filterCollection = [];
                                response.queryResults.forEach(function(item) {
                                        filterCollection.push(item.id);
                                });
                                var esq = Ext.cteate("Terrasoft.EntitySchemaQuery", {
                                        rootShemaName: this.entitySchemaName
                                });
                                this.initQueryColumns(esq);
                                esq.filters.add("recordId",
                                Terrasoft.createColumnInFilterWithParameters("Id", filterCollection));
                                esq.getEntityCollection(function(response) {
                                        this.afterLoadGridData();
                                        if (response.success) {
                                                var responseCollection = response.collection;
                                                this.prepareResponseCollection(responseCollection);
                                                this.getGridData().loadAll(responseCollection);
                                        }
                                }, this);
                        },
                        //метод, вызываемый при удалении выбранных записей детали
                        deleteRecords: function() {
                                var selectedRows = this.getSelectedItems();
                                if (selectedRows.length > 0) {
                                        this.set("SelectedRows", selectedRows);
                                        this.callParent(arguments);
                                }
                        },
                        //скрыть пункт меню [Копировать]
                        getCopyRecordMenuItem: Terrasoft.emptyFn,
                        //скрыть пункт меню [Изменить]
                        getEditRecordMenuItem: Terrasoft.emptyFn,
                        //возвращает имя колонки по умолчанию для фильтра
                        getFilterDefaultColumnName: function() {
                                return "UsrConfigItemModel";
                        }
                },
                        // Массив модификаций.
                diff: /**SCHEMA_DIFF*/[
                                {
                                        // Тип операции — слияние.
                                        "operation": "merge",
                                        // Название элемента схемы, над которым производится действие.
                                        "name": "DataGrid",
                                // Объект, свойства которого будут объединены со свойствами элемента схемы.
                                        "values": {
                                                "rowDataItemMarkerColumnName": "UsrConfigItemModel"
                                        }
                                },
                                {
                                        // Тип операции — слияние.
                                        "operation": "merge",
                                        // Название элемента схемы, над которым производится действие.
                                        "name": "AddRecordButton",
                                // Объект, свойства которого будут объединены со свойствами элемента схемы.
                                        "values": {
                                                "visible": {"bindTo": "getToolsVisible"}
                                        }
                                }
                        ]/**SCHEMA_DIFF*/
                };
});

Задача стоит, сделать деталь такой же как, например: деталь [ConfItemUserDetail] в КЕ.

Версия продукта: service enterprise 7.8.2

Нравится

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

Где и как правильно поправить код?

Добрый вечер, Алеся.

Исходя из ошибки - у Вас неправильно строится запрос к базе данных в методе openUsrConfigItemModelLookup. На первом скриншоте явно видно, что запрос не был построен корректно. Проверьте правильность имен колонок, а также правильность связей. SDK.

Ошибка на втором скриншоте результат первой ошибки. Метод addCallBack получил не правильный параметр args и затем у несуществующего свойства selectedRows попытался вызвать метод forEach.

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

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

// Получение всей коллекции записей и отображение ее в модальном окне справочника.
				esq.getEntityCollection(function(result) {
					var existsUsrConfigItemModelsCollection = [];
					if (result.success) {
						result.collection.each(function(item) {
							existsUsrConfigItemModelsCollection.push(item.get("UsrConfigItemModelId"));
						});
					}

изображение 1

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

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

Нравится

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

Добавление данных, которое сформирует активности для пользователей с ролью "Системные администраторы":

Еще нужно записывать повторный запуск процесса в Quartz (через определенное время). Эта тема обсуждалась здесь:
http://www.community.terrasoft.ru/forum/topic/13945

При такой настройке задача действительно поступает группе.
Однако, если это одна задача для роли, то есть для одного из членов группы, то необходимо, чтобы при изменении состояния задачи на "в работе" одним, этот статус должен быть виден и другим.
Фактически предложенное решение - это тиражирование задачи на группу, когда все выполняют одинаковую задачу, а вопрос заключается в постановке ОДНОЙ задачи для РОЛИ, т.е. одной задачи для одного из членов группы, так и не решена.

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

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

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

В sales team 7.8 нужно в бизнес-процессе отправить уведомление текущему пользователю по продажам без активных задач. Но уведомление не появляется в Центре уведомлений. Что делаю неправильно?
В бизнес-процессе есть 2 элемента: Читать продажу и Добавить уведомление.

Элемент "Добавить уведомление" настраиваю так:

Заголовок: "Нет активных задач по продаже"
NotificationType: [#Справочник.Тип уведомлений.Reminding#]
Время: [#Системная переменная.Текущее значение даты и времени#]
Источник: [#Справочник.Источник уведомления.Opportunity#]
Кому: [#Системная переменная.Контакт текущего пользователя#]
Объект: [#Справочник.Объект раздела (представление).Продажа#]
Уникальный идентификатор заголовка: [#Читать продажу.Первый элемент результирующей коллекции.Id#]

Нравится

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

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

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

При запуске процесса валятся ошибки в консоли https://yadi.sk/i/dTz4FzWgxjjf3
Ошибка запроса к RemindingsDataService/GetPopupConfig

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

В sales enterprice 7.8 нужно в карточке счета на стандартной детали Продукт в счете подтянуть некоторые колонки из объекта Продукт. Но после нажатия в меню детали ссылки "Настроить колонки" есть возможность "вытянуть" колонки только из объекта "Продукт в счете" https://yadi.sk/i/Vbg7O83_xg2Tz
Деталь не кастомная. Судя по демо-версии, там наблюдается такая же ситуация с данной деталью.

Нравится

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

Добрый день, Анастасия!

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

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

Добрый день!
Подскажите, пожалуйста, как назначить на кнопку "Квалифицировать" в разделе Лиды собственный бизнес-процесс?

Нравится

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

Кирилл,
Кнопка "Квалифицировать" запускает процесс, который указан в системной настройке "Процесс управления лидом". Можете заменить значение настройки на пользовательский процесс.
Елси потребуется запускать БП из клиентского модуля - примеры можно найти на академии или community:
https://academy.terrasoft.ua/documents/technic-sdk/7-8/zapusk-processa-…

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

Приветсвую!
Есть ли в системе штатная возможность логировать операцию слияния дублей?

Нравится

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

Добрый день!

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

С уважением, Анна

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