Можно сделать автонумерацию поля без создания бизнес процесса?
То есть определенной функцией на клиентском коде js

Нравится

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

Приветствую, Александр!

Пример описан в SDK:

http://academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/CreateAuto…

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

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

Добрый день!

Задачу можно решить - перед добавлением нового элемента найти в структуре процесса элемент с названием ExclusiveGateway1 и изменить его название, например на “ ExclusiveGateway”.

"Зарицкий Олег Васильевич" написал:Задачу можно решить - перед добавлением нового элемента найти в структуре процесса элемент с названием ExclusiveGateway1 и изменить его название, например на “ ExclusiveGateway”.

Кстати при замещении базовых объектов во эта "Not a bug, but feature" реально раздражает, так как сопровождается свалом редактирования. Может в 7.99 версии можно будет обработчик такой ошибки сделать нормальный - с сообщением предупреждением?

В версии 7.8 будет исправлено.

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

Коллеги, подскажите пожалуйста, какой ключ в …\Terrasoft.WebApp\web.CONFIG отвечает за то, будет ли код минимизироваться в all-combined.js?
(на подобии "UseIncludeDependenciesSource" - для SectionBundleModule.js)

Нравится

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

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

В web.config (папка Terrasoft.WebApp) приложения нужно в секцию

"appSettings"

добавить строку

"add key="SeparatedJsFiles" value="true" /"

Спасибо!

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

Доброго времени суток, коллеги.

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

В код страницы добавил:

/**
 * Печать договора
 */
printContract: function() {
 ...
},
/**
 * Возвращает коллекцию действий карточки.
 * @protected
 * @overridden
 * @return {Terrasoft.BaseViewModelCollection} Возвращает коллекцию действий карточки
 */
getActions: function() {
  var actionMenuItems = this.callParent(arguments);
  actionMenuItems.addItem(this.getActionsMenuItem({
    Type: "Terrasoft.MenuSeparator",
    Caption: ""
  }));
  actionMenuItems.addItem(this.getActionsMenuItem({
    "Caption":  {bindTo: "Resources.Strings.PrintActionCaption"},
    "Tag": printContract,
    "Enabled": {"bindTo": "canEntityBeOperated"}
  }));
  return actionMenuItems;
}

И есть такая штука Terrasoft.configuration.mixins.PrintReportUtilities, как ее прилепить к распечатке соответствующего документа?

Нравится

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

Евгений, есть вопрос, чем Вас не устраивает реализация ПФ WORD в системе?
Воспользуйтесь готовым решением:

Илья, когда настраиваешь Печатную Форму, на возможность печати из рееста, то при выбранном документе и нажатии на появившуюся кнопку "Печать" он выводит все 4 типа документа, а не конкретно нужный тип. Мало того, что в задаче стоит привязка печати именно к списку "Действие".

Евгений, для реализации данной задачи, Вам необходимо видимость определенной печатной формы привязать к Id типа документа. Id текущего документа хранится в аттрибуте "ActiveRow" (this.get("ActiveRow")). Далее строите запрос к бд используя entitySchmaQuery. Id типа документа хранится в колонке "TypeId" в таблице документов. И затем на основании типа документа делаете нужную печатную форму активной или видимой.

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

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

Добрый день!
Подскажите пожалуйста, есть ли возможность реализовать для версии 5.4, ввод телефона по фиксированной маске, например: +7 (___) _______ ?

Нравится

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

Добрый день!

Есть ли примеры добавления действия (BPM7.6) "Загрузить средства связи" в разделе Контрагенты или любые другие аналогичные?

Нравится

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

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

Воспользуйтесь функционалом импорта данных из Excel в объект "Средство связи контрагента".

"Демьяник Алексей" написал:Воспользуйтесь функционалом импорта данных из Excel в объект "Средство связи контрагента".

Алексей, спасибо!
Но данный вариант не подходит. Нужно именно так как описано, а именно действие где-то в разделах, которое вызывает форму Импорта с предустановленным объектом...

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

Уточните, какого программного продукта касается Ваш вопрос?

