Вопрос

Есть такой метод:

addRecords: function(detailColumnName, segmentName, isEditableSegment) {
            var masterId = this.get("MasterRecordId");
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: this.entitySchemaName
            });
            esq.addColumn(segmentName);
            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));
            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));
            esq.getEntityCollection(function(result) {
                var existsContactsCollection = [];
                if (result.success) {
                    result.collection.each(function(item) {
                        existsContactsCollection.push(item.get(segmentName).value);
                    });
                }
                var config = {
                    entitySchemaName: segmentName,
                    multiSelect: true,
                    columns: ["Type"]
                };
                
                var isAccount;
                if (segmentName === "Account") {
                    config.filters = Ext.create("Terrasoft.FilterGroup");
                    config.filters.add("first", Terrasoft.createColumnFilterWithParameter(
                        Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));
                    isAccount = true;
                }
                if (existsContactsCollection.length > 0) {

                    var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsContactsCollection);
                    existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;

                    existsFilter.Name = "existsFilter";
                    if (isAccount) {
                        config.filters.add("second", existsFilter);
                    } else {
                        config.filters = existsFilter;
                    }
                }
                this.openLookup(config, function(config) {
                    methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);
                }, this);
            }, this);
        },
где detailColumnName = "Campaing",
segmentName = "Product",
entitySchemaName = "ProductUsage"

В ProductUsage есть идентификатор родительского объекта (Campaing) и идентификатор продукта (Product)

Он нужен для того, чтобы лукап выводил только те записи, которых нет в детали для этого объекта и отрабатывает корректно, но вот когда на детали больше записей, чем 2100, БД SQL выдает ошибку, что конструкция IN принимает максимум 2100 параметров, поэтому я решил переделать запрос под конструкцию NotExists.

Изменил этот метод с фильтрами на следующий:

addNotExistsRecords: function(detailColumnName, segmentName, isEditableSegment) {
            var masterId = this.get("MasterRecordId");
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: this.entitySchemaName
            });
            esq.addColumn(segmentName);
            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));
            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));
            esq.filters.add("isEqualsTo", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "Product.Id", "ProductId"));
                
            var config = {
                entitySchemaName: segmentName,
                multiSelect: true,
                columns: ["Type"]
            };
            
            var isAccount;
            if (segmentName === "Account") {
                config.filters = Ext.create("Terrasoft.FilterGroup");
                config.filters.add("first", Terrasoft.createColumnFilterWithParameter(
                    Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));
                isAccount = true;
            }
            
            var existsFilter = Terrasoft.createNotExistsFilter("Id", esq);
            existsFilter.Name = "existsFilter";
            if (isAccount) {
                config.filters.add("second", existsFilter);
            } else {
                config.filters = existsFilter;
            }
            
            this.openLookup(config, function(config) {
                methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);
            }, this);
        },

 

Однако при выполнении происходит ошибка errorCode: "NotSupportedException", message: "None", stackTrace: undefined, errors: Array(0)
Где я ошибся при построении фильтров?

По сути нужно повторить такой запрос:

select Id from Product where NOT EXISTS(select Id from ProductUsage where CampaignId = 'f39db115-d2f4-4936-b415-bf6543187463' AND IsDeleted = 'false' AND Product.Id = ProductId)
 

У меня такой же вопрос

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

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

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

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

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

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

Коллеги, доброго дня!

На странице лендинга клиент может вложить файл. Нужно передать этот файл в лид как вложение на деталь Файлы и Ссылки.

Что то никак не можем записать его в облачную систему.

Подскажите,  какие варианты есть. Спасибо!

У меня такой же вопрос

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

По идее, если на сайте перед отправкой, преобразовать файл в BLOB, то никаких проблем со вставкой в BPM возникнуть уже не должно

Как вариант, можно не использовать механизм лендингов, а по веб-форме, не связанной с bpm'online, генерировать и отправлять письмо со вложениями.

Затем в bpm'online его разбирать как обычное письмо со вложениями. Подробнее см. обсуждение похожего вопроса.

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

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

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

В bpm'online marketing реализовать раздел 'Опросы', в котором была бы возможность преднастраивать анкету опроса (вопросы анкеты могут быть разных типов - дата, строка, справочник) и потом по этой анкете проводить опрос для указанной целевой аудитории.

Подобная функциональность когда-то была реализована в Terrasoft 3.X. 

Обсуждение
3 комментария

Алла, недавно же обсуждали и нашли в маркете несколько реализаций.

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

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

Можешь сделать своё дополнение (например, не коннектор к сторонним сервисам, а чисто ввод опросов в системе) и тоже выложить в маркет.

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

В Terrasoft CRM 3.X был раздел опросы, в котором можно было вносить информацию по опросам целевой аудитории.

Хотелось бы уточнить есть ли в bpm'online marketing возможность вносить информацию по опросам целевой аудитории, по заранее преднастроенной анкете, потому что в документации такую информацию не нашла.

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

У меня такой же вопрос

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

Привет, думаю что тебе подойдет  решение Google Forms connector for bpm'online

 

решение Inbook Connector for bpm'online

решение SurveyMonkey Connector for bpm'online

или дополнение для управления анкетами и опросами в bpm'online Questionnaire management for bpm'online

 

 

Привет, думаю что тебе подойдет  решение Google Forms connector for bpm'online

 

решение Inbook Connector for bpm'online

решение SurveyMonkey Connector for bpm'online

или дополнение для управления анкетами и опросами в bpm'online Questionnaire management for bpm'online

 

 

Очень странно, что в базовой версии bpm'online marketing, нет такой нужной для маркетологов функциональной возможности.

Более того, даже ПО для программ лояльности, каковым было bpm'online Loyalty 5.3, сейчас представлено сторонними Loyalty on bpm'online от ПТ и TSI Loyalty on bpm'online от TSI.

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

Выше представлены коннекторы к готовым платформа, однако имеется опыт разработки локального решения. 
Все сводилось к restAPI (получение информации от сервиса о совершенных опросах), json ответ парсился вставлялся в подготовленный раздел (простая карточка, правда с кучей деталей а-ля: Вопросы, Ответы. В записях с вопросами/ответами - тип вопроса, варианты, вес и т.п) Выглядело Громоздко и непонятно для пользователя. Однако если натянуть данные на view и на её основании строить график, то в принципе читаемо

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

А мне как раз такой раздел нужен не для аналитики, а для внесения информации.

То есть меня интересует инструмент для удобного ведения и внесения данных.

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

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

Добрый день,

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

Есть ли более оптимальный способ?

У меня такой же вопрос

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

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

Либо же дорабатывать стандартную логику, которая создаёт контакт по лиду, добавить туда новые поля. Есть несколько БП, которые могут быть связаны с этим: «Квалификация лида», «Идентификация лида» и их старые версии. Нужно смотреть точно, какая из них задействована в Вашем случае.

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

Добрый день.

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

У меня такой же вопрос

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

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

О какой рассылке вы спрашиваете, какой процесс?

Григорий Чех, речь об рассылках которые создаются через раздел E-mail https://academy.terrasoft.ru/documents/marketing/7-12/razdel-email?docu…

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

Григорий Чех, спасибо. Система в облаке. 

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

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

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

У меня такой же вопрос

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

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

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

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

Спасибо!

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

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

Есть статья на академии: 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(стандартные "колоночные" макросы он понимает)

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

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

Войдите или зарегистрируйтесь, чтобы комментировать

Добрый день!

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

Затем был создан кастомный элемент с типом: CampaignSchemaElementType.AsyncTask.  Была построена и запущена схема кампании: 
Однако, согласно дебаггеру, добавление из группы всегда происходит сразу после запуска джоба по расписанию, а затем выполняется кастомный элемент, несмотря на то, как построена схема.

В качестве решения попытались изменить тип элемента на: CampaignSchemaElementType.SyncTask , однако элемент перестал запускаться вовсе.
Соответственно есть несколько вопросов:
1) Как выполнить элемент "Добавление из группы" строго после выполнения предыдущего элемента? 
2) Как запустить элемент с типом CampaignSchemaElementType.SyncTask вместо Async

У меня такой же вопрос

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

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

Мотков Илья,

Решение: изменяем тип элемента AddCampaignParticipantElement на CampaignSchemaElementType.AsyncTask . Теперь выполнение элемента происходит в верной последовательности. Проверено на такой схеме. 

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

У клиента установил систему Marketing 7.12.0.

После авторизации вылетает следующая ошибка:

This page isn’t working. localhost redirected you too many times. Try clearing your cookies

Куки чистил. Пробовал запускать в других браузерах. Не помогло.

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

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

 

 

 

У меня такой же вопрос

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

Данная ошибка связана со старой версией Redis-сервера. Установите последнюю актуальную версию: 4.0 дл Linux или 3.2 для Windows - http://ftp.bpmonline.com/support/pub/redis32.rar

Данная ошибка связана со старой версией Redis-сервера. Установите последнюю актуальную версию: 4.0 дл Linux или 3.2 для Windows - http://ftp.bpmonline.com/support/pub/redis32.rar

Антон Малий,

Спасибо, помогло

Войдите или зарегистрируйтесь, чтобы комментировать