Добрый день. Есть БП который выполняется в сумме около 8 часов, запускается по таймеру, таймер выставлен на 19:00, но БП запускается сам когда захочет, захочет в 2 ночи, захочет в 13 дня, захочет в 8 утра, из-за чего это может быть, может кто-нибудь подскажет?

Нравится

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

1. Проверьте, корректно ли реализован запуск процесса по расписанию.

2. Возможно, что проблема в работе Quartz, и требуется его обновление или оптимизация работы Вашего бизнес-процесса.

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

Также Вы тегнули, что используете версию 7.13, потому рекомендую обновиться до более 'свежей', а в идеале до последней версии, которой на текущий момент является версия 7.15. Учтите, что обновление с версии на версию нужно выполнять последовательно.

добрый день,

я встречал два таких случая: 1. таймер попал на техническое окно когда систему компилировали, 2. очередь планировщика была переполнена и все процессы по таймеру и событиям задерживали выполнение.
к сожалению без техподдержки вам не обойтись. если вы работаете on-site и имеете доступ к планировщику, то можете воспользоваться приемами, описанными на академии https://academy.terrasoft.ru/documents/technic-sdk/7-14/rekomendacii-po-nastroyke-planirovshchika-zadaniy

1. Проверьте, корректно ли реализован запуск процесса по расписанию.

2. Возможно, что проблема в работе Quartz, и требуется его обновление или оптимизация работы Вашего бизнес-процесса.

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

Также Вы тегнули, что используете версию 7.13, потому рекомендую обновиться до более 'свежей', а в идеале до последней версии, которой на текущий момент является версия 7.15. Учтите, что обновление с версии на версию нужно выполнять последовательно.

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

Добрый день!

Установила дополнение "Excel pivot report for bpm'online" (Построение сводных таблиц данных и импорт в Excel).

https://marketplace.terrasoft.ru/app/excel-pivot-report-bpmonline

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

Подскажите пожалуйста, с чем может быть связана данная проблема? Может необходимо что-либо поправить?

Нравится

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

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

Для решения данной проблемы напишите, пожалуйста, в тех. поддержку: support@crm-bpm.ru

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

Oleksii Dybkov,

Не появляется. Этот раздел не появляется даже на этапе добавления (при настройке рабочего места - в списке разделов). На этапе добавления раздела, он доступен, но при условии нажатия кнопки "Выбрать", окно выбора закрывается, а раздел не появляется.

Oleksii Dybkov,

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

Для решения данной проблемы напишите, пожалуйста, в тех. поддержку: support@crm-bpm.ru

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

Подскажите пожалуйста, установили дополнения по автоматическому планированию активностей:  https://marketplace.terrasoft.ru/app/recurring-activities-scheduler

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

"Создание повторяющихся активностей завершено с ошибкой. Обратитесь к системному администраторуThe time zone parameter 'Russia TZ 2 Standard Time' provided to AT TIME ZONE clause is invalid. "

Что необходимо поправить?

Нравится

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

Относительно данной ошибки обратитесь к разработчику этого дополнения bpmonlinelabs@bpmonline.com

Относительно данной ошибки обратитесь к разработчику этого дополнения bpmonlinelabs@bpmonline.com

Добрый день! Удалось как-то решить проблему? Столкнулись с такой же ошибкой, написали разработчикам на предоставленную почту, ответа нет.

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

 

обращения по решениям Dev Labs обрабатываются через посты на Community. Дополнение поддерживает работу со стандартными тайм зонами. Ниже прилагаю список тайм зон для РФ:

Ирина Лазоренко,

Добрый день! Спасибо. По БД проверил - таймзоны такие присутствуют. В настройках пользователя из которого создать пытаюсь повторяющуюся активность стоит часовой пояс 
"Волгоград, Москва, Санкт-Петербург (RTZ 2) (GMT+03:00)"
Формат времени: "Русский (Россия)".
Однако всё-равно ошибка, похожая на ту, что в заголовке топика:

 

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

Добрый день!

Коллеги, подскажите пожалуйста, попробовала поставить дополнение "Change log" .

Ссылка:     https://marketplace.terrasoft.ru/app/change-log-bpmonline

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

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

Нравится

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

Добрый день.

В карточке редактирования той сущности, для которой настроено логирование, на вкладке [История изменений] в детали 'Журнал изменений' настроить реестр записей аналогично, как и для других деталей. В настройке выбрать колонки 'Создал' и 'Дата создания':

Добрый день.