Если вопрос касается bpm'online 7.6, то вы можете посмотреть реализацию на примере объекта 'Средство связи контрагента'.

Если вопрос относится к Terrasoft 3.4, то готовых примеров решения нет.
Вы можете реализовать его самостоятельно по аналогии с тем, как реализован обработчик кнопки [Выполнить импорт] в разделе [Интеграции].

"Савельева Алла" написал:

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

Уточните, какого программного продукта касается Ваш вопрос?

Если вопрос касается bpm'online 7.6, то вы можете посмотреть реализацию на примере объекта 'Средство связи контрагента'.

Если вопрос относится к Terrasoft 3.4, то готовых примеров решения нет.

Вы можете реализовать его самостоятельно по аналогии с тем, как реализован обработчик кнопки [Выполнить импорт] в разделе [Интеграции].


Добрый день, Алла!

Вопрос по Sales7.6. К сожалению не могу найти реализацию загрузки чего-либо с помощью Действия. Как увидеть этот пример в объекте 'Средство связи контрагента'?

"AlexLS" написал:

Добрый день, Алла!

Вопрос по Sales7.6. К сожалению не могу найти реализацию загрузки чего-либо с помощью Действия. Как увидеть этот пример в объекте 'Средство связи контрагента'?

--

Terrasoft 3.4.1.171 (&& .84 &&BPM.7.6)

SQL Server 10.50.2500.0

Microsoft Windows NT 6.1 (7601) x64 en

Chrome 48.0.2564.116 m

Opera 35.0.2066.68

Firefox 44.0.2

Как вариант:
1. Создаете действие в разделе
2. Замещаете старицу импорта и заполняете поля согласно бизнес-задаче.
3. Копируете url окна импорта и вешаете на кнопку атрибут/метод, который откроет новую вкладку в браузере.

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

Доброго времени суток!
Сервис Террасофта под названием SaveWebFormLeadData использует данные со стороны клиента и отправляет на их ссылку обработки.
Интересует возможность отправки этих же данных со стороны сервера, например cURL ( PHP ).

С уважением, Сергиенко Николай

Нравится

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

Здравствуйте, Николай!

Этот вес сервис используется для сохранения лидов с вебформ в продукте Marketing. Какую задачу Вы хотите решить таким образом?

Здравствуйте, Алексей!

Нужно отправлять через Лиды информацию с помощью утилиты CRON

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

Добрый день!

Очень нужен пример реализации загрузки планов по клиентам из эксельки.

Возможно любой другой пример (может есть реализация из "коробки")?

Нравится

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

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

Данная информация хранится в объекте "Элемент планирования". Единственная проблема - Id записи, по которой проводится планирование, хранится в поле "Значение элемента планирования". Это значение не получится импортировать с файла Excel.

"Демьяник Алексей" написал:Единственная проблема - Id записи, по которой проводится планирование, хранится в поле "Значение элемента планирования". Это значение не получится импортировать с файла Excel.

Алексей, спасибо за ответ! Ни разу, за свою жизнь, не встречал ничего невозможного! Трудно, сложно - да, но "не получится" - это не мой подход.

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

"AlexLS" написал:

Алексей, спасибо за ответ! Ни разу, за свою жизнь, не встречал ничего невозможного! Трудно, сложно - да, но "не получится" - это не мой подход.

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

Создайте объект, который будет дублировать поля объекта "Элемент планирования" и импортируйте в созданный Вами объект. Замените поле с типом Guid на обычное текстовое поле.

Сложность - организовать перенос и созданного объекта в объект "Значение элемента планирования". Таким образом можно будет реализовать.

"Демьяник Алексей" написал:Таким образом можно будет реализовать.

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

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

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

Подскажите, существует ли способ повесить на обработчик нажатия кнопки код, который откроет нужную мне произвольную страницу (которую я создал без привязки в объекту)? Но при этом мне ещё нужно передавать ИД выбранной записи на гриде. Нужна реализация именно кодом: объекты БП не предлагать!

