Добрый день.

Я могу создать при помощи мастера раздела новую сущность и при этом она будет отображена в интерфейсе bpmonline. А если я создал сущность в конфигураторе, при редактировании своего пакета, как мне эту сущность отобразить в интерфейсе, например, в виде реестра? Существует ли простой способ это сделать? Ведь я не могу в мастере раздела указать уже существующую сущность при создании раздела. Заранее спасибо за ответ. 

Нравится

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

Доброго времени суток, дорогое сообщество!

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

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

Нравится

2 комментария
Лучший ответ

Это ошибка в версии 7.12.2. Напишите в поддержку - они предоставят Вам патч) или обновляйтесь на 7.12.3.

Это ошибка в версии 7.12.2. Напишите в поддержку - они предоставят Вам патч) или обновляйтесь на 7.12.3.

Алла Савельева,

Спасибо!

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

Коллеги, тут такое дело. Мы загрузили свой пакет в систему (он, естественно, теперь нередактируемый), но появилась еще одна задача и пришлось унаследоваться от Пейджи  и дописать туда еще один метод, который каждый раз при изменении поля [Стадия], будет апдейтить деталь. Но эта деталь находится на той пейдже от которой мы унаследовались и когда я пишу вот это: this.updateDetail({detail: "UsrSchema4Detailf84a3cb6"});

то ничего не происходит, но ведь должно? (ведь мы унаследовались)...

Нравится

6 комментариев
Лучший ответ

Alex Zaslavsky,

насколько мне известно, метод init() не вызывается при updateDetail()

при вызове метода обновления детали на странице генерируется сообщение 

updateDetail: function(detailConfig) {

                var detailId = this.getDetailId(detailConfig.detail);

                this.sandbox.publish("UpdateDetail", {

                    reloadAll: true

                }, [detailId]);

            }

 

На детали есть подписка на это сообщение:

subscribeSandboxEvents: function() {

                this.sandbox.subscribe("UpdateDetail", function(config) {

                    if (this.destroyed) {

                        return;

                    }

                    this.updateDetail(config);

                    this.processCheckMasterRecordEditRights();

                }, this, this.getUpdateDetailSandboxTags());

            }

и нигде в этой цепочке нет Init()

Можете просто переопределить метод updateDetail или subscribeSandboxEvents на самой детали и заложить логику туда

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

Еще один вариант это попробовать обновлять деталь через сообщение со страницы

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

извините, да, заместил родителя.

Alex Zaslavsky,

попробуйте так 

this.updateDetail(
      {
          detail: "UsrSchema4Detailf84a3cb6",
          reloadAll: true
      }
);

 

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

Не помогло. Тогда можно небольшой ликбез?) Метод updateDetail ведь должен вызвать метод init() самой детали? А то в этом методе висит кое-какая логика, которая не отрабатывает при изменении стадии.

Alex Zaslavsky,

насколько мне известно, метод init() не вызывается при updateDetail()

при вызове метода обновления детали на странице генерируется сообщение 

updateDetail: function(detailConfig) {

                var detailId = this.getDetailId(detailConfig.detail);

                this.sandbox.publish("UpdateDetail", {

                    reloadAll: true

                }, [detailId]);

            }

 

На детали есть подписка на это сообщение:

subscribeSandboxEvents: function() {

                this.sandbox.subscribe("UpdateDetail", function(config) {

                    if (this.destroyed) {

                        return;

                    }

                    this.updateDetail(config);

                    this.processCheckMasterRecordEditRights();

                }, this, this.getUpdateDetailSandboxTags());

            }

и нигде в этой цепочке нет Init()

Можете просто переопределить метод updateDetail или subscribeSandboxEvents на самой детали и заложить логику туда

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

В общем, я пока нашел обходное решение, которое тоже нам подходит с помощью вызова метода addRecord(). Но тем не менее, в схеме детали я пробовал в subscribeSandboxEvents() добавить init() и дебаггер, а на пейдже, где я меняю стадию, вызываю метод updateDetail. В итоге когда я изменил стадию, отработал мой updateDetail, но 

subscribeSandboxEvents() не отреагировал и логика не отработала. Я не разработчик, но пытаюсь со своими скудными базовыми знаниями в этом разобраться :) Спасибо, что пытаетесь помочь.

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

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

Есть статья на академии: https://academy.terrasoft.ru/documents/technic-sdk/7-12/dobavlenie-obrabotchika-makrosa-v-shablone-email-soobshcheniya

Сделал всё как там описано. После добавления макроса в шаблон, типа [#@Invoke.UsrTestStringGenerator#], приходит пустоё значении в письме. Обращение к классу UsrTestStringGenerator при разборе не происходит (добавлял логирование). Может кто сталкивался?

Нравится

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

1) Посмотрите что у вас в таблице EmailTemplateMacros имеется запись с Name='UsrTestStringGenerator ' Возможно записей с Name='@Invoke' у вас не біло и вы не зарегестрировали (в ставили в EmailTemplateMacros) свой макрос!

1)  Вы опубликовали созданую вами схему? Попробуйте перекомпилировать конфигурацию (Конфигурация -> Компилировать все)

По пункту 1:

По пункту 2: Это железно.

 

А как вы отправляете письмо по шаблону?

Пример отправки письма из БП тут. Обратите внимание при отправке письма по шаблону надо указать параметр  [Запись для создания макросов] это id объекта относительно которого будут вычитаны поля макроса!

 

 

Это рассылка, из раздела:

отправляю в шаблоне так:  UsrTestStringGenerator: [#@Invoke.UsrTestStringGenerator#] 

Всё как в статье.

Олег Кречетов,

Из раздела пимьма? Как вы передаете Id записи для создания макроса? Что с остальными параметрами они проинициализированы значениями?

 

Id записи передаётся с клиентской части. Но в том то и смысл макроса, что значение возвращает подготовленный класс. Который в моём случае даже не вызывается. А судя по статье, так можно вставить в тело письма  любой расчетный параметр.

1) Остальные макросы получают значения, если их в тестовом письме нет то добавь и проверь

2) Попробуй пример отправки С БП (тот что я выше тебе кинул) есть разница?

3) d записи передаётся с клиентской части

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

Генератор -  IMacrosInvokable? Это просто интерфейс который реализует класс.

Олег Кречетов,

Спасибо за уточнение существенно облегчило решение вашей проблемы. Естественно имелся в виду генератом (InvokableMacrosHelperService) оторый по шаблону письма создаёт письмо. И который как я подозреваю, не вызывает MacrosInvokable  если с шаблоном не передавать вышеописанное Id объекта.

 

 

 

Григорий,

К сожалению, при облачной рассылке сервис InvokableMacrosHelperService не используется. Используется CESMacrosHelper. 

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

Зверев Александр,

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

Олег Кречетов,

На проекте столкнулся с данной проблемой и мы с ТП решали её месяц-полтора... Вообщем: класс для отправки email с макросами и класс для отправки рассылок - разные. И в одном встроен функционал по обработке сложных макросов кастомными классами, в другом - нет. Самый легкий выход - view, использование колонок из view(стандартные "колоночные" макросы он понимает)

Варфоломеев Данила,

Классы - разные, я понял. отладил. Мне ТП тоже пока не отвечает. Возможно - вьюха - вариант :-) 

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

Можно ли настроить воронку продаж, чтобы сумма показывалась по "Сумме продажи", а не по "Бюджету клиента"?Изображение удалено.

Нравится

4 комментария
Лучший ответ

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

А через представление не пробовали?

Григорий Чех,

а какое представление отвечает за построение воронки продаж? Да и как-то не хочется системные представления редактировать. Обновления-то придут

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

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

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

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

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

В БП добавляю элементы: Чтение данных с чтением коллекции записей по нужным критериям и элемент Отправить E-mail (в качестве получателя Формула: [#Читать данные 1.Коллекция записей:E-mail#] или [#Читать данные 1.Коллекция записей:Контакт#] - не существенно) и при попытке сохранить процесс выдает ошибку: "Возникла ошибка при сохранении: Элемент коллекции с уникальным идентификатором "{F1C3BE1A-40EB-4214-9690-318F52F0D1F7}" не найден". Ошибка точно связана с чтением коллекции записей и ее обработкой, т.к при чтении одной записи - все отлично.

Кто сталкивался с подобным/как исправить или корректно обрабатывать коллекцию?

Нравится

4 комментария
Лучший ответ

На сколько я знаю, на данный момент коллекцию можно обработать только в элементе "Веб-сервис". В следующих релизах будет возможность передачи коллекции в подпроцесс. Информация отсюда, из раздела Бизнес-процессы https://academy.terrasoft.ru/documents/upcoming-releases

На сколько я знаю, на данный момент коллекцию можно обработать только в элементе "Веб-сервис". В следующих релизах будет возможность передачи коллекции в подпроцесс. Информация отсюда, из раздела Бизнес-процессы https://academy.terrasoft.ru/documents/upcoming-releases

Сидоров Александр Валерьевич,

Спасибо. А есть ли какие-то прогнозы когда можно будет использовать "простым смертным" прелести коллекций?:)

Хованский Владислав,

это вам к разработчикам bpm'online) но полагаю, что в следующем релизе

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

Добрый день!

Может кто сталкивался с подобной задачей:

Необходимо импортировать контакты, но у большинства - несколько рабочих телефонов. Система сама не понимает, что это 2-3 телефона, записанных через запятую (а жалко). Как поступить в этом случае? Разделять телефоны в системе через какой-то БП, разделять в самой базе или извратиться с изначальным файлом (просто может быть ситуация с уже загруженными данными).

Задача довольно интересная, надеюсь кто-то ее действительно решал.

Нравится

1 комментарий
Лучший ответ

Правильно разделять. Система позволяет добавлять несколько телефонов одного типа. Разделите и потом не будет проблем с поиском/объединением дублей,  IP телефонией и sms рассылками. 

Правильно разделять. Система позволяет добавлять несколько телефонов одного типа. Разделите и потом не будет проблем с поиском/объединением дублей,  IP телефонией и sms рассылками. 

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

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

Признак правила поиска "Использовать правило при сохранении" установлен.

Провел отладку: метод findDuplicates() модуля DuplicatesSearchUtilitiesV2 корректно передает данные в DeduplicationService.FindDuplicatesOnSave()

В свою очередь метод сервиса FindDuplicatesOnSave вызывает метод DeduplicationProcessing.FindDuplicates, из которого идет обращение к хранимой процедуре tsp_FindDuplicates.

Код хранимой процедуры не отличается от кода этой же процедуры на чистой базе.

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

В чем может быть проблема? Есть подозрение, что проблема появилась после перехода на версию 7.12

Нравится

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

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

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

Если это сделано, дело ещё может быть в том, что в разделе Контакты есть несколько карточек редактирования. Работа в таком режиме была исправлена в 7.12.2.



Рекомендуем обновить до версии 7.12.2, после обновления проблема будет решена. А на версии 7.12.3 также работает поиск дублей при сохранении при создании контакта через мини-карточку.

Мотков Илья пишет:

Дизайнер системы -> Правила поиска дублей

А что делать, если в дизайнере системы на 7.16 нет "Правила поиска дублей"? Где оно включается?

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

Добрый день!



Стал вопрос об обновлении реестра детали в конце работы БП. 



В чем суть:



1) На детали, в редактируемом реестре, изменяются значения (кол-во работ) или добавляется новая строка

2) БП ловит добавление/изменение и высчитывает сумму (кол-во работ * стоимость) и записывает это в поле, отображающееся в реестре детали



3) Требуется обновление этого реестра



И если первые 2 пункта выполняются на "ура" и без проблем, то с реализацией 3 пункта у меня появились проблемы. При этом хотелось бы выполнить все в одном БП, возможно поможет элемент процесса [Задание-сценарий]? Был бы благодарен за предоставленную помощь.

Нравится

7 комментариев
Лучший ответ

Опишу более подробно 2й варинат

1) в конце БП  добавить скрипт таск и в нем

//ваше сообщение
string sender = "MyBpFinish";
//Доп. информация
string messageText
// Публикация сообщения по WebSocket.
MsgChannelUtilities.PostMessageToAll(sender, messageText);

2) Создать замещающий клиентский модуль ,  задав родительский объект схему ClientMessageBridge

define("ClientMessageBridge", ["ConfigurationConstants"],
    function(ConfigurationConstants) {
        return {
            // Сообщения.
            messages: {
                //Имя сообщения.
                "MyBpFinish": {
                    // Тип сообщения — широковещательное, без указания конкретного подписчика.
                    "mode": Terrasoft.MessageMode.BROADCAST,
                    // Направление сообщения — публикация.
                    "direction": Terrasoft.MessageDirectionType.PUBLISH
                }
            },
            methods: {
                // Инициализация схемы.
                init: function() {
                    // Вызов родительского метода.
                    this.callParent(arguments);
                    // Добавление нового конфигурационного объекта в коллекцию конфигурационных объектов.
                    this.addMessageConfig({
                        // Имя сообщения, получаемого по WebSocket.
                        sender: "MyBpFinish",
                        // Имя сообщения с которым оно будет разослано внутри системы.
                        messageName: "MyBpFinish"
                    });
                },
                // Метод, выполняемый после публикации сообщения.
                afterPublishMessage: function(
                    // Имя сообщения с которым оно было разослано внутри системы.
                    sandboxMessageName,
                    // Содержимое сообщения.
                    webSocketBody,
                    // Результат отправки сообщения.
                    result,
                    // Конфигурационный объект рассылки сообщения.
                    publishConfig) {
                    if (sandboxMessageName === "MyBpFinish") {
                        var name = webSocketBody.name;
                        window.console.info("Опубликовано сообщение: " + sandboxMessageName +
                            ". Данные: name: " + name );
                    }
                }
            }
        };
    });

3) Подписаться на получение сообщений MyBpFinish в любой клиентской схеме

 

define("AccountSectionV2", [],
    function(BusinessRuleModule, ConfigurationConstants) {
        return {
            //entitySchemaName: "Contact",
            messages: {
                //Имя сообщения.
                "MyBpFinish": {
                    "mode": Terrasoft.MessageMode.BROADCAST,
                    "direction": Terrasoft.MessageDirectionType.SUBSCRIBE
                }
            },
            methods: {
                // Инициализация схемы.
                init: function() {
                    this.callParent(arguments);
                    this.sandbox.subscribe("MyBpFinish", this.onMyBpFinish, this);
                },
                // Обработчик события получения сообщения NewUserSet.
                onMyBpFinish: function(args) {
                    //Обновим грид
                    this.refreshGridData();
                }
 
            }
        };
    });

 

При запуске БП передавай callback который вызовется после отработки БП

Примерно так

 

ProcessModuleUtilities.executeProcess({
	"sysProcessName": ProcessName,
	"parameters": {
		UsrParam1: paramValue
	},
	"callback": this.greadReloadProcessCallback(),
	scope: this
}

 

Григорий Чех,

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

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

Посмотри действие процесса Обновить запись в реестре

Второй вариант отправить по вєб сокету сообщение и подписатся в  реестре на него и по приходу сообщения обновить реестр.

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

 

 

 

 

Опишу более подробно 2й варинат

1) в конце БП  добавить скрипт таск и в нем

//ваше сообщение
string sender = "MyBpFinish";
//Доп. информация
string messageText
// Публикация сообщения по WebSocket.
MsgChannelUtilities.PostMessageToAll(sender, messageText);

2) Создать замещающий клиентский модуль ,  задав родительский объект схему ClientMessageBridge

define("ClientMessageBridge", ["ConfigurationConstants"],
    function(ConfigurationConstants) {
        return {
            // Сообщения.
            messages: {
                //Имя сообщения.
                "MyBpFinish": {
                    // Тип сообщения — широковещательное, без указания конкретного подписчика.
                    "mode": Terrasoft.MessageMode.BROADCAST,
                    // Направление сообщения — публикация.
                    "direction": Terrasoft.MessageDirectionType.PUBLISH
                }
            },
            methods: {
                // Инициализация схемы.
                init: function() {
                    // Вызов родительского метода.
                    this.callParent(arguments);
                    // Добавление нового конфигурационного объекта в коллекцию конфигурационных объектов.
                    this.addMessageConfig({
                        // Имя сообщения, получаемого по WebSocket.
                        sender: "MyBpFinish",
                        // Имя сообщения с которым оно будет разослано внутри системы.
                        messageName: "MyBpFinish"
                    });
                },
                // Метод, выполняемый после публикации сообщения.
                afterPublishMessage: function(
                    // Имя сообщения с которым оно было разослано внутри системы.
                    sandboxMessageName,
                    // Содержимое сообщения.
                    webSocketBody,
                    // Результат отправки сообщения.
                    result,
                    // Конфигурационный объект рассылки сообщения.
                    publishConfig) {
                    if (sandboxMessageName === "MyBpFinish") {
                        var name = webSocketBody.name;
                        window.console.info("Опубликовано сообщение: " + sandboxMessageName +
                            ". Данные: name: " + name );
                    }
                }
            }
        };
    });

3) Подписаться на получение сообщений MyBpFinish в любой клиентской схеме

 

define("AccountSectionV2", [],
    function(BusinessRuleModule, ConfigurationConstants) {
        return {
            //entitySchemaName: "Contact",
            messages: {
                //Имя сообщения.
                "MyBpFinish": {
                    "mode": Terrasoft.MessageMode.BROADCAST,
                    "direction": Terrasoft.MessageDirectionType.SUBSCRIBE
                }
            },
            methods: {
                // Инициализация схемы.
                init: function() {
                    this.callParent(arguments);
                    this.sandbox.subscribe("MyBpFinish", this.onMyBpFinish, this);
                },
                // Обработчик события получения сообщения NewUserSet.
                onMyBpFinish: function(args) {
                    //Обновим грид
                    this.refreshGridData();
                }
 
            }
        };
    });

 

Григорий Чех 

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

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

Коллеги, добрый день.

После обновления на 7.12.3.980 возникла ошибка при отправлении писем с панели "Следующий шаг".

Выяснилось, что наряду с  полем Recepient  появилось новое поле Recipient (https://yadi.sk/i/P3g6M4wf3aeEfg). 

И именно заполнение этого поля требуется при отправке письма.



Зачем добавлено это поле? 

Как быть с обращениями клиентов об ошибках при отправке, если схема EmailMessagePublisherPage дорабатывалась на основе поля Recepient?

Нравится

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

Правильно пишется «Recipient», лучше привязываться к нему. Видимо, не сразу заметили и исправили. А в объекте оставили старое, чтобы не сломать связь с полем в таблице базы.

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