В карточке редактирования той сущности, для которой настроено логирование, на вкладке [История изменений] в детали 'Журнал изменений' настроить реестр записей аналогично, как и для других деталей. В настройке выбрать колонки 'Создал' и 'Дата создания':

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

Алла, спасибо огромное! Разобралась.

 

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

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

Например: 

Время разрешения - 18.10.2019 17:00

Текущее время - 18.10.2019 16:00

----------------В реззультате--------------------------------------

Остаток срока по обработке обращения - 01:00 (1 час) 

В документации, посвященной расчету срока реакции и разрешения, написано, что в карточке "Обращение" отображается поле "Осталось" (см. скрин)

Его фактически и необходимо отображать при выгрузке отчета (на момент выгрузки отчета)

Просьба подсказать какие способы реализации существуют по моей проблеме?

Нравится

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

Если поле в объекте уже есть и в таблице в базе там правильные значения, то способ реализации будет только один — открыть настройки и шаблон отчёта и вписать там это поле. Как именно — зависит от движка, на котором построен отчёт.

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

Привет,

Есть вопрос,

Версия: 7.13.4.638_SalesEnterprise_Marketing

На данный момент перехожу от алгоритма разработки:

1. В конфигураторе создать пакет, указать для него SVN

2. Добавление frontend компонентов через конфигуратор с отладкой в chrome dev tools

3. Добавление backend компонентов через конфигуратор с отладкой в дебаг проекте в VS

4. Коммит в SVN

к следующему примерному алгоритму:

1. Настроить BPM для разработки в файловой системе.

2. Выгрузить пакеты в конфигурационный проект при помощи конфигуратора либо bpmCli, либо через workspace console.

3. Реализовать код фронта/бека в конфигурационном проекте

4. При помощи workspace console залить изменения в bpm и скомпилировать ,если были изменены c# классы.

5. Закоммитить в GIT

Вопросы:

Какие лучшие практики используются для ускорения разработки с точки зрения инструментария?

Что хранить в GIT? Пакеты как в SVN, либо при помощи bpmCli выгрузить пакеты из сайта, затем каждый пакет преобразовать в проект, прикрепить к общему solution, и хранить это, а если нужно загрузить пакеты на сайт, то при помощи bpmCli собрать пакет из проекта и сделать pull?

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

Как отлаживать фронт, используя например VS Code?

 

Нравится

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

Добрый день. Информация о разработке в файловой системе есть в статьях Академии.

Обратите внимание, Вы используете довольно устаревшую версию 7.13.4. Лучшей практикой будет обновить систему до актуальной 7.15.

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

Привет,

Столкнулся с проблемой:

Версия: 7.13.4.638_SalesEnterprise_Marketing

Программа: bpmcli, релиз 1.2 https://github.com/Advance-Technologies-Foundation/bpmcli/releases

Выполнил по мануалу из гита регистрацию bpmcli, выполнил команду bpmcli install-gate, которая, судя по логу в консоли завершилась успешно. Далее перекомпилировал конфигурацию, в списке пакетов появился bpmcligate.

Однако, при выполнении любой команды возникает ошибка Your app does not contain bpmcli API. 

В данном случае утилита мне нужна для того, чтобы выгружать пакеты из BPM "pull-pkg UsrIntegrations -e dev -d C:\Instruments\test\", находящейся в режиме разработки в файловой системе, затем создавать из пакетов проекты bpmcli convert UsrIntegrations.

Нравится

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

У bpmcli исходники открыты. Вот место, где выводится это сообщение:

private static string ApiVersionUrl => _url + @"/0/rest/BpmcliApiGateway/GetApiVersion";
.....
public static void CheckApiVersion() {
	var dir = AppDomain.CurrentDomain.BaseDirectory;
	string versionFilePath = Path.Combine(dir, "bpmcligate", "version.txt");
	var localApiVersion = new Version(File.ReadAllText(versionFilePath));
	var appApiVersion = GetAppApiVersion();
	if (appApiVersion == new Version("0.0.0.0")) {
		MessageToConsole($"Your app does not contain bpmcli API." +
		 $"{Environment.NewLine}You should consider install it via the \'bpmcli install-gate\' command.", ConsoleColor.DarkYellow);
	} else if (localApiVersion > appApiVersion) {
		MessageToConsole($"You are using bpmcli api version {appApiVersion}, however version {localApiVersion} is available." +
		 $"{Environment.NewLine}You should consider upgrading via the \'bpmcli update-gate\' command.", ConsoleColor.DarkYellow);
	}
}
 
 
private static Version GetAppApiVersion() {
	var apiVersion = new Version("0.0.0.0");
	try {
		string appVersionResponse = BpmonlineClient.ExecuteGetRequest(ApiVersionUrl).Trim('"');
		apiVersion = new Version(appVersionResponse);
	} catch (Exception) {
	}
	return apiVersion;
}

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

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