Находил только во это из подходящего: https://community.terrasoft.ru/forum/topic/9886

Но это всё равно не то...

Нравится

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

См. действие БП «Открыть страницу» (OpenPageUserTask), там передаётся PageUId и PageParameters. Если нужно именно кодом, то можно посмотреть исходники этого действия.

Исходниками этого кода является нечто, что не имеет буквенного кода - как обычно... =( Сделал через элементы БП - всё работает (см. ниже), но получил другую проблему: не получается передать некоторый параметр, чтобы его принять на открываемой форме и там это записать в лукапное поле.

1

Это блок БП-са, который выполняется по нажатию на кнопку вызова нужного мне окна. В объекте "Подготовить параметры" находится след. код:

var PageSchemaId = (UserConnection.GetSchemaManager("PageSchemaManager").GetInstanceByName("MyPage111") as PageSchema).UId;
OpenPageUserTask111.PageUId = PageSchemaId;
 
var pageParameters = new Dictionary <string, string>();
pageParameters.Add("CampaignLookupEdit", SelectedNodePrimaryColumnValue.ToString());
 
OpenPageUserTask111.PageParameters = pageParameters;

В объекте "Действие процесса" выбрано действие "Открытие страницы".

Теперь мне надо как-то переданный параметр "CampaignLookupEdit" заполнить на открываемой форме значением этого параметра. Вопрос - как? В объекте "Заполнить поля на форме" попробовал в отладчике обратиться к "Page", но этой сущностью является не открываемая страница, а страница грида, откуда я вызываю открытие своей страницы, хотя "OpenPageUserTask111.PageParameters" у меня заполнено правильно. Подскажите, если не трудно...

"Виталий Марушко" написал:Исходниками этого кода является нечто, что не имеет буквенного кода - как обычно...

Всё там нормально с исходниками, само действие состоит из обычного C#-кода.
OpenPageUserTask

"Виталий Марушко" написал:Теперь мне надо как-то переданный параметр "CampaignLookupEdit" заполнить на открываемой форме значением этого параметра.

Вычитывать значение параметра нужно в самой открываемой карточке при её открытии (на PageLoadComplete).

var MyGuidParamId = new Guid(Page.GetParameterValue("MyGuidParamId").ToString());

И дальше его обрабатывать и записывать куда нужно.

Александр, разобрался - всё получилось! Спасибо за очередную порцию помощи! Хорошего Вам дня)

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

Добрый день!
почему я не могу сделать изменения? выбивает после того, как я меняю данные о виде деятельности и отраслей.

Нравится

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

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

из данного сообщения можно сделать вывод, что Вы забили перевести Dataset в режим редактирования: Dataset.Edit();

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

//-----------------------------------------------------------------------------
// scr_AccountEdit
//-----------------------------------------------------------------------------

var AccountEdit = new Object();

function InitializeDataset() {
SetAttribute(dlData.Dataset, 'CommunicationDataset',
'ds_AccountCommunication');
SetAttribute(dlData.Dataset, 'AddressDataset', 'ds_AccountAddress');
SetAttribute(dlData.Dataset, 'CampaignDataset', 'ds_AccountInCampaign');
BaseDBEdit.Subject = 'Account';
BaseDBEdit.Dataset = dlData.Dataset;
}

function Initialize() {
InitializeDataset();
}

/* PRODUCT XRM */
function GetAccountBalanceForPeriod(AccountID, StartDays, EndDays, BalanceType){
var NowDate = new Date();
var BalanceSelectQuery = GetSingleItemByCode('sq_AccountsBalance',
'GetDatasetDisplayValue2');
ApplySelectQueryFilter(BalanceSelectQuery, 'AccountID', AccountID, true);
var EndDate;
if(!IsEmptyValue(EndDays)){
EndDate = AddDateDays(NowDate, (-1) * EndDays).getVarDate();
}
var StartDate;
if(!IsEmptyValue(StartDays)) {
StartDate = AddDateDays(NowDate, (-1) * StartDays).getVarDate();
}
EnableSelectQueryFilters(BalanceSelectQuery, (BalanceType == 'PL'), ['IsPL']);
EnableSelectQueryFilters(BalanceSelectQuery, (BalanceType == 'CF'), ['IsCF']);
ApplySelectQueryFilter(BalanceSelectQuery, 'DateTo', EndDate,
(!IsEmptyValue(EndDate)));
ApplySelectQueryFilter(BalanceSelectQuery, 'DateFrom', StartDate,
(!IsEmptyValue(StartDate)));
var BalanceDataset = BalanceSelectQuery.Open();
return BalanceDataset;
}

function InitializePostponementPayment(Window) {
var Dataset = dlData.Dataset;
edtPostponementPayment.DisableEvents();
try {
if (Dataset.State == dstInsert) {
edtPostponementPayment.Value = '15';
} else
if (Dataset.State == dstEdit) {
edtPostponementPayment.Value = Dataset('PostponementPayment') * 1;
}
} finally {
edtPostponementPayment.EnableEvents();
}
RefreshPostponementPayment(GetAttribute(Window, 'RecordID'));
edtPostponementPayment.IsReadOnly = !GetCanEditData(Dataset);
}

function RefreshPostponementPayment(AccountID){
var Dataset = dlData.Dataset;
var Value = Dataset.ValAsInt('PostponementPayment');
if (Value <= 0) {
Value = 14;
}
var HalfValue = parseInt(Value / 2);
edtPostPaymentPeriod1.Caption = " до " + HalfValue + " дней:";
edtPostPaymentPeriod2.Caption = " " + HalfValue + " - " +
Value + " дней:";
edtPostPaymentPeriod3.Caption = " более " + Value + " дней:";
edtAmmountPL.Tag = '0,' + HalfValue + ',PL';
edtAmmountCF.Tag = '0,' + HalfValue + ',CF';
edtAmmountPL30.Tag = HalfValue + ',' + Value + ',PL';
edtAmmountCF30.Tag = HalfValue + ',' + Value + ',CF';
edtAmmountPL90.Tag = Value + ',0,PL';
edtAmmountCF90.Tag = Value + ',0,CF';

var BasicAmountPL = GetAccountBalanceForPeriod(AccountID, HalfValue, 0, 'PL').
ValAsFloat('BasicAmount');
var BasicAmountCF = GetAccountBalanceForPeriod(AccountID, HalfValue, 0, 'CF').
ValAsFloat('BasicAmount');
var BasicAmountPLTotal = BasicAmountPL;
var BasicAmountCFTotal = BasicAmountCF;
edtAmmountCF.Value = AddDelimiter(BasicAmountCF);
edtAmmountPL.Value = AddDelimiter(BasicAmountPL);
if((BasicAmountPL == 0)||( BasicAmountCF == 0)){
lblPLPercent.Caption = "0 %";
} else {
lblPLPercent.Caption = AddDelimiter(((BasicAmountCF/BasicAmountPL)* 100).toFixed(2)) + " %"
}
BasicAmountPL = GetAccountBalanceForPeriod(AccountID, Value, HalfValue, 'PL').
ValAsFloat('BasicAmount');
BasicAmountCF = GetAccountBalanceForPeriod(AccountID, Value, HalfValue, 'CF').
ValAsFloat('BasicAmount');
BasicAmountPLTotal = BasicAmountPLTotal + BasicAmountPL;
BasicAmountCFTotal = BasicAmountCFTotal + BasicAmountCF;
edtAmmountCF30.Value = AddDelimiter(BasicAmountCF);
edtAmmountPL30.Value = AddDelimiter(BasicAmountPL);
if ((BasicAmountPL == 0) ||
(BasicAmountCF == 0)) {
lblPL30Percent.Caption = "0 %";
} else {
lblPL30Percent.Caption = AddDelimiter(((BasicAmountCF/BasicAmountPL) * 100).toFixed(2)) + ' %';
}
BasicAmountPL = GetAccountBalanceForPeriod(AccountID, null, Value, 'PL').
ValAsFloat('BasicAmount');
BasicAmountCF = GetAccountBalanceForPeriod(AccountID, null, Value, 'CF').
ValAsFloat('BasicAmount');
BasicAmountPLTotal = BasicAmountPLTotal + BasicAmountPL;
BasicAmountCFTotal = BasicAmountCFTotal + BasicAmountCF;
edtAmmountCF90.Value = AddDelimiter(BasicAmountCF);
edtAmmountPL90.Value = AddDelimiter(BasicAmountPL);
if ((BasicAmountPL == 0) || (BasicAmountCF == 0)) {
lblPL90Percent.Caption = "0 %";
} else {
lblPL90Percent.Caption = AddDelimiter(((BasicAmountCF/BasicAmountPL)* 100).toFixed(2)) + '%';
}
var BalanceAmount = (BasicAmountCFTotal - BasicAmountPLTotal).toFixed(2);
AccountEdit.BalanceAmount = BalanceAmount;
}

function AddDelimiter(Value){
var ParentValue = Value + '';
var StrValue = Value + '';
if (StrValue.indexOf('.') != -1) {
StrValue = StrValue.substr(0,StrValue.indexOf('.'));
}
if (StrValue.indexOf('-') != -1) {
StrValue = StrValue.substr(1);
}
var StrLen = StrValue.length;
var i = 0;
while (StrLen > 3) {
StrLen = StrLen - 3;
StrValue = StrValue.substr(0,StrLen) + ' ' + StrValue.substr(StrLen);
}
if (ParentValue.indexOf('.') != -1) {
StrValue = StrValue + ',' + ParentValue.substr(ParentValue.indexOf('.') + 1);
}
if (ParentValue.indexOf('-') != -1) {
StrValue = '-' + StrValue;
}
return StrValue;
}

function UpdateAccountBasicCurrencyCaptions() {
var CurrencyID = GetBasicCurrencyID();
var CurrencySymbol = GetCurrencySymbol(CurrencyID);
var SettledCreditField = dlData.Dataset.DataFields.ItemsByName('SettledCredit');
SettledCreditField.Caption = "Разрешенный кредит, " + CurrencySymbol;
lblCF.Caption = "Оплаты, " + CurrencySymbol;
lblPL.Caption = "Обязательства, " + CurrencySymbol;
edtBalanceAmount.Caption = "Текущий баланс, " + CurrencySymbol;
edtRemainAmount.Caption = "Остаток, " + CurrencySymbol;
}

function RecalcBalance(SettledCredit) {
var BalanceAmount = AccountEdit.BalanceAmount;
var RemainAmount = (SettledCredit + BalanceAmount*1).toFixed(2);
edtBalanceAmount.Value = AddDelimiter(BalanceAmount);
edtRemainAmount.Value = AddDelimiter(RemainAmount);
}

function SetPostponementPayment(Value) {
var Dataset = dlData.Dataset;
if ((Dataset.State == dstEdit) ||
(Dataset.State == dstInsert)) {
dlData.Dataset('PostponementPayment') = (Value * 1);
}
}
/* ENDPRODUCT XRM */

function InitializeCommunicationActionSmartTags() {
for (var i = 1; i < 6; i++) {
RefreshCommunicationActionSmartTag(
Self.ComponentsByName('edtCommunication' + i + 'Type'),
Self.ComponentsByName('edtCommunication' + i));
}
}

function CallCommunicationActionSmartTagHandler(ActionMenuItem) {
scr_CommunicationActionSmartTag.HandleCommunicationActionSmartTag(ActionMenuItem);
}

function InitAccountInfo() {
var Dataset = dlData.Dataset;
AccountEdit.OldName = Dataset.Values('Name');
}

function CheckAccountData() {
var Dataset = dlData.Dataset;
var NewName = Dataset.Values('Name');
var AccountID = Dataset.Values('ID');
var NameWasChanged = (NewName != AccountEdit.OldName);
var Result = true;
if ((NameWasChanged) && (!GetAttribute(Self, 'isMassEdit'))) {
var IsAccountLicensed = GetIsAccountLicensed(AccountID);
if (IsAccountLicensed) {
var Message = "Изменение '%1' контрагента у пользователя системы, может стать причиной повреждения лицензии. Продолжить?"
var SubjectName = Dataset.DataFields('Name').Caption;
var MessageStr = FormatStr(Message, SubjectName);
var Result = (ShowConfirmationDialog(MessageStr) == mrYes);
}
}
return Result;
}

function PrepareFinanceDetail() {
pgFinance.IsVisible = !Self.Attributes('HideFinanceDetail');
}

// ----------------------------------------------------------------------------
// Event handlers
// ----------------------------------------------------------------------------

function wnd_AccountEditOnPrepare(Window) {
Initialize();
wnd_BaseDBEditOnPrepare(Window);
/* PRODUCT XRM */
UpdateAccountBasicCurrencyCaptions();
InitializePostponementPayment(Self);
PrepareFinanceDetail();
/* ENDPRODUCT XRM */
InitAccountInfo();
InitializeCommunicationActionSmartTags();
RecalcBalance(dlData.Dataset('SettledCredit'));
}

function edtOwnerOnPrepareSelectWindow(LookupDataControl) {
PrepareLookupDataControl(LookupDataControl, dlData.Dataset);
}

function edtCountryOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
FilterLookupDataControlLookupDatasetByTerritory(LookupDataControl,
edtTerritory.DataField.Value);
}

function edtCityOnPrepareSelectWindow(LookupDataControl) {
FilterLookupDataControlLookupDatasetByState(LookupDataControl,
edtState.DataField.Value);
FilterLookupDataControlLookupDatasetByCountry(LookupDataControl,
edtCountry.DataField.Value);
}

function edtStateOnPrepareSelectWindow(LookupDataControl) {
FilterLookupDataControlLookupDatasetByCountry(LookupDataControl,
edtCountry.DataField.Value);
}

function btnOKOnClick(Control) {
if (!CheckAccountData()) {
return;
}
scr_BaseDBEdit.btnOKOnClick(Control);
}

function dlDataOnDatasetDataChange(DataField) {
var ActivityName = DataField.Name;
var FieldName = DataField.Name;
var Dataset = DataField.ParentDataFields.ParentDataset;
var ActivityValue = DataField.Value;
/* PRODUCT XRM */
if (FieldName == 'PostponementPayment') {
RefreshPostponementPayment(Dataset('ID'));
}
if ((FieldName == 'SettledCredit') || (FieldName == 'PostponementPayment')) {
if (Dataset.ValAsFloat('SettledCredit') < 0) {
ShowWarningDialog("Разрешенный кредит не может быть меньше 0");
Dataset('SettledCredit') = 0;
return;
}
RecalcBalance(Dataset('SettledCredit'));
}
/* ENDPRODUCT XRM */
if (FieldName.indexOf('Communication') == 0) {
var Index = FieldName.substr(13, 1);
var CommTypeDataControl =
Self.ComponentsByName('edtCommunication' + Index + 'Type');
var CommDataControl =
Self.ComponentsByName('edtCommunication' + Index);
RefreshCommunicationActionSmartTag(CommTypeDataControl, CommDataControl,
(FieldName.indexOf('Type') > -1));
}
if (ActivityName == 'ActivityID') {
if (IsEmptyValue(ActivityValue)) {
Dataset.DataFields('FieldID').Value = null;
} else {
Dataset.DataFields('FieldID').Value =
GetFieldValueFromLookupDatasetByLookupField(DataField, 'FieldID');
}
}
}

/* PRODUCT XRM */
function amiBalanceSelectOnExecute(ActionMenuItem, Sender) {
var Tag = Sender.Tag;
if (dlData.Dataset.State == dstInsert) {
if (ShowConfirmationDialog(NeedToSaveRecordBeforeProceed) != wmrYes) {
return;
}
if (!CheckAccountData()) {
return;
}
if (!WindowWasPrepared(Self)) {
return;
}
Self.ComponentsByName('btnOK').IsEnabled = false;
try {
var Result = SaveChangesWithCheck(Self, BaseDBEdit);
}
finally {
Self.ComponentsByName('btnOK').IsEnabled = true;
}
if (!Result) {
return;
}
dlData.Dataset.Edit();
}
if (IsEmptyValue(Tag)) {
return;
}
var AccountID = GetAttribute(Self, 'RecordID');
var FilterValues = Tag.split(',');
var wndOpportunities = Services.GetNewItemByUSI('wnd_CashflowGridArea');
var Dataset = wndOpportunities.ComponentsByName('dlData').Dataset;
Dataset.Close();
var NowDate = new Date();
var DateTo = AddDateDays(NowDate, (-1) * FilterValues[0]);
var DateFrom = AddDateDays(NowDate, (-1) * FilterValues[1]);
Dataset.Close();
ApplyDatasetFilter(Dataset, 'AccountBalanceDateFrom', DateFrom.getVarDate(),
(FilterValues[1] != 0));
ApplyDatasetFilter(Dataset, 'AccountBalanceDateTo', DateTo.getVarDate(), true);
ApplyDatasetFilter(Dataset, 'DebtorCreditorID', AccountID, true);
ApplyDatasetFilter(Dataset, 'IsActual', true, true);
EnableSelectQueryFilters(Dataset.SelectQuery, (FilterValues[2] == 'PL'), ['IsPL']);
EnableSelectQueryFilters(Dataset.SelectQuery, (FilterValues[2] == 'CF'), ['IsCF']);
wndOpportunities.Attributes('NotifyObject') = Self;
wndOpportunities.Attributes('IsFromAccountFinanceEdit') = true;
if (FilterValues[2] == 'PL') {
wndOpportunities.Attributes('DefaultRecipientID') = AccountID;
}
if (FilterValues[2] == 'CF') {
wndOpportunities.Attributes('DefaultPayerID') = AccountID;
}
wndOpportunities.Prepare();
wndOpportunities.Show();
Dataset.Open();
}

function edtPostponementPaymentOnChange(Edit) {
var PostponementPayment = new String(
IsEmptyValue(Edit.Value) ? 0 : Edit.Value);
if ((!IsIntegerValue(PostponementPayment)) || (((PostponementPayment*1)+'').length > 4) ||
(PostponementPayment*1 < 0) || (PostponementPayment*1 > 9999)) {
ShowWarningDialog("Отсрочка платежей должна быть целым положительным числом от 0 до 9999");
} else {
SetPostponementPayment(PostponementPayment);
}
}
/* ENDPRODUCT XRM */

function wnd_AccountEditOnNotify(ScriptableService, Sender, Message, Data) {
/* PRODUCT XRM */
if ((Message == MSG_AFTERCLOSE) &&
(ExtractUSICodeEx(Sender.USI) == 'wnd_CashflowGridArea')) {
var Dataset = dlData.Dataset;
if ((Dataset.State != dstBrowse) &&
(Dataset.State != dstInsert) &&
(Dataset.State != dstEdit)) {
return;
}
RefreshPostponementPayment(Dataset('ID'));
RecalcBalance(Dataset('SettledCredit'));
}
/* ENDPRODUCT XRM */
}

function dlDataOnDatasetAfterOpen(Dataset) {
/* PRODUCT XRM */
AccountEdit.IsPostponementPaymentInitialized = false;
/* ENDPRODUCT XRM */
}

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

У Вас проблема скорее всего в коде:

if (ActivityName == 'ActivityID') {
	if (IsEmptyValue(ActivityValue)) {
		Dataset.DataFields('FieldID').Value = null;
	} else {
		Dataset.DataFields('FieldID').Value =
			GetFieldValueFromLookupDatasetByLookupField(DataField, 'FieldID');
	}
}

У меня этот код отрабатывает корректно.

Опишите более подробно кейс воспроизведения.

я сделал back up, но не помогло (при добавлении или редактировании вид деятельности или отраслей контрагента выбивает даную ошибку, не могу разобраться где именно и что делать .... сейчас моя функция имеет вид:
function dlDataOnDatasetDataChange(DataField) {
var FieldName = DataField.Name;
var Dataset = DataField.ParentDataFields.ParentDataset;
/* PRODUCT XRM */
if (FieldName == 'PostponementPayment') {
RefreshPostponementPayment(Dataset('ID'));
}
if ((FieldName == 'SettledCredit') || (FieldName == 'PostponementPayment')) {
if (Dataset.ValAsFloat('SettledCredit') < 0) {
ShowWarningDialog("Разрешенный кредит не может быть меньше 0");
Dataset('SettledCredit') = 0;
return;
}
RecalcBalance(Dataset('SettledCredit'));
}
/* ENDPRODUCT XRM */
if (FieldName.indexOf('Communication') == 0) {
var Index = FieldName.substr(13, 1);
var CommTypeDataControl =
Self.ComponentsByName('edtCommunication' + Index + 'Type');
var CommDataControl =
Self.ComponentsByName('edtCommunication' + Index);
RefreshCommunicationActionSmartTag(CommTypeDataControl, CommDataControl,
(FieldName.indexOf('Type') > -1));
}
}

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

Выполните отладку кода при помощи Microsoft Visual Studio или Microsoft Script Debugger.

Павел, спасибо, ви очень помогли)))

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

Доброе утро, коллеги.

Есть вопрос.

Сделал тестовый вэб-сервис , по примеру из https://community.terrasoft.ru/forum/topic/9811 , но у меня что-то не сработал.
В логах результат:

При выполнении запроса возникла ошибка  статус ответа: 404 (Not Found) url запроса: [url]/0/rest/RegistrationService/TestServiceMethod метод: POST данные запроса: test data1

all-combined.js:462:345
.log() all-combined.js:462
.error() all-combined.js:462
.logResponseError() all-combined.js:722
.validateResponse() all-combined.js:723
.request/a.callback() all-combined.js:721
.callback() all-combined.js:1
.onComplete() all-combined.js:1
.onStateChange() all-combined.js:1
Ext.Function.bind/() all-combined.js:1

Код регистрационного сервиса:

namespace Terrasoft.Configuration.CommandLineService
{
  using System;
  using System.Collections.Generic;
  using System.Security;  
  using System.ServiceModel;
  using System.ServiceModel.Activation;
  using System.Web;
  using Newtonsoft.Json;
  using Terrasoft.Common;
  using Terrasoft.Web.Common;
  using Terrasoft.Configuration.RegistrationHelper;
  using Terrasoft.Core;
  using Terrasoft.Core.Configuration;
  using Terrasoft.Core.DB;
  using Terrasoft.Core.Scheduler;
  using System.CodeDom.Compiler;
  using System.ServiceModel;
  using System.ServiceModel.Web;
  using Terrasoft.Core.Entities;
  using Terrasoft.Core.Store;
  using System.Data;
  using System.Collections.Generic;

  #region Class: RegistrationService
 
  [ServiceContract]
  [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
  public class RegistrationService{

    [OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    public string TestServiceMethod(string data) {
      var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
      string key = string.Format("ExportFilterKey_{0}", Guid.NewGuid());
      userConnection.SessionData[key] = data;
      return key;
    }
  }

  #endregion
}

код запроса к нему, на клиенте:

// тест
Terrasoft.AjaxProvider.request({
  url: Terrasoft.workspaceBaseUrl + "/rest/RegistrationService/TestServiceMethod",
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  method: 'POST',
    jsonData:  'test data',
    callback: function(request, success, response) {
    if (success) {
      console.log(response.responseText);
    }
  },
  scope: this
});

Нравится

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

Мой промах, забыл опубликовать. Сделал публикацию и получил теперь:

POST [url]/0/rest/RegistrationService/TestServiceMethod 400 (Bad Request)

Здравствуйте, Евгений!

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

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

Средства интеграции bpm'online достаточно подробно описаны в документации по разработке, раздел "Примеры решения типовых задач" - "Рекомендуемые средства интеграции".

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