Здравствуйте. Помогите реализовать один процесс. При положительном или отрицательном состоянии активности должно приходить уведомление автору этой задачи. Решил попробовать при помощи элемента "Страница редактирования", чтобы не создавались новые задачи и не терялась вся информация, которую доработали. Так вот процесс запускается, однако он приходит к тому, кто изменил состояние, т.е. выполнил условие начального сигнала. Подскажите как можно настроить элемент, чтобы уведомления приходили именно автору активности? Может следует воспользоваться другим элементом?
Благодарю.

Нравится

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

Дмитрий,

Задачу можно решить следующим образом:
1. Стартовый сигнал на изменение состояния активности.
2. Чтение данных. Активность. Id = Пункт 1.Id
3. Добавление данных. Уведомление. Заполнить необходимые поля. Поле Кому = Пункт 2. Автор

"Зарицкий Олег Васильевич" написал:

Дмитрий,

Задачу можно решить следующим образом:

1. Стартовый сигнал на изменение состояния активности.

2. Чтение данных. Активность. Id = Пункт 1.Id

3. Добавление данных. Уведомление. Заполнить необходимые поля. Поле Кому = Пункт 2. Автор


Здравствуйте. Не совсем понял последнего (третьего) пункта. Объясните пожалуйста подробнее.
После написания этого процесса будет создана новая задача или останется старая активность?

Добрый день!

После выполнения третьего пункта будет создано новое уведомление (в коммуникационной панели) автору активности. В уведомление будет ссылка на активность и описание уведомления.

"Зарицкий Олег Васильевич" написал:

Добрый день!

После выполнения третьего пункта будет создано новое уведомление (в коммуникационной панели) автору активности. В уведомление будет ссылка на активность и описание уведомления.

Здравствуйте, Олег. Снова вынужден поднять данный вопрос.
Создал страницу редактирования Активности. Однако, не возможно задать ответственное лицо и время уведомления. Страница просто не редактируемая. С чем это может быть связано? Быть может не правильно идентификаторы прописываю?
Благодарю
[URL=http://radikal.ru/big/e1434526e018474f91b5967e305a35ad][IMG]http://i057…]
[URL=http://radikal.ru/big/705e7efb91594d9f823bf8995e15e2ab][IMG]http://s018…]

"Зарицкий Олег Васильевич" написал:

Дмитрий,

Задачу можно решить следующим образом:

1. Стартовый сигнал на изменение состояния активности.

2. Чтение данных. Активность. Id = Пункт 1.Id

3. Добавление данных. Уведомление. Заполнить необходимые поля. Поле Кому = Пункт 2. Автор

Сделал как вы и написали, но уведомление не приходит. БП проходит все пункты и завершается
[URL=http://radikal.ru/big/29a8000c67a940e9ba2b088910540da1][IMG]http://s019…]

Дмитрий,
Для решения задачи в элементе “Страница редактирования” нет необходимости.
Во вложении пример процесса, который создает уведомление.
usraddremind_1.rar

"Зарицкий Олег Васильевич" написал:

Дмитрий,

Для решения задачи в элементе “Страница редактирования” нет необходимости.

Во вложении пример процесса, который создает уведомление.

usraddremind_1.rar

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

Значение полей в примере заполнены из справочников. За исключением колонки Время - DateTime.Now - создает уведомление в момент выполнения процесса.
Также следует отметить – в системе есть провайдеры, которые с определенным интервалом считают кол-во уведомлений и отображают в коммуникационной панели. Каждый провайдер настроен на определенный объект.
Т.е. если создавать уведомление для объекта на который не настроен провайдер – уведомление добавится в БД, но в коммуникационной панели будет пустая запись.
Пример реализации провайдера в системе – ActivityNotificationProvider.

"Зарицкий Олег Васильевич" написал:

Значение полей в примере заполнены из справочников. За исключением колонки Время - DateTime.Now - создает уведомление в момент выполнения процесса.

Также следует отметить – в системе есть провайдеры, которые с определенным интервалом считают кол-во уведомлений и отображают в коммуникационной панели. Каждый провайдер настроен на определенный объект.

Т.е. если создавать уведомление для объекта на который не настроен провайдер – уведомление добавится в БД, но в коммуникационной панели будет пустая запись.

Пример реализации провайдера в системе – ActivityNotificationProvider.

Уведомление создаётся для Активности, не для нового объекта. Значит провайдер уже есть в системе.
Основные колонки отображения уведомления это будут текущее время и заголовок активности. Кому приходит это на данный момент "контролёру"

Также необходимо указать Источник, Объект, Уникальный идентификатор заголовка, Тип уведомления. Полный перечень указан на скриншоте:

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

Нужно показывать действие по условию.
Сделал действие в карточке:

                getActions: function() {
                    var actionMenuItems = this.callParent(arguments);
                    actionMenuItems.addItem(this.getButtonMenuItem({
                        "Caption": {"bindTo": "Resources.Strings.UsrFormContractCaption"},
                        "Tag": "FormContract",
                        "Visible": {"bindTo": "FormContractVisible"}
                    }));
                    return actionMenuItems;
                },
                FormContractVisible: function(){
                    var contract = this.get("UsrContract");
                    var state = this.get("Status")?this.get("Status").value:false;
                    if(!contract && state == Constants.OrderStatus.formation){
                        return true;
                    }else{
                        return false;
                    }
                }

При режиме карточки всё отрабатывает отлично.
Далее добавил действие в Section.

            getSectionActions: function(){
                var actionMenuItems = this.callParent(arguments);
                actionMenuItems.addItem(this.getButtonMenuItem({
                    "Caption": {"bindTo": "Resources.Strings.UsrFormContractCaption"},
                    "Tag": "FormContract",
                    "Visible": {"bindTo": "FormContractVisible"}
                }));
                return actionMenuItems;
            },
            FormContractVisible: function(){
                var activeRow = this.getActiveRow();
                if(!activeRow) return;
                var Contract = UsrContract || activeRow.values.UsrContract;
                var Status = Status || activeRow.values.Status.value;
                if(!Contract && Status == Constants.OrderStatus.formation){
                    return true;
                }else{
                    return false;
                }
            }

При режиме combined тоже всё стало отрабатывать. Но если в карточке изменить поле, например UsrContract то видимость уже не изменяется. Можно после сохранения карточки, например в функции onCardModuleResponse переинициализировать действия, но как это сделать не нашёл.
Подскажите как правильно реализовать задачу.

Версия 7.7

Нравится

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

Тут есть две проблемы:

1. В activeRow попадают только те колонки, что выведены на реестр. Следовательно и проверять в своей функции FormContractVisible вы можете только те колонки что видны вам в реестре(!). Иначе значения будут неопределенными, и результат проверки явно ошибочным;

2. Метод getSectionActions срабатывает только при смене фокуса между строками реестра, то есть, что бы ваши actionMenuItems увидели изменения в комбинированном режиме, вам нужно перейти от одной записи к другой и обратно, что, не очень то и удобно.

Что бы избежать первой проблемы, вам стоит из activeRow только гуид записи, а остальное вытягивать с помощью запросов ESQ.

Что бы по изменению значения на форме, секция об этих изменениях узнавала в реальном времени, без необходимости переключатся по записям.
Вам стоит использовать сообщения. (sandbox)
Поищите по конфигурации примеры использования, их очень много, ключевые слова: sandbox.subscribe и sandbox.publish

Алгоритм конечной реализации для комбинированного может быть приблизительно таким:

1. Видимость вашего actionMenu итема в секции, вы привязываете к атрибуту секции;
2. В секции, объявляете сообщение, в методе init подписываетесь на него через sandbox.subscribe;
2a. Обработчик этого сообщения меняет атрибут, к которому привязана видимость экшена.
3. В карточке по событию изменения целевых полей, вы генерируете адресное сообщение через sandbox.publish

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

Первое было решено. Я переопределил функцию которая указывает что тянуть в activeRow. Я вытягиваю в этот объект нужные мне колонки без запросов.

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

Да. Надо было всего-лишь в секшене видимость подвязать на атрибут.
Как-то я протупил) Спасибо за наводочку)

"Щиголь Максим" написал:Алгоритм конечной реализации для комбинированного может быть приблизительно таким:

1. Видимость вашего actionMenu итема в секции, вы привязываете к атрибуту секции;
2. В секции, объявляете сообщение, в методе init подписываетесь на него через sandbox.subscribe;
2a. Обработчик этого сообщения меняет атрибут, к которому привязана видимость экшена.
3. В карточке по событию изменения целевых полей, вы генерируете адресное сообщение через sandbox.publish

и такое workaround планируется считать нормальным решением?

"Владимир Соколов" написал:и такое workaround планируется считать нормальным решением?

На то он и workaround, хотя типовое решение не сильно и отличается от него. Т.к. в данном случае было найдено существующее сообщение sandbox. Писать своё, как я понимаю, не пришлось. Проблема была решена подвязкой видимости на атрибут, который изменяется в секции по сообщению CardModuleResponse.

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

Подскажите, пожалуйста, есть ли возможность отключить проверку indentation в функционале проверки кода?
А то количество ошибок таких большое, автоматического beautify нету, а сторонний из Notepad++ никак не удается настроить так, чтобы его взгляд на красоту кода совпадал со взглядом конфигуратора bpm'online :(
А видеть ошибки в коде - полезно, как ни крути..

Нравится

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

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

Ошибки конфигуратора - это проверка кода на красоту, а не его работоспособность. Отключить данную проверку при сохранении схем нет возможности.

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

Здравствуйте, Алексей Владимирович.

Рекомендуем Вам вместо Notepad++ использовать IDE c автоматической проверкой кода на наличие ошибок JavaScript, ведь пропущенная запятая является ошибкой, а не сделанный отступ нет. Например: JetBrains WebStorm, Brackets или Visual Studio 2015 community. Две из этих IDE являются бесплатными.

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

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

Добрый день!

В bpm'online есть возможность с помощью мастера создать несколько страниц на раздел, в зависимости от типов.
А как решить обратную задачу? Решили объединить обратно в одну страницу.

Переэкспериментировали с SysModuleEdit, SysModule, TypeColumnValue, SysModuleEntityId по-всякому, но результата получить не удалось.
Может, кто-то может дать точную инструкцию, как вернуть разделу Контакты стандартную страницу ContactPageV2?

Нравится

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

Здравствуйте, Владимир!

В будущих версиях данная задача будет решатся пользовательскими средствами.
В данном же случае, рекомендуем Вам взять чистую базу, где в разделе [Контакты] одна страница редактирования, и привести к её виду базу, в которой в разделе [Контакты] "несколько страниц редактирования". Обратите внимание на таблицы:

SysModuleEdit
SysModuleEditLcz

Примерно так получилось:

1) update SySModuleEntity set TypeColumnUId = null where SysEntitySchemaUId in (select Uid from SysSchema where Name = 'Contact')

2) update SysModule set CardSchemaUId = '70FF5E22-D786-4439-9465-4CDA09486A3E' where code = 'contact'

Непонятно, что за CardSchemaUId такой левый, т.к. его нет в схемах в базе, но в исходной базе он есть в SysModule

3) update SysModuleEdit set SysModuleEntityId = null where SysModuleEntityId = 'A3E7BF65-7380-E011-AFBC-00155D04320C'

здесь Id - это UID схемы Contact в SysSchema

4) insert into SysModuleEdit select * from SalesOmnichannel_Softkey_MSSQL_ENU_760_938_pg.dbo.SysModuleEdit where SysModuleEntityId = 'A3E7BF65-7380-E011-AFBC-00155D04320C'

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

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

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

Нравится

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

Добрый день, Виктор!

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

Ссылка на скрин: http://cs630829.vk.me/v630829418/126ed/gSvd7QmP4to.jpg

По сути не важно что должно вызывать БП. Главное как запустить из БП данный функционал для листинга.

Нид хэлп!

Есть 2 варианта:

1. Если при нажатии на кнопку вызывается Web-сервис, то с C# кода вызвать необходимый Web-сервис с корректными параметрами.

2. Если при нажатии на кнопку вызывается метод из js, то можно использовать WebSocket'ы.

Пример с использованием WebSocket'ов:

Создать замещающую страницу и добавитьтакой код:
methods: {
init: function() {
Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onTest, this);
this.callParent(arguments);
},
onTest: function(scope, response) {
if (response && response.Header.Sender !== "Test") {
return;
}
--логика метода при нажатии на кнопку
}

В БП добавить задание-сценарий с таким кодом:
var userConnection = UserConnection;
MsgChannelUtilities.PostMessage(userConnection, "Test", String.Empty);

Что то я не понял. Что из этого отменит выгрузку через зипал?
Кнопку мне нажимать не надо. Это должен делать БП.

Добрый день!

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

Данная проблема все еще актуальна.
Саппорт ответил вот что:

Это весь необходимый c# код для "задание-сценарий":
var userConnection = UserConnection;
MsgChannelUtilities.PostMessage(userConnection, "Test", String.Empty);
 
С помощью этого кода вызывается метод на  JS, который удаляет листинги с рекламных площадок. 
Сам метод по удалению листингов должен быть написан на JS.

на схеме страницы за эту функцию отвечает вот что как я понял:

			deleteListings: function(silent) {
				this.showConfirmationDialog(this.get("Resources.Strings.DeleteListingConfirmation"),
					function(result) {
						if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
							AssisHelper.deleteListings.call(this, silent, function() {
								this.set("IsListingPublished", false);
							});
						}
					}, ["yes", "no"]);
			}

Где должен быть этот метод на js?
Как я понял он должен создаться отдельно как то?
Как мне в него передать определенный листинг?

Просто добавить в js схему такой код:
methods: {
init: function() {
Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onTest, this);
this.callParent(arguments);
},
onTest: function(scope, response) {
if (response && response.Header.Sender !== "Test") {
return;
}
--логика метода при нажатии на кнопку
}

А там где написано "--логика метода при нажатии на кнопку" - вставить реализацию метода deleteListings

Ну это я понял.
К примеру у меня в БП читаются данные по 100 листингам. И для каждого надо реализовать вызов как я понял:

var userConnection = UserConnection;
MsgChannelUtilities.PostMessage(userConnection, "Test", String.Empty);

Как лучше это сделать? Что за переменная userConnection? Как оно поймет для какого листинга вызвать метод из схемы?

Этот код нужно просто вставить в задание-сценарий:
var userConnection = UserConnection;
MsgChannelUtilities.PostMessage(userConnection, "Test", String.Empty);

А какие листинги надо удалять и как оно поймёт - это уже зависит от того как Вы придумаете логику, по какому признаку Вы хотите удалять листинги...это уже в JS всё надо делать.

А в С# вызыввается "Test".

Похоже у нас легкое недопонимание.
Давайте я опишу задачу.
У листингов есть поле - Дата окончание договора
Процесс:
1. БП запускается выбирает все листинги у которых дата окончания договора равна сегодня
2. Получаем к примеру 500 листингов в результате.
3. Эти 500 листингов мне надо удалить с выгрузки Зипал.

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

В БП сначала считываете данные , добавляете условие : если "Дата окончание договора" = Сегодня, то выполнить Задание-сценарий(задание-сценарий связывает БП с методом на JS, кот. удаляет листинг).
Рабочего примера, к сожалению, нет.

Я просто не пойму, как этот код:

var userConnection = UserConnection;
MsgChannelUtilities.PostMessage(userConnection, "Test", String.Empty);

понимает что это листинг, где искать js метод, и как передаёт в этот js листинг

В PostMessage передается параметр "Test".
А в JS методе Вы проверяете, если сигнал не равен "Test", то ничего не происходит, иначе отрабатывает логика удаления листингов.

if (response && response.Header.Sender !== "Test") {
return;
}
--логика метода при нажатии на кнопку
}

Уже лучше! Спасибо! Мне надо понять что именно на до сделать и как это работает. Есть еще пару вопросов:
1. Могу ли я пережать еще параметры? К примеру Ид записи?
2. Как данный метод поймет что надо обращаться именно к схеме листинга где лежит метод? И вызвать именно этот метод?
3.

AssisHelper.deleteListings.call(this, silent, function() {
                                                                this.set("IsListingPublished", false);
                                                        });

Я так понимаю что this это сущность данного листинга? Что есть silent?
Не будут ли эти переменные null если вызвать так метод?

В C# коде Вы больше ничего не передаёте, этот код служит только для передачи сигнала.
Все действия,которые вы хотите сделать с листингами, необходимо описывать в JS коде.
Id записи и необходимые значения полей в листинге можно считывать в БП с помощью блока Читать данные.
this - это теккущая сущность, silent - параметр, кот. передается в deleteListings: function(silent) {...}
Почему переменные должны быть null, если метод будет вызываться для того листинга, у которого будет выполнятся определенное условие (Дата окончания договора = сегодня).
Тоесть, БП проходится по всем листингам и проверяет каждый на условие, если условие удовлетворяется, то переходит в блок задание-сценарий, в котором передается сигнал для JS метода удаления текущего листинга.

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

Доброго дня!
Нам надо запускать БП каждый день.
Нашел в SDK статью - Запуск процессов по расписанию.
У меня возникли вопросы:
1. Для какой версии BPM указаны примеры в статье?
2. Как запустить данный планировщик?
3. Как отслеживать работу планировщика? Как посмотреть какие задачи распланированы?

У нас версия 7,6

Нравится

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

Виктор, добрый день! Принцип работы планировщика одинаковый для всех версий 7.x. Для того, чтобы БП запускался с заданным интервалом необходимо: 1. Использовать элемент “Задание сценарий”. Добавить job в планировщик, который будет запускать процесс в указанное время. 2. В пространстве имен (Usings) процесса добавить необходимые классы. 3. Выполнить первичный запуск процесса(вручную или по событию). После того, как процесс дойдет до элемента “Задание сценарий” в планировщик будет добавлена запись, которая будет в дальнейшем запускать процесс. Примеры реализации были рассмотрены в рамках других тем, рекомендуем с ними ознакомиться. https://community.terrasoft.ru/questions/problema-pri-zapuske-bp-iz-pla…

https://community.terrasoft.ru/questions/planirovsik-zapuska-processa

https://community.terrasoft.ru/questions/problema-pri-zapuske-bp-iz-pla… https://community.terrasoft.ru/questions/planirovsik-dobavlenie-process…

Спасибо!
Но все равно по 3 пункту не понятно.

Добрый день!

Подразумевается следующее:
Для того, чтобы процесс запускался автоматически, без вмешательства пользователя, необходимо добавить Job в планировщик. Добавление происходит в элементе “Задание сценарий”. Соответственно необходимо процесс, в котором находится “Задание сценарий”, сперва запустить (первичный запуск). После того, как процесс отработает хотя бы один раз – job будет добавлен. Первичный запуск можно сделать вручную (самостоятельно запустить процесс) или установить в процессе стартовый сигнал, который отработает согласно указанному условию.

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

Виктор, добрый день!

Вы можете посмотреть какие job’ы хранятся в планировщике. Таблица QRTZ_TRIGGERS. При создании job’а (в бизнес-процессе ) рекомендую указывать имя, которое будет ассоциироваться с конкретным процессом.

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

Добавляю в кнопку "Действие" свой пункт, все по фэн-шую, то есть SDK.
Вот фрагмент:

actionMenuItems.addItem(this.getActionsMenuItem({
        Type : "Terrasoft.MenuSeparator",
        Caption : ""
}));
// Добавление пункта меню [Проверить заказ] в список действий страницы редактирования.
actionMenuItems.addItem(this.getActionsMenuItem({
// Привязка заголовка пункта меню к локализуемой строке схемы.
        "Caption" : {
        bindTo : "Resources.Strings.UsrCheckOrder"
},

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

Нравится

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

Здравствуйте, Алексей Владимирович.

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

Пожалуйста..

define("OrderPageV2", ["OrderPageV2Resources", "GeneralDetails", "ProcessModuleUtilities", "NotificationsModule"],
	function(resources, GeneralDetails, ProcessModuleUtilities, NotificationsModule) {
	return {
		entitySchemaName : "Order",
		details: /**SCHEMA_DETAILS*/{},/**SCHEMA_DETAILS*/
		diff: /**SCHEMA_DIFF*/[],/**SCHEMA_DIFF*/
		attributes: {},
		methods: {
			getActions : function() {
				// Вызывается родительская реализация метода для получения
				// коллекции проинициализированных действий базовой страницы.
				var actionMenuItems = this.callParent(arguments);
				// Добавление линии сепаратора для визуального отделения пользовательского действия от списка
				// действий базовой страницы.
				actionMenuItems.addItem(this.getActionsMenuItem({
						Type : "Terrasoft.MenuSeparator",
						Caption : ""
					}));
				// Добавление пункта меню [Проверить заказ] в список действий страницы редактирования.
				actionMenuItems.addItem(this.getActionsMenuItem({
						// Привязка заголовка пункта меню к локализуемой строке схемы.
						"Caption" : {
							bindTo : "Resources.Strings.UsrCheckOrder"
						},
						// Привязка метода обработчика действия.
						"Tag" : "CheckOrderPay"
						// Привязка свойства видимости пункта меню к значению, которое возвращает метод isAccountPrimaryContactSet.
						//"Visible": { bindTo: "isAccountPrimaryContactSet" }
					}));
				actionMenuItems.addItem(this.getActionsMenuItem({
						Type : "Terrasoft.MenuSeparator",
						Caption : ""
					}));
				return actionMenuItems;
 
			},
			// Метод-обработчик выбора действия.
			CheckOrderPay : function() {
				// Получение идентификатора заказа.
				var OrderId = this.get("Id");
				// Объект, который будет передан в качестве аргумента в метод executeProcess.
				var args = {
					// Имя процесса, который необходимо запустить.
					sysProcessName : "UsrCheckOrder",
					// Объект со значением входящего параметра для процесса.
					parameters : {
						idOrder : OrderId
					}
				};
				// Запуск пользовательского бизнес-процесса.
				ProcessModuleUtilities.executeProcess(args);
				//Terrasoft.configuration.NotificationsModule.onShowNewNotificationClick();
				//this.Location.Reload(false);
			}
		},
		rules : {},
		userCode : {}
	};
});

В Resources.Strings.UsrCheckOrder Заголовок и значение одинаковы, Проверить заказ
Строчка с Visible закоментирована в точности как указано, но функции, указанной там, в теле схемы нет..

Здравствуйте, Алексей Владимирович.

Мы проанализировали Ваш код. Данное поведение возникает у Вас, по причине того, что используя статью http://academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/AddActionT… Вы не выполнили пункты начиная с 6-го. После добавления локализированной строки в OrderSectionV2 данная проблема возникать не будет.

Спасибо за анализ, но я не повторяю типовое задание, а делаю свое, и у меня нет необходимости контролировать видимость пункта в зависимости от статуса заказа.
При любом статусе кнопка видна, по задумке.
Сейчас ситуация такова:
1. Ctrl+F5
2. Создаю заказ. Текст пункта виден.
3. Сохраняю заказ.
4. Открываю на редактирование только что созданный заказ - текст не виден.
5. Ctrl+F5 и открываю заказ опять - текст виден.
6. Закрываю заказ кнопкой "Закрыть".
7. Открываю заказ, текст пункта не виден.

Я понимаю, что, возможно, я где-то что-то не так сделал. Мне интересно что делать дальше?
Сейчас вот подумалось, что надо сделать новую локализуемую строку и попробовать ее назначить вместо прежней. Сделаю, отпишусь.

Увы, ситуация не изменилась, текст пропадает.
data-item-marker и текст, с ним совпадающий, показывается только в первый раз после полной перезагрузки.
Попробую пересоздать замещающую схему.

Здравствуйте, Алексей Владимирович.

Копирую Ваш код предварительно изменив его для ContactPageV2 и добавляю локализированную строку.

Результат:
При создании контакта элемент виден.

При открытии контакта элемент отсутствует.

Добавляем замещающую схему раздела с такой же локализированной строкой.

В результате элемент не пропадает.

Сергей, Спасибо! Урок усвоен :redface:

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

Добрый день
Подскажите, можно ли добавить новую деталь Заметки-1 по аналогии с деталью Заметки в существующем разделе, используя рук-во по добавлению новой детали (5.4.6) или в данном случае нужно как-то действовать по другому алгоритму?

Нравится

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

Эта деталь устроена иначе. Фактически, это не деталь с записями, а текстовое бесконечное поле Notes в объекте. Деталь инициализируется в схеме «Инициализировать детали», см. там по слову «Notes». Чтобы сделать ещё одну деталь, нужно вносить в скрипт доработки и добавить в объект ещё одно бесконечное поле.

А где найти этот скрипт?

В схеме «Инициализировать детали».

А где найти эту схему?

В разделе «Конфигурация».

Сделала по инструкции новую Деталь в карточке КЕ. После перезахода в систему - деталь не появилась. Нужно ли чистить Redis или проблема в чем-то другом?

// новая деталь никак не связана с Заметками

// новая деталь никак не связана с Заметками

или какой-то доступ к этой детали нужно создавать? у меня права сист.администратора

Да, нужно почистить Redis, чтобы деталь появилась.

У нас один сервер редис для тестовой и боевой. Если очистить кеш - то придется чистить на двух. Новую деталь я делаю на тестовой системе, на продуктиве - пока нет. После чистки - деталь появится на тестовой?

Если у Вас настроено на один сервер, но разные номера баз, то можно чистить отдельно. См. документацию по Redis.
Конечно, при чистке всего редиса деталь появится там, где она есть и не появится там, где её нет.

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

Для очистки redis не обязательно использовать команду flushall, вы можете очистить редис для конкретной базы с помощью команды flushdb. Более подробно читайте с посте - ссылка.

У нас один сервер redis на нем две базы: 0 -это боевая, 1 -это тестовая . я попытался вести flushdb 1 -получил ошибку без аргументов. Что это значит?

У нас один сервер redis на нем две базы: 0 -это боевая, 1 -это тестовая . я попытался вести flushdb 1 -получил ошибку без аргументов. Что это значит?

Татьяна, если ошибку выдаёт Redis, стоит обратиться к тому, кто его устанавливали настраивал. Возможно, решение найдётся на форумах, посвящённый Redis.
Команда flushdb без аргументов, она чистит текущую базу.

Перед выполнением команды flushdb нужно указать базу, для которой вы хотите её применить. Сделать это можно с помощью команды select <номер базы>. Подробнее можете ознакомиться, например, по этой ссылке.

спасибо

спасибо

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

Доброго времени суток!
Есть развязочная таблица товаров и статей. Справочное поле "Статья" фильтруется по выбранному товару, на основе развязочной таблицы. Каким образом можно вывести все статьи, если в развязочной таблице отсутствуют записи по выбранному товару?

Нравится

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

Олег, здравствуйте!

Пример фильтрации можете посмотреть в схеме «ActivityPageV2» фильтр по колонке «Result».

Спасибо!

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

Добрый день!

При импорте огромного количества записей Excel в BPMOnline 7.6 (около 100000) возникает ошибка "Query execution timed out". Возможно ли решить данную проблему для импорта всех записей в одном файле?

Нравится

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

Илья, здравствуйте!

Ошибка означает, что отправили запрос и не дождались ответа от сервера. В результате приложение «свалилось» по таймауту.
В данном случае можно поступить следующим образом:

- обновиться до 7.7 (был оптимизирован процесс импорта);
- разбить файл для импорта на несколько частей (примерно по 2000 – 10000 записей).

Спасибо, Илья. Но ни один вариант мне не подходит. Так как импорт 100 тыс.записей - это тестовый, а реальный может и 500 тыс. достигать.

"Чубко Илья" написал:

Спасибо, Илья. Но ни один вариант мне не подходит. Так как импорт 100 тыс.записей - это тестовый, а реальный может и 500 тыс. достигать.

____________________________

С уважением, Чубко Илья

Илья, здравствуйте!

К сожалению, в приложении до версии 7.6 не позволяет загружать файл с большим объемом.
пользовтель Мотков Илья Вам предложил несколько вариантов.
Других вариантов на данный момент нет. Вы можете реализовать собственный импорт (например, с помощью SQL загружать на прямую в БД).

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