После установки пакета 

bpmcligate и перекомпиляции в системе не появился сервис, к которому обращается утилита. Возможно пакет нужно установить как то иначе?

На всякий случай ещё попробуйте перезапустить сайт и очистить Redis. Тут ведь происходит не просто установка пакета, сервис должен появиться на стороне IIS.

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

Добрый день

в наличии bpmonline, куплен Terrasoft Messaging Service.

Подскажите каким образом осуществляется связь  с asterisk.

Насколько я понял Terrasoft Messaging Service осуществляет связь bpmonline по ami . Каким образом осуществляется проброс звонка на ответственного ? (получается нужно при помощи  апи  и телефона звонящего узнать  из bpmonline ответственного и перенаправить звонок ему. Что будет ему карточку всплывашку показывать.???)

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

спасибо. 

Нравится

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

sandal пишет:
Литвинко Павел,Спасибо за ответ. Ситуация - звонит клиент , астер принял звонок необходимо направить на ответственного за данный номер ? (по идее надо выдернуть номер ответственного из bpmonline и средствами астера направить на ответственного ). тут же вопросы по как сделать всплывашку для ответственного в bpmonline. Может есть коннектор платный который может перенаправлять на ответственного , показывать всплывашку..... спасибо

Вам нужно делать интеграцию по средствам веб-сервисов с Астериском, где в BPM найдете ответственного, узнаете его номер линии и передадите Астериску, а Астериск на своей стороне уже осуществит перенаправление на нужную линию. Без интеграции никак. Либо давать доступ в БД, для Астериска, чтобы они сами делали запросы в нужные таблицы и искали нужного человека и уже потом распределяли.
Со стороны BPM например сделать табличку, в которую будут записываться Номера линий и их связанные записи, для упрощения поиска Астериску и для уменьшения доступа в БД. 

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

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

Если в движке телефонии есть возможность запуска скриптов, можно на стороне 7.13 сделать веб-сервис (анонимный или с авторизацией), который по номеру клиента возвращает номер сотрудника, а далее работать с ним.

Литвинко Павел,

Спасибо за ответ. Ситуация - звонит клиент , астер принял звонок необходимо направить на ответственного за данный номер ? (по идее надо выдернуть номер ответственного из bpmonline и средствами астера направить на ответственного ). тут же вопросы по как сделать всплывашку для ответственного в bpmonline. Может есть коннектор платный который может перенаправлять на ответственного , показывать всплывашку..... спасибо

sandal пишет:
Литвинко Павел,Спасибо за ответ. Ситуация - звонит клиент , астер принял звонок необходимо направить на ответственного за данный номер ? (по идее надо выдернуть номер ответственного из bpmonline и средствами астера направить на ответственного ). тут же вопросы по как сделать всплывашку для ответственного в bpmonline. Может есть коннектор платный который может перенаправлять на ответственного , показывать всплывашку..... спасибо

Вам нужно делать интеграцию по средствам веб-сервисов с Астериском, где в BPM найдете ответственного, узнаете его номер линии и передадите Астериску, а Астериск на своей стороне уже осуществит перенаправление на нужную линию. Без интеграции никак. Либо давать доступ в БД, для Астериска, чтобы они сами делали запросы в нужные таблицы и искали нужного человека и уже потом распределяли.
Со стороны BPM например сделать табличку, в которую будут записываться Номера линий и их связанные записи, для упрощения поиска Астериску и для уменьшения доступа в БД. 

Литвинко Павел,

авторизация на php проходит. попытка выдернуть номер ответственного не удается. смотрел как https://docs.webitel.com/pages/viewpage.action?pageId=73793602 . на выходе 

[3] => {"rowConfig":{"Id":{"dataValueType":0},"Name":{"dataValueType":1},"OwnerLogin":{"dataValueType":1},"Photo":{"dataValueType":16,"isLookup":true,"referenceSchemaName":"SysImage"}},"rows":[{"Name":"-","OwnerLogin":"","Id":"6dbd0b03-fb20-49a6-b3bd-0bb56d5dc8a0","Photo":""}],"notFoundColumns":[],"rowsAffected":1,"nextPrcElReady":false,"success":false}

по идее должен возвращать номер ответственного. но не дает.

в запросе не могу понять куда вставить ( наверное по этому и не возвращает то что надо.)

"exportVariables": { "Contact": "rows.0.Name",
"owner_caller_id_number": "rows.0.OwnerLogin"
            }

Может есть примеры общения с апи ?

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

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

Добрый день. а как это все посмотреть?. все это я пытаюсь запихнуть в curl php.

из примера 

{
    "httpRequest": {
        "exportCookie": "my_cookie",
        "url": "https://my.bpmonline.com/ServiceModel/AuthService.svc/Login",
        "method": "POST",
        "headers": {
            "Content-Type": "application/json"
        },
        "data": {
            "UserName": "Supervisor",
            "UserPassword": "Supervisor"
        }
    }
}

преобразовывается в php curl

$url = "https://bpm.xxxx.com/ServiceModel/AuthService.svc/Login";
$requestData["UserName"] = "xxx";
$requestData["UserPassword"] = "yyy";
echo $jcres = json_encode($requestData);
echo "\n";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_COOKIEJAR,'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_HEADER,1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $jcres);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($jcres))
);
$result = curl_exec($ch);
echo $result;
echo "\n";

curl_close($ch);
 

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

{
    "httpRequest": {
        "url": "https://my.bpmonline.com/0/dataservice/json/reply/SelectQuery",
        "method": "POST",
        "headers": {
            "Cookie": "${my_cookie}",
            "Accept": "application/json;odata=verbose"
        },
        "exportVariables": {
            "effective_caller_id_name": "rows.0.Name",
            "owner_caller_id_number": "rows.0.OwnerLogin"
        },
        "data": {
            "QueryType": 0,
            "Columns": {
                "Items": {
                    "Name": {
                        "OrderDirection": 0,
                        "OrderPosition": 0,
                        "Caption": null,
                        "Expression": {
                            "ExpressionType": 0,
                            "ColumnPath": "Name"
                        }
                    },
                    "OwnerLogin": {
                        "OrderDirection": 0,
                        "OrderPosition": 0,
                        "Caption": null,
                        "Expression": {
                            "ExpressionType": 0,
                            "ColumnPath": "[WSysAccount:Contact:Owner].Login"
                        }
                    }
                }
            },
            "AllColumns": false,
            "IsDistinct": false,
            "RowCount": 1,
            "Filters": {
                "FilterType": 6,
                "ComparisonType": 0,
                "LogicalOperation": 0,
                "IsNull": true,
                "IsEnabled": true,
                "IsNot": false,
                "Items": {
                    "FilterByPhone": {
                        "FilterType": 1,
                        "ComparisonType": 9,
                        "LogicalOperation": 0,
                        "IsNull": true,
                        "IsEnabled": true,
                        "IsNot": false,
                        "LeftExpression": {
                            "ExpressionType": 0,
                            "ColumnPath": "[ContactCommunication:Contact].SearchNumber"
                        },
                        "RightExpression": {
                            "ExpressionType": 2,
                            "ColumnPath": null,
                            "Parameter": {
                                "DataValueType": 1,
                                "Value": "${reverted_caller_id_number}"
                            }
                        }
                    }
                }
            },
            "RootSchemaName": "Contact",
            "OperationType": 0
        }
    }
}

вот с этим не понятно что делать ? в  "Value": "${reverted_caller_id_number}" мы поместим среверсированый номер телефона.

и в post data вставим  "data": и даже что то возвращает запрос.

{"rowConfig":{"Id":{"dataValueType":0},"Name":{"dataValueType":1},"OwnerLogin":{"dataValueType":1},"Photo":{"dataValueType":16,"isLookup":true,"referenceSchemaName":"SysImage"}},"rows":[{"Name":"-","OwnerLogin":"","Id":"6dbd0b03-fb20-49a6-b3bd-0bb56d5dc8a0","Photo":""}],"notFoundColumns":[],"rowsAffected":1,"nextPrcElReady":false,"success":false}
 

но я не пойму как вставить в запрос

        "exportVariables": {
            "effective_caller_id_name": "rows.0.Name",
            "owner_caller_id_number": "rows.0.OwnerLogin"
        },

как вообще дебажить эти запросы??? которые идут как "httpRequest": {

 

 

Смотреть и вручную отправлять нужные запросы к веб-сервисам можно при помощи Fiddler. А смотреть, что выбирается при выполнении и какой текст запросов в базу, можно в SQL-профайлере. Учтите, приведенный код предназначен для интеграции с другой телефонией Webitel, а не Asterisk, используемый набор полей в них может отличаться.

Парни вы трезвые тут!!!

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

фраза для какой телефонии оно тут вообще до телефонии не доходит. это просто методы АПИ которые не описаны и которые чтобы получить ответственого - еще не поступило ни одного трезвого ответа. 

Есть запрос есть ответ, но в ответе ничего внятного нет, и нету никакого понимания что с этим ответом можно сделать дальше. 
Направте пожалуйста в нужное русло. Если вы смотрели АПИ других CRM систем там такое есть могу показать что надо. 

 

 

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

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

Коллеги,

Добрый день,

Хочу для определенных ролей убрать кнопку сохранить в настройке группы фильтров.

 

Нравится

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

Следует в ExtendedFilterEditModelV2 поправить функцию getSaveButtonVisibility

Следует в ExtendedFilterEditModelV2 поправить функцию getSaveButtonVisibility

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

спасибо, попробуем...

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

Добрый день. Просьба помочь в ответе на следующий вопрос по очередям:

1) С чем может быть связана проблема, что после нажатия кнопки [Вернуть в очередь], в одном случае объект очереди остается в очереди, но увеличивается счетчик [Количество переносов], а в другом объект очереди исключается из очереди и через 5 минут снова входит в ней, но счетчик не сработал (т.к. создался новый объект очередь).

Какое поведение корректно при нажатии на кнопку [Вернуть в очередь]? Остаться в очереди с увеличенным счетчиком или исключение из очереди, и создание нового объекта очереди?

В документации описано такое поведение:

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

//из описания следует, что из очереди выпадать обращение не должно, верно?

Нравится

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

Логика этой кнопки сделана в схеме BasePageV2 в одном из пакетов OperatorSingleWindow:

    onPostponeQueueItemButtonClick: function() {
     var queueItemId = this.get("QueueItemId");
     if (!queueItemId) {
      this.error(this.get("Resources.Strings.QueueItemIsEmptyError"));
      //Страница не связана с элементом очереди единого окна. Действие отменено.
      return;
     }
     this.postponeQueueItem(queueItemId, function(success) {
      var messageString = (success)
       ? "QueueItemPostponeSucceedMessage"//Элемент успешно возвращен в очередь
       : "QueueItemPostponeFailedMessage";//Ошибка при возвращении элемента в очередь
      var message = this.get("Resources.Strings." + messageString);
      this.showInformationDialog(message, function() {
       if (success) {
        this.onQueueItemPostponed();
       }
      }.bind(this));
     }.bind(this));
    }
   },
    postponeQueueItem: function(queueItemId, callback) {
     var serviceCallBack = function(response, success) {
      if (!success) {
       var errorMessage =
        this.Ext.String.format(this.get("Resources.Strings.PostponeQueueItemError"),
         response.responseText);
         //Ошибка возвращения элемента в очередь. Сообщение об ошибке: {0}
       this.error(errorMessage);
       if (callback) {
        callback(false);
       }
       return;
      }
      if (callback) {
       callback(response === 1);
      }
 
     };
     ServiceHelper.callService({
      serviceName: "QueuesService",
      methodName: "PostponeQueueItem",
      data: {
       queueItemId: queueItemId
      },
      callback: serviceCallBack,
      scope: this
     });
    },

Там клиентская логика вызывает серверную функцию из QueuesService:

  [OperationContract]
  [WebInvoke(Method = "POST", UriTemplate = "PostponeQueueItem", BodyStyle = WebMessageBodyStyle.WrappedRequest,
   RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
  public int PostponeQueueItem(Guid queueItemId) {
   var userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
   int updateCount = 0;
   string message = string.Empty;
   try {
    if (userConnection == null) {
     throw new ArgumentNullException("UserConnection");
    }
    var update =
     new Update(userConnection, "QueueItem")
      .Set("PostponesCount", new QueryColumnExpression(ArithmeticOperation.Addition,
       new QueryColumnExpression("PostponesCount"), new QueryColumnExpression(Column.Const(1))))
      .Set("OperatorId", Column.Parameter(null, "Guid"))
      .Set("NextProcessingDate", Column.Const(null))
     .Where("Id").IsEqual(new QueryParameter("QueueItemId", queueItemId));
    updateCount = update.Execute();
    message = string.Format(GetResourceValue(userConnection, "QueueItemPostponeUpdatedMessage"),
     queueItemId);
    QueuesUtilities.LogDebug(message);
   } catch (Exception e) {
    message = string.Format(GetResourceValue(userConnection, "InvokeMethodErrorMessage"),
     "PostponeQueueItem", e.Message);
    QueuesUtilities.LogError(message, e);
    throw;
   }
   return updateCount;
  }

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

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

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

Спасибо большое за ваш комментарий, взял на вооружение!

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