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

Нравится

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

Разобрался...внимательнее надо было смотреть на то, что уже есть )

Николай, совет в след. раз объяснять проблему по конкретнее (возможно скрины или куски кода добавить еще), тогда помогут быстрее, а так:
Тема:

"Михайлов Николай" написал:Перенос данных из детали одного раздела в деталь другого

В описании:
"Михайлов Николай" написал:... перенести данные некоторых полей карточки...

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

Прошу прощения, в будущем буду стараться более корректно вопросы формулировать

Показать все комментарии
Открыть сраницу после задачи в процессе
Технические вопросы
5.x

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

DefValuesKey = GetHashCode().ToString();
var parameters = new Dictionarystring, string>();
parameters.Add("defValuesId", DefValuesKey);
UserConnection.UserContext[DefValuesKey] = parameters;
ShowSelectDataWindow.OpenerInstanceId = InstanceUId;
ShowSelectDataWindow.PageParameters = parameters;
ShowSelectDataWindow.PageUId = new Guid("{E8343C66-8488-B471-E040-1AAC3D3ED25C}"); //EnterPeriodWhichRemainsBranchEditPage
ShowSelectDataWindow.CloseMessage= "CloseProcessWindow";
return true;

скриншот тоже прилагаеться, версия BPMOnline 5.1.1.156

Нравится

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

Здравствуйте, Баглан!
Выгрузите, пожалуйста, процесс и предоставьте файл, а также, опишите, какое окно Вы хотите открыть.

"Андрей Каспаревич" написал:

Здравствуйте, Баглан!

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

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки


Доброе утро, скидываю файл, сам процесс, страницу, и скриншот страницы

Добре утро!
Спасибо, взял в работу.

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

ShowSelectDataWindow.CloseOpenerOnLoad = false;
ShowSelectDataWindow.UseCurrentActivePage = true;

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

"Андрей Каспаревич" написал:DefValuesKey = GetHashCode().ToString();
var parameters = new Dictionary();
parameters.Add("defValuesId", DefValuesKey);
UserConnection.UserContext[DefValuesKey] = parameters;
ShowSelectDataWindow.OpenerInstanceId = InstanceUId;
ShowSelectDataWindow.PageParameters = parameters;
ShowSelectDataWindow.PageUId = new Guid("{E8343C66-8488-B471-E040-1AAC3D3ED25C}"); //EnterPeriodWhichRemainsBranchEditPage
ShowSelectDataWindow.CloseMessage= "CloseProcessWindow";
return true;

После этих кодов:

DefValuesKey = GetHashCode().ToString();
var parameters = new Dictionary<string, string>();
parameters.Add("defValuesId", DefValuesKey);
UserConnection.UserContext[DefValuesKey] = parameters;
ShowSelectDataWindow.OpenerInstanceId = InstanceUId;
ShowSelectDataWindow.PageParameters = parameters;
ShowSelectDataWindow.PageUId = new Guid("{E8343C66-8488-B471-E040-1AAC3D3ED25C}"); //EnterPeriodWhichRemainsBranchEditPage
ShowSelectDataWindow.CloseMessage= "CloseProcessWindow";
return true;

этот код:

ShowSelectDataWindow.CloseOpenerOnLoad = false;
ShowSelectDataWindow.UseCurrentActivePage = true;

и результат будет следующим

DefValuesKey = GetHashCode().ToString();
var parameters = new Dictionary<string, string>();
parameters.Add("defValuesId", DefValuesKey);
UserConnection.UserContext[DefValuesKey] = parameters;
ShowSelectDataWindow.OpenerInstanceId = InstanceUId;
ShowSelectDataWindow.PageParameters = parameters;
ShowSelectDataWindow.PageUId = new Guid("{E8343C66-8488-B471-E040-1AAC3D3ED25C}"); //EnterPeriodWhichRemainsBranchEditPage
ShowSelectDataWindow.CloseMessage= "CloseProcessWindow";
 
S<strong>howSelectDataWindow.CloseOpenerOnLoad = false;
ShowSelectDataWindow.UseCurrentActivePage = true;</strong>
return true;

так будет правильно?

Баглан, да. Здесь идет просто установка параметров, так что не принципиально, в каком порядке они будут установлены.

"Андрей Каспаревич" написал:ShowSelectDataWindow

Этот параметр отсутствует UseCurrentActivePage

Баглан, тогда не используйте его.

"Андрей Каспаревич" написал:ShowSelectDataWindow.CloseOpenerOnLoad = false;

Андрей добры день, добавил код просмотрел javaScriptConsole, страница не запустилась ошибку не выдало, высылаю скриншот

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

"Андрей Каспаревич" написал:

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

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки


Удаленный доступ есть по vpn, вы можете обратиться Генову Евгений, у него имееться пароли для vpn, как получите напишите мне я доведу до этого шага где открываеться страница.

Баглан, ожидаю упрощенную схему процесса.
В свою очередь, предоставляю стандартную инструкцию по открытию страницы из процесса.


Окно редактирования


Создать Действие процесса (UserTask). Действие = Открыть страницу

Создать скрипт подготовки перед действием и написать в нем следующее:

EntitySchemaUId = Page.DataSource.SchemaUId;
string recordId = Guid.Empty.ToString(); //Id записи
 
UserTaskRunSAObjectEditPage.OpenerPage = Page;
UserTaskRunSAObjectEditPage.OpenerPage = Page;
UserTaskRunSAObjectEditPage.PageUId = EditPageUId; //UID вашей страницы
var parameters = new Dictionary<string, string> {
    {"recordId", recordId.ToString()},
    {"entitySchemaUId", EntitySchemaUId.ToString()}, //UID вашего объекта (не обязательно)
    {"treeGridId", Page.TreeGrid.ClientID}
};
UserTaskRunSAObjectEditPage.PageParameters = parameters;
UserTaskRunSAObjectEditPage.Centered = true;
UserTaskRunSAObjectEditPage.CloseOpenerOnLoad = false;

Открытие простого окна

OpenDetailedPageUserTask.OpenerInstanceId = InstanceUId;
OpenDetailedPageUserTask.UseCurrentActivePage = true;
OpenDetailedPageUserTask.PageUId = EditPageUId;
var parameters = new Dictionary<string, string> {
    {"recordId", "recordId"},
    {"entitySchemaUId", ""},
    {"treeGridId", ""},
    {"SysModuleEditId", ""}
};
OpenDetailedPageUserTask.PageParameters = parameters;
OpenDetailedPageUserTask.Centered = true;
OpenDetailedPageUserTask.CloseOpenerOnLoad = false;

Открытие окна выбора элемента из справочника (с фильтрами)

Создать Действие процесса (UserTask). Действие = Открыть страницу выбора из справочника

Создать скрипт подготовки перед действием и написать в нем следующее:

var SSDocumentOfferingtId = new Guid(SysSettings.GetValue(UserConnection, "SSDocumentOfferingtId").ToString());//UID Объекта
Collection<Dictionary<string, object>> filters = new Collection<Dictionary<string, object>>(); 
filters.Add(new Dictionary<string, object> { 
    {"comparisonType", FilterComparisonType.Equal},
    {"leftExpressionColumnPath", "Document"},
    {"useDisplayValue", false},
    {"rightExpressionParameterValues", new object[] {ParentDocumentSpecificationId}}
});
filters.Add(new Dictionary<string, object> { 
    {"comparisonType", FilterComparisonType.NotEqual},
    {"leftExpressionColumnPath", "IsVsat"},
    {"useDisplayValue", false},
    {"rightExpressionParameterValues", new object[] {true}}
});
filters.Add(new Dictionary<string, object> { 
    {"comparisonType", FilterComparisonType.IsNull},
    {"leftExpressionColumnPath", "[ProductsParts:DocumentOffering].Parent"},
    {"useDisplayValue", false},
    {"rightExpressionParameterValues", new object[] {}}
});
 
OpenSpecOfferingLookupUserTask.ProcessKey = InstanceUId;
OpenSpecOfferingLookupUserTask.PageParameters = new Dictionary<string, object>() {
    {"LookupFilters", filters},
    {"schemaUId", SSDocumentOfferingtId},
    {"customClosedEvent", "SpecOfferingLookupPageClosed"} //Сообщение при закрытии окна
};
OpenSpecOfferingLookupUserTask.UseCurrentActivePage = true;
return true;

Создать скрипт обработки после действия и написать в нем следующее:

var offerings = OpenSpecOfferingLookupUserTask.GetSelectedValues(UserConnection) as Dictionary <string, object>;
var offeringId = Guid.Empty;
foreach (var offering in offerings) {
    offeringId = new Guid(offering.Key.ToString());
    break;
}
if (offeringId == Guid.Empty) {
    return true;
}
return true;

Возможно будет полезно.

"Андрей Каспаревич" написал:

Баглан, ожидаю упрощенную схему процесса.

В свою очередь, предоставляю стандартную инструкцию по открытию страницы из процесса.



Окно редактирования



Создать Действие процесса (UserTask). Действие = Открыть страницу

Создать скрипт подготовки перед действием и написать в нем следующее:

EntitySchemaUId = Page.DataSource.SchemaUId;

string recordId = Guid.Empty.ToString(); //Id записи

 

UserTaskRunSAObjectEditPage.OpenerPage = Page;

UserTaskRunSAObjectEditPage.OpenerPage = Page;

UserTaskRunSAObjectEditPage.PageUId = EditPageUId; //UID вашей страницы

var parameters = new Dictionary<string, string> {

    {"recordId", recordId.ToString()},

    {"entitySchemaUId", EntitySchemaUId.ToString()}, //UID вашего объекта (не обязательно)

    {"treeGridId", Page.TreeGrid.ClientID}

};

UserTaskRunSAObjectEditPage.PageParameters = parameters;

UserTaskRunSAObjectEditPage.Centered = true;

UserTaskRunSAObjectEditPage.CloseOpenerOnLoad = false;

Открытие простого окна

OpenDetailedPageUserTask.OpenerInstanceId = InstanceUId;

OpenDetailedPageUserTask.UseCurrentActivePage = true;

OpenDetailedPageUserTask.PageUId = EditPageUId;

var parameters = new Dictionary<string, string> {

    {"recordId", "recordId"},

    {"entitySchemaUId", ""},

    {"treeGridId", ""},

    {"SysModuleEditId", ""}

};

OpenDetailedPageUserTask.PageParameters = parameters;

OpenDetailedPageUserTask.Centered = true;

OpenDetailedPageUserTask.CloseOpenerOnLoad = false;

Открытие окна выбора элемента из справочника (с фильтрами)

Создать Действие процесса (UserTask). Действие = Открыть страницу выбора из справочника

Создать скрипт подготовки перед действием и написать в нем следующее:

var SSDocumentOfferingtId = new Guid(SysSettings.GetValue(UserConnection, "SSDocumentOfferingtId").ToString());//UID Объекта

Collection<Dictionary<string, object>> filters = new Collection<Dictionary<string, object>>();

filters.Add(new Dictionary<string, object> {

    {"comparisonType", FilterComparisonType.Equal},

    {"leftExpressionColumnPath", "Document"},

    {"useDisplayValue", false},

    {"rightExpressionParameterValues", new object[] {ParentDocumentSpecificationId}}

});

filters.Add(new Dictionary<string, object> {

    {"comparisonType", FilterComparisonType.NotEqual},

    {"leftExpressionColumnPath", "IsVsat"},

    {"useDisplayValue", false},

    {"rightExpressionParameterValues", new object[] {true}}

});

filters.Add(new Dictionary<string, object> {

    {"comparisonType", FilterComparisonType.IsNull},

    {"leftExpressionColumnPath", "[ProductsParts:DocumentOffering].Parent"},

    {"useDisplayValue", false},

    {"rightExpressionParameterValues", new object[] {}}

});

     

OpenSpecOfferingLookupUserTask.ProcessKey = InstanceUId;

OpenSpecOfferingLookupUserTask.PageParameters = new Dictionary<string, object>() {

    {"LookupFilters", filters},

    {"schemaUId", SSDocumentOfferingtId},

    {"customClosedEvent", "SpecOfferingLookupPageClosed"} //Сообщение при закрытии окна

};

OpenSpecOfferingLookupUserTask.UseCurrentActivePage = true;

return true;Создать скрипт обработки после действия и написать в нем следующее:

var offerings = OpenSpecOfferingLookupUserTask.GetSelectedValues(UserConnection) as Dictionary <string, object>;

var offeringId = Guid.Empty;

foreach (var offering in offerings) {

    offeringId = new Guid(offering.Key.ToString());

    break;

}

if (offeringId == Guid.Empty) {

    return true;

}

return true;

Возможно будет полезно.

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки

Андрей я перепробовал все, высылаю простой тестовый процесс, если у вас получиться буду рад,спасибо

Баглан, жду Вашего решения по поводу удаленного доступа.

"Андрей Каспаревич" написал:

Баглан, жду Вашего решения по поводу удаленного доступа.

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки


Андрей я скинул вам на корп почту, прошу посмотерть.

"Бахгельдиев Баглан Абылаевич" написал:
Андрей Каспаревич пишет:

Баглан, жду Вашего решения по поводу удаленного доступа.

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки

Андрей я скинул вам на корп почту, прошу посмотерть.

Андрей я получил ваше сообщение вчера сервер не был доступен, прошу сегодня попробовать подключиться

Спасибо, Баглан!
Сегодня попробуем.

"Андрей Каспаревич" написал:

Спасибо, Баглан!

Сегодня попробуем.

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки

Добрый день, Андрей удалось проблему исправить? вы обещали проблему посмотреть и написать мне, но отвас я так и не получил письма

Здравствуйте, Баглан!
Данное обращение находится в работе в департаменте разработки.
Пока что никаких результатов нет.

"Андрей Каспаревич" написал:

Здравствуйте, Баглан!

Данное обращение находится в работе в департаменте разработки.

Пока что никаких результатов нет.

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки

Здравствуйте Андрей, а когда будут результаты? уже 2-3 месяца прошел.

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

Показать все комментарии
права доступа Единое окно
Технические вопросы
5.x

Друзья, подскажите как мне про администрировать раздел "Единое окно"

Нравится

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

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

Андрей, спасибо за быстрый ответ.

И еще есть вопрос:
не могу скрыть раздел Журнад процесов.

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

delete from SysModuleInSysModuleFolder where sysmoduleId = (select Id from SysModule where Caption = 'Журнал процессов')

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

спасибо еще раз, Андрей. Но разобрался сам.

"крыть раздел можно удалив его регистрацию из таблицы [SysModuleInSysModuleFolder] скриптом" - это плохой вариант.

удалось это сделать запретив доступ к разделу Процесы

Показать все комментарии
закрытие окна
Технические вопросы
5.x

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

Нравится

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

Илья, при закрытии окна "крестиком" бизнес-процесс прерывается. Продолжить выполнение бизнес-процесса возможно из раздела "Журнал процессов".

Возможно, для решения Вашей задачи подойдет элемент "Вопрос пользователю"?

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

Роман, как раз нужно избавится от варианта "Журнал процессов", и закрытие "крестиком" должно приравнятся к нажатию кнопки "отмена".

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

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

Вот как раз это я и хочу сделать.
Вопрос: в какую сторону смотреть на получение события о закрытии окна?
Общая идея, предотвратить остановку процесса в случае закрытия пользователем окна по крестику. (задача, вопрос пользователю и т.д.)

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

namespace Terrasoft.Configuration
{
    public static class Alert
    {
                public static string RenderScript() {
                          return @"window.onbeforeunload = closingCode;
function closingCode(){
   alert(\"Нажат крестик!\"");

Код "window.onbeforeunload = closingCode" передбачає закриття вікна взагалі.
Там буде і [x], і [OK], і [Cancel].

Отже такий варіант не підійде, бо доведеться повністю переписувати обробку кнопок.

Показать все комментарии
floatDataControl
воркспэйс
Технические вопросы
Разработка

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

Как уже ранее я писал по другой проблеме: мне нужно добавить кнопку "Установить скидку на все продукты в счете" в воркспейс "Продукт" (wnd_OfferingDetailTreeArea) детали раздела "Счета".
Естественно, необходимо каким-то образом определить размер устанавливаемой скидки.

Я попробовал добавить floatDataControl на форму (см. приложенный скриншот fltDataControl.png).
Однако, при работе, значение в этом поле невозможно изменить, поле подсвечено серым и недоступно для редактирования.

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

Нравится

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

"Алейник Алексей Вадимович" написал:Я попробовал добавить floatDataControl на форму

Алексей, попробуйте добавить не floatDataControl, а NumericEdit + допишите нужное количество знаков после запятой в его свойствах, например, Precision=2 (по умолчанию там 0, кажется).
дело в том, что ДатаКонтролы "привязаны" к датасету (следовательно, данные берутся из какой-то таблицы либо же МемориДатасета), в Вашем же случае привязки нету, поэтому нужно использовать "обычный" контрол.
чтобы "взять" из него значение, пропишите NumericEdit.Value

Спасибо за помощь, Ольга. Подскажите, в таком случае, как мне обновить значения поля скидка и связанных с ним других полей записей продуктов в счете? Массив записей отфильтровал по 'InvoiceID':

function btnSetDiscountOnClick(Control) {
	var InvoiceDataset = Services.GetNewItemByUSI('ds_OfferingInInvoice');
	InvoiceDataset.Open();        
	ApplyDatasetFilter(InvoiceDataset, 'InvoiceID', InvoiceDataset.Values('InvoiceID'), true);
 
	if (InvoiceDataset.Values('InvoiceID') == null) {
		MessageBox('Нет привязанного счета!');
		return;
	}
//... здесь нужен код обновляющий записи (по одной и в цикле, как я понимаю)...
}

При обращении с помощью InvoiceDataset.Values('DiscountPercent') мы обращаемся сразу ко всем записям?
И надо-ли создавать новый UpdateQuery для обновления записей?

Хотел посмотреть как обновляются записи при изменении, например поля "% Скидки" карточки редактирования "Продукт" детали продукты раздела счета (wnd_OfferingDetailEdit). Нашёл обработчик dlDataOnDatasetDataChange, но в нём вызывается функция DatasetDataChange(), которая почему-то обрабатывает изменения только полей "OfferingID", "CustomOffering", "CurrencyID" и всё. Где реализовано обновление полей связанных со скидкой? я бы хотел воспользоваться кодами этих функций.

в событиях датасета (не окна) ds_OfferingInInvoice тоже есть событие ДатаЧендж, в котором прописана функция OfferingDetailDataChange(DataField, ScriptObject).
вот в ней и все "кейсы"-поля.

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

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

или Вам нужно свою логику дописать? тогда "копайте" дальше в функции OfferingDetailDataChange...

получился вот такой код в скрипте wnd_OfferingsDetailTreeAreaScript:

function btnSetDiscountOnClick(Control) {
	var InvoiceDataset = Services.GetNewItemByUSI('ds_OfferingInInvoice');
	InvoiceDataset.Open();        
	ApplyDatasetFilter(InvoiceDataset, 'InvoiceID', InvoiceDataset.Values('InvoiceID'), true);
 
	if (InvoiceDataset.Values('InvoiceID') == null) {
		MessageBox('Нет привязанного счета!');
		return;
	}
 
	while(!InvoiceDataset.IsEOF) {
		InvoiceDataset.Values('DiscountPercent') = numEditDiscount.Value;
		InvoiceDataset.GotoNext();
	}
 
	InvoiceDataset.Close();
	RefreshDataset(dlData.Dataset);
}

Однако, появляется ошибка (см. скриншот).

Видимо нужен на АпдэйтКвери?

"Алейник Алексей Вадимович" написал:появляется ошибка

ошибка так и говорит, что датасет не в том "режиме" (ни в едит -- редактирование, ни в инсерт -- добавление новой записи)
Вам нужно
"Ольга Прилипко" написал:сделать Едит() -- прописать скидку -- Пост()

т.е., если исходить из Вашего кода:

//...
 while(!InvoiceDataset.IsEOF) {
                InvoiceDataset.Edit();
                InvoiceDataset.Values('DiscountPercent') = numEditDiscount.Value;
                InvoiceDataset.Post();
                InvoiceDataset.GotoNext();
        }
//...

П.С. пересмотрела Вашу функцию...
можно узнать, почему Вы
А. берете новый екземпляр датасета ds_OfferingInInvoice
Б. накладываете фильтр по значению поля ИнвойсИД в нем...

ладно бы, если ИнвойсИД Вы откуда-то брали (из аттрибутов окна, например).
тут же оно непонятно какое значение подставит (теоретически -- понятно. оно откроет датасет и возьмет ИД счета из первой записи в нём. а вот какая это будет запись, зависит от сортировки по умолчанию и общей структуры запроса...)

если у Вас wnd_OfferingsDetailTreeArea (т.е. деталь Продукты в счете), то попробуйте так:

function btnSetDiscountOnClick(Control) {
        var InvoiceDataset = dlData.Dataset;;
        InvoiceDataset.GotoFirst();        
       //фильтр не надо, т.к. деталь уже отфильтрована по счету
        while(!InvoiceDataset.IsEOF) {
               InvoiceDataset.Edit();
                InvoiceDataset.Values('DiscountPercent') = numEditDiscount.Value;
                InvoiceDataset.Post();
                InvoiceDataset.GotoNext();
        }
 
        RefreshDataset(InvoiceDataset);
}

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

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

"Алейник Алексей Вадимович" написал:затем выскакивает ошибка(см. скриншоты) и до второй итерации дело не доходит.

судя по всему, ошибка выскакивает "дальше" (на ДатаЧендже), ее сообщение имеет ввиду, что не подключен какой-то скрипт или где-то опечатка в вызове функции. поскольку весь функционал "завернут" в конструкцию "try-finally", то оно и "вываливается" на finally.
Вы ничего в этом скрипте не меняли?
можно попробовать закомментировать строчки "try-finally"-- чтобы оно точно указало, чего ему "не хватает"..

Андрей, возможно, готов сегодня до 18:00 или на следующей недели.

Ольга, закомментировал try/fynally в датаченжде: при нажатии на кнопку, везде добавляет скидку, но подсвеченный (выделенный) продукт копирует дважды, ошибок не выдаёт.

Ошибка была устранена в ходе сеанса удаленного доступа.
Причина ошибки - обращение к отключенным полям датасета, которое происходило в момент пересчета суммы налога.

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

здравствуйте, Алексей!
можно использовать или Нотифай, или через модальное окно, которое может возвращать результат.
второй вариант -- посмотрите здесь

Если через Notify, то это как я понимаю нужно добавить обработчик на событие OnNotify формы? Можно какой-нибудь примерчик?

алгоритм навскидку :
1) при вызове окна в его Атрибуты добавляете атрибут НотифайОбжект = текущее окно (Селф).

Attributes('NotifyObject') = Self;
//.....
ShowEditWindowEx('wnd_xxx', Attributes, DefaultValues)

2) в самом окне, при нажатии "ок" или где у Вас там окно закрывается (т.е. перед его закрытием) пишите функцию СендНотифай(Селф, "месседж", данные)

SendNotify(Self, 'TodoSomething', Result);

Result -- сюда можете "положить" данные, которые нужно передать (как массив, строку или обьект, неважно. главное, при обработке к нему "правильно" обратится")
3) в первом окне, которое "получает" это сообщение, прописываете обработчик онНотифай (так, как Вы написали), там конструкция вида "если сообщение == "месседж", то выполняем чтото с данными".
если это какой-то воркспейс, т.е. есть базовые функции онНотифай, то после своей обработки пропишите базовую.

switch (Message) {
   case 'TodoSomething':
     //TODO
   break
}

удачи Вам!

Спасибо за помощь, Ольга!

Реализовал, как Вы по Вашему алгоритму, однако столкнулся с некоторыми проблемами.

1) Не выполняется функция SendNotify() добавленная в код обработчика btnOKOnClick(control)
см. скриншот notify_error.png

2) Не вызывается обработчик dlDataOnDatasetDataChange(DataField). Он должен блокировать и разблокировать соответствующие поля ввода значения скидки, в зависимости от типа скидки (абсолютное значение или значение в процентах)
скриншот OnDatasetDataChange.png

Буду признателен любой помощи.

Ругается именно на параметр Self.
При вызове SendNontify() без параметра Result всё тоже самое.

Алексей, такое ощущение, что проблема не в Self, а в обращении к функции SendNotify().
Проверьте, пожалуйста, происходит ли переход к описанию функции при клике по ее вызову с зажатой клавишей Ctrl.
Если нет - нужно подключить скрипт, в котором реализована функция (скрипт scr_WindowUtils).

Наталия, Вы были правы,
Сейчас я добавил scr_WindowUtils.
Однако, почему-то скидка не хочет инициализироваться.

Алексей, вложите, пожалуйста, сервисы.

Наталия, прикладываю сервисы:services.zip

Алексей, спасибо. Взяли в работу. Как только будет информация - отпишемся.

Алексей, для корректного назначения скидки замените строку кода:

InvoiceDataset.Values('DiscountPercent') = Data.Value;

На:

InvoiceDataset.Values('DiscountPercent') = Data;
Показать все комментарии
Технические вопросы
Разработка

Каким образом на стороне .Net можно создать объект таким образом, чтобы после получения его из COM компонента можно было бы обращаться к свойствам возвращенного объекта на JavaScript.

Нравится

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

Думаю, вот этот пример вам поможет

Спасибо, Павел! Но это не совсем то, что мне надо. Я уже имел похожую проблему с типом данных Scripting.Dictionary при разработке под C#, но она решилась подключением нужного пространства имен.

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

Принял, Павел, ваш вариант как рабочий. Спасибо!

Похожий вопрос! Как из COM Объекта вернуть Array. Если создать Array на c# и вернуть его javascript, то отсутствует свойство lenght.

Геннадий, а тип массив? Если да, то свойство length (либо метод size()) автоматом сгенерируются.
При обращении array.length - ошибка?

Массив создаю под .NET сл. образом (более сложные коллекции пробовал, но это полный фейл):

var Array = new object[size];

затем определяю набор значений для моего Array и записываю в свойство, которое будет доступно из COM объекта.

В JavaScript отладчик для Array.lenght определяет и тип и значение = undefined. А для самого массива тип определен как: "Массив Variant". В качестве значения показывает - {...} указывая на то, что это объект.

Вот это Вам должно помочь:

http://www.community.terrasoft.ru/forum/topic/8703

Пробовал создавать индексатор сразу же после того как ничего не получилось с прямой передачей массива. К сожалению не помогло. Сейчас чтобы упростить пример попробовал вставить код по ссылке, но результат тот же.
Индексатор на стороне JavaScript не откликается на обращение типа

...
var Value = Obj[i];
...

Поскольку кому-то ваш пример помог делаю вывод, что либо проблем в версии (у меня - 3.2.0.86), либо в прямизне рук. Кстати, если важно, то ОС - Windows 7.

А если так:

var Value = Obj.Items(1);
var Value = Obj.Items[1];
var Length = Obj.Items.length;
Показать все комментарии
7.x
OData
бизнес-процесс
интеграция
технические вопросы
Технические вопросы

Здравствуйте уважаемые разработчики!

Стоит задача интеграции BPMOnline 7 со сторонним приложением. Есть стандартный бизнес процесс. Необходимо, чтобы при добавлении записи из внешнего приложения запускался бизнес процесс, наступало следующее действие (формировалась задача менеджеру и т.д.). Каким образом это лучше реализовать?

1. Добавление записи через OData. Но в таком случае сработает ли начальное событие "Сигнал"?

2. Использование механизма ProcessEngineService?

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

Нравится

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

Александр, оба варианта имеют право на жизнь.

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

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

Спасибо, Игорь! Понятно.

И вопрос по ProcessEngineService. Можно ли задавать динамически приходящие параметры: например, в одном случае приходит 3 параметра, в другом 5?

Да, при запуске процесса через ProcessEngineService установка значений в параметры не обязательна.

Если значение не передано, параметр будет проинициализирован значением по умолчанию.

Если у процесса есть два параметра ParamA и ParamB.

Оба запроса создадут новый экземпляр процесса и запустят на выполнение:

http://demo.bpmonline.com/0/ServiceModel/ProcessEngineService.svc/My_Pr…
http://demo.bpmonline.com/0/ServiceModel/ProcessEngineService.svc/My_Pr…
При втором вызове ParamB будет равен пустой строке.

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

Пр.
/Execute?ParamA=Den&ResultParameterName=Param2

После завершения процесса в теле ответа будет лежать сериализированное значение параметра Param2

Показать все комментарии
1с интеграция
OData
Технические вопросы
7.x

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

подскажите решение такой задачи.

Необходимо реализовать двухстороннюю интеграцию BPMOnline On-Site 7.0 с 1С 8.2:

1. При сохранении продажи в BPMOnline должен создаваться новый документ в 1С - заказ покупателя

2. При создании/сохранении в 1С документа Приходный кассовый ордер в BPMOnline должен изменяться статус продажи на "Завершена"

Какими средствами это лучше реализовать?

Насколько я понимаю 2 пункт реализуется с помощью oData методом PUT для изменения значения поля конкретной продажи.

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

Нравится

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

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

Все верно, второй пункт: запрос по Odata к BPM. Писать придется на 1С-языке.

Пример обращения к Odata из 1С

Site = "http://site:8081/WebApp/";//СокрЛП(Константа.BPMonline_Site);
DeletedEntityQueryTextTitle = "0/ServiceModel/EntityDataService.svc/DeletedEntityCollection?$select=";
DeletedEntityQueryText1 = "Id,ID1C,EntityUId,ModifiedOn,Date,DocumentDate,Entity,DocumentDate,AccountType/Id,AccountType/Name,DocumentType/Id,DocumentType/Name,Division/Id,Division/Code1C,Division/Name";
DeletedEntityQueryText2 = "&$expand=AccountType,DocumentType,Division";
DeletedEntityQueryTextConditions = "&$filter=(ModifiedOn gt datetime'" + ModifiedDateFrom + "' and Division/Code1C eq '"+ DivisionCode + "') ";
DeletedEntityRequestText = Site + DeletedEntityQueryTextTitle + DeletedEntityQueryText1 + DeletedEntityQueryText2 + DeletedEntityQueryTextConditions;
OdataRequest = PreapareRequestHeader(DeletedEntityRequestText);
OdataRequest.SetCredentials("O.Kotko", "O.Kotko", 0);
OdataRequest.Send();

Первый - вопрос достаточно сложный. Рекомендую ознакомиться с этой темой:

http://www.community.terrasoft.ru/forum/topic/9527

Дмитрий, спасибо за ответ!

Ознакомился с постом. Насколько я представляю (пока теоретически) создается на сервере 1С COM-объект со ссылкой на COM службу 1С. Далее через .NET Remoting BPMonline обращается к нему.

Для реализации этого в бизнес-процессе необходимо добавить компонент C# скрипта, где реализовать логику обращения и работы с методами?

Валентин, это как один из вариантов.

Есть более "удачный" что ли вариант, работая через веб-сервисы 1С (это если 8.2).

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

Подскажите, данный вариант (1c_and_bpm70.rar) подходит только для bpm7, т.е. его нельзя использовать для bpm5.4?

Нет, почему... Можно, конечно, и под 5.4 использовать. Но, разумеется, результатов гарантировать Вам не могу.
Интеграция по этой технологии разрабатывалась и появится именно в 7.х в скором времени.

"Олейник Дмитрий" написал:

Валентин, это как один из вариантов.

Есть более "удачный" что ли вариант, работая через веб-сервисы 1С (это если 8.2).

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

Прикрепленный файлРазмер

1c_and_bpm70.rar
1.19 Мб

С уважением,

Олейник Дмитрий


Добрый день!

А есть файл Requests.rtf?

Добрый день,

Честно говоря, думал это стандартный отчет. К сожалению, нет.
Он используется просто для проверки наличия записей в плане обмена...
Просто откройте консоль запросов и выполните запрос:

ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Контрагенты.Изменения

где справочник.контрагенты - объект 1с, подключенный к плану обмена.

Спс, попробую.

Добрый день!

Не совсем понятно что в bpm'online (Версия 7.6.0.840) нужно добавить чтоб синхронизировать данные (например справочник контрагентов). Есть какое то видео или наглядный пример? Буду очень признателен.

Роман,

по 1C Connector как раз недавно выпустили статью и 2 обзорных видео.

Для включения функционала нужно накатить пакет поверх вашей системы. Скажите, у вас система OnSite или OnDemand?

Александр,
спасибо за очередную попытку впарить 1C Connector. Но скажите, пжл, как этот чудо продукт поможет мне использовать web сервисы сторонних разработчиков? Например, банальную загрузку курса валют. Или web сервис из этой статьи... Меня интересует информация как программиста, а не как пользователя.

Роман, базовая версия продукта 1C Connector абсолютно бесплатна и в скором времени будет включена во все базовые сборки bpm'online.
Изначально вопрос стоял, чтобы по событию в bpm'online вызывался web-сервис 1С, именно по такому принципу работает 1C Connector.

Если Вы хотите из кода 1С получить данные "web сервисов сторонних разработчиков", то не совсем понятно при чем тут bpm'online:smile:. Если все таки Вы хотите получить данные в код 1С из сервисов bpm'online, достаточно обратиться к сервисам bpm'online по протоколу OData, как указано в 1м комментарии к этому посту.
В приведенной Вами статье нет ни слова про синхронизацию, только про одностороннее получение данных в 1С из внешних сервисов. Кстати там в дисклеймере написано, что указанный код НЕ будет работать в последних версиях 1С.
Кстати, чтобы отправить какую то информацию из 1С в bpm'online, мы тоже не пишем код на 1С. Мы используем план обмена и обращения ИЗ bpm'online В 1C. Это отдельная тема, обещаю пост на эту тему до конца месяца:smile:

Александр, мне нужно в bpm'online использовать web сервисы. Все равно чьи, будто 1С или другой поставщик. По скольку я сам программист 1С, мне проще создать web сервис в ней. Не понятно как в bpm'online использовать эти сервисы. Например, в 1С есть WS-ссылки в которые позволяют подтянуть web-сервисы и работать с ними... Принцип работы через план обмена мне понятен...
Мне к концу месяца нужно увязать 1С и SharePoint с bpm'online, иначе смысла дальше не будет мне изучать... :-(

P.S. Где я могу получить 1C Connector?
Заранее благодарен.

Роман, теперь понял задачу.
Вам нужно:

  1. Создать бизнес-процесс и повесить его на сигнал, например так:
  2. Написать скрипт обращения к веб-сервисам так, как бы вы его писали на классическом C#

Приведу 2 примера скриптов:

  1. Отправка сообщения через сервис смс-рассылки по протоколу SMPP (код намерено упрощен, отсутствуют дополнительные проверки):
    SmppClient mmclient = new SmppClient();
    SmppConnectionProperties mmproperties;
    TextMessage msg = new TextMessage();
    mmproperties = mmclient.Properties;
     
    mmproperties.SystemID = "someClient";
    mmproperties.Password = "somePassword";
    mmproperties.Port = 4442;
    mmproperties.Host = "server1.smstraffic.ru";
     
    mmclient.Start();
     
    msg.DestinationAddress = "+79023218417";
    msg.SourceAddress = "PTSOFT";
    msg.Text = "Ваш номер телефона успешно зарегистрирован. Код подтверждения " + code;
    msg.RegisterDeliveryNotification = true;
     
    mmclient.SendMessage(msg);
  2. Обращение к сервисам 1С из того же 1C Connector:
    System.ServiceModel.EndpointAddress ep = new System.ServiceModel.EndpointAddress(settings.Integration.OneCServer);
    System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
     
    binding.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly;
    binding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Basic;
    binding.MaxReceivedMessageSize = 2147483647;
    syncClient = new SyncService.PT1CConnectorPortTypeClient(binding, ep);
    syncClient.ClientCredentials.UserName.UserName = settings.Integration.OneCUser;
    syncClient.ClientCredentials.UserName.Password = settings.Integration.OneCPassword;
    syncClient.Open();

По 1C Connector напишите мне пожалуйста на почту - svistunov@samarasoft.ru, я скину все материалы, дистрибутив и инструкцию по установке.

Вопрос может и простой, но ответа сам найти не могу, BPM 7.6, 1C 8.2, интеграция с СамараСофт, веб сервис IIS создан без файла 1cws, а для ссылки, мне сказали, он обязателен, на форумах пишут что в 8.2 его нет, как поступить?

Владимир, добрый день!
Все очень просто - следуете в точности шагам инструкции, настраиваете работоспособность коннектора в соответствии с пунктами руководства, а уже потом можете пытаться варьировать параметрами настройки на основе рекомендаций сторонних форумов и опыта в 1С.
На сколько я понимаю, у вас сейчас проблемы с пунктом 1.3.3 руководства (НАСТРОЙКА СВОЙСТВ WEB-СЕРВИСА)?
Я прошу вас проверить, что все предыдущие пункты вы выполнили без отклонений в точном соответствии с руководством и прислать свойства веб-сервиса. Согласно инструкции, они должны выглядеть именно так:

Здравствуйте, Александр
Вот так у меня выглядит 1С
http://joxi.ru/RmzqJgpUE3oRrO
вот так я обращаюсь к нему через браузер
http://joxi.ru/5md7PWjc9dEQr1
и вот что я вижу в интеграции bpm
http://joxi.ru/RmzqJgpUE38RrO
в чем все таки проблема?

Добрый день!

У меня то же самое выдало сообщения. Платформа 8.3. При подключении к web-сервисам из другой 1С все работает...

Здравствуйте, у меня нет другой 1С...

Владимир, Роман, возможно, Вам будет полезна данная статья http://www.community.terrasoft.ru/blogs/10766 где также рассматривается вопрос по работе РТ 1С коннектора http://www.community.terrasoft.ru/blogs/10766 или статья на sdk где рассматривается работа через вебсервисы http://academy.terrasoft.ru/documents/docs/technic/SDK/7.4.1/Integratio…

Коллеги,

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

  1. НЕ указывать пространство имен
  2. Указать имя сервиса, как в инструкции
  3. Обращаться к созданному сервису, а не к веб-интерфейсу 1С, это принципиально разные вещи
  4. Проверил, сейчас даже базовый сервис не доступен - http://joxi.ru/a2XQZgdiP8lWAg

Владимир, просьба - устраните пожалуйста отклонения 1-4 от инструкции и напишите мне, если проблема сохранилась. Если сохранилась - подключимся и сразу решим!

Здравствуйте, Александр, у Вас ошибочка вкралась, не http://srdv-venta-nt.ru/bpmconnector, а http://srdv.venta-nt.ru/bpmconnector

Инструкция гласит http://joxi.ru/8An6R0LS6307AO, у меня http://joxi.ru/RmzqJgpUE3oRrO, так указывать пространство имен или нет, имя сервиса указано, bpmconnector и есть созданный сервис, файла 1cws в версии 8.2 нет

Владимир,
*.1cws в 8.2 есть, это я вам ответственно заявляю:smile:

И даже на Вашей системе, вот правильная ссылка, которая сформирована Вашей 1C с учетом Ваших настроек - http://srdv.venta-nt.ru/bpmconnector/ws/bpmconnector.1cws

Пропишите пожалуйста именно этот адрес на стороне bpm'online и попробуйте подключиться под своими учетными данными.

Владимир, Добрый день!

Небольшая ремарка: как мы Вам писали, пространство имен должно быть PT1CConnector.

С уважением,
Зайчиков Илья

Александр, этот вариант уже пробовался неоднократно, http://joxi.ru/Q2KpPxJFZDLkAj

Вот такой результат без bpm, http://joxi.ru/1A5z79NuLebMrE

Интересует более детальное описание, как правильно прописывать путь к веб сервису.
Вот у меня версия BPM onsite sales 7.6 установлена на компьютере, 1С Предприятие 8.2, имя публикации веб-сервиса ws1.1cws. Это все на локальном компьютере. Вот адрес системы: http://localhost:81/0/Nui/ViewModule.aspx#IntroPage/OmnichannelIntro Тогда как мне нужно прописать веб-сервис в 1С коннекторе?

Добрый день, коллеги! Проблема Владимира была выявлена. Она заключалась в том, что в логине прописали некорректные данные. Вместо английской буквы "Си" была использована, видимо, русская "С". Поэтому возникали ошибки. Сейчас веб-сервис доступен.

С уважением,
Зайчиков Илья

Николай, правильно писать путь следующим образом:

Например:
сервер stnd-1c-05
имя публикации Russia76
имя файла ws76.1cws

Ссылка: http://stnd-1c-05/Russia76/ws/ws76.1cws

Т.е. http://имя_сервера/имя_публикации/ws/ws1.1cws

С уважением,
Зайчиков Илья

Не могу понять, что мне писать вместо сервера stnd-1c-05?

У меня 1С на локальном компе.
http://localhost/TradeEntrUkr/ws/ws1.1cws не подходит, http://192.168.1.105/TradeEntrUkr/ws/ws1.1cws тоже не подходит.
Пишет: Not Found
The requested URL /TradeEntrUkr/ws/ws1.1cws was not found on this server.

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

Анатолій, добрый день.

Я правильно понял, что Вы прошли все шаги инструкции по установки до публикации и настройки сервисов включительно и сервисы у вас опубликованы и доступны из браузера, но недоступны из 1C Connector?

Да, я все проделал по инструкции. Я не знаю как проверить доступны ли они из браузера, потому как не понимаю, какой сервер прописать. 1С у меня на компе. Публикацию и настройку сервисов проделал.

Анатолій, смело добавляйте меня в скайп - поможем:smile:
aleksandr.svistunov@hotmail.com

P.S.: скайп сегодня подташнивает, поэтому можете написать на почту svistunov@samarasoft.ru

Боюсь, что нахожусь уже в черном списке поддержки Самарасофт, поэтому спрошу здесь на виду общественности :smile:
7.6.0 sales + 1с 8.3
В рамках самообразования проделал все шаги мануала по настройке коробочной интеграции.
Сервис созданный вижу в браузере, ссылка получилась вида "http://192.168.40.174/InfoBase/ws/PT1CCONNECTOR.1cws" и работает в браузере (то есть вебсервис 1c виден и откликается).
Но вот при запуске интеграции из bpm штатной кнопкой в логе вот такой текст:

13-10-2015 01:08:59:: message: Start Sync
13-10-2015 01:08:59:: message: Start Sync 80bb62e8-dbbe-4df3-9f68-6f2360b25ed1
13-10-2015 01:08:59:: message: to 1C. 1C Table:Контрагенты
13-10-2015 01:08:59:: message: to 1C. 1C Table:Контрагенты bpm table: Account
13-10-2015 01:08:59:: message: ESQ. Get 47 records
13-10-2015 01:09:00:: message: Start Sync 234f8e3a-d3f0-43a4-904d-02ae9b5e4a9b
13-10-2015 01:09:00:: message: Integration in bpm
13-10-2015 01:09:00:: message: start in bpm
13-10-2015 01:09:00:: message: Контрагенты
13-10-2015 01:09:00:: message: syncPairs.Count: 2
13-10-2015 01:09:00:: message: Запрос HTTP не разрешен для схемы аутентификации клиента "Basic". От сервера получен заголовок аутентификации "Basic realm="1C:Enterprise 8.3"".
13-10-2015 01:09:00: Error: error in  on 1C -> bpm'online with таблица bpm'online Account, таблица 1С Контрагенты, Запрос HTTP не разрешен для схемы аутентификации клиента "Basic". От сервера получен заголовок аутентификации "Basic realm="1C:Enterprise 8.3"".
13-10-2015 01:09:00:: message: Integration in bpm end

Очень хочется получить подсказку, куда копать и где искать причины того, что созданный вебсервис 1с не может достучаться до развернутого локально под iis сайта (правильно понял я источник проблемы?) - что надо хитрого сделать с настройками iis или windows server 2008 r2 (где развернут сайт), чтобы наконец соединение прошло?
1c вместе с вебсервисом поднято на другой машине под Windows 7, локальная сеть одна, домена нет.

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

Написал ответ в тот же день, как Вы написали данный запрос.
Поддержка Программных технологий никого не ставит в черный список:)

Здесь может быть несколько вариантов:

1. Могут быть неверными логин и пароль
2. Может быть не включена анонимная аутентификация на iis
3. Возможно какой-то пункт из инструкции был сделан неправильно(к сожалению, такое чаще всего происходит)

Для более оперативного общение можно писать мне напрямую в скайп: zaichikovilya_samarasoft

С уважением,
Зайчиков Илья
Менеджер продуктов
ООО «Программные Технологии»
Центр разработки и внедрения Террасофт Поволжье
Тел. +7 (846) 266-55-69
samarasoft.com

"Зайчиков Илья Алексеевич" написал:1. Могут быть неверными логин и пароль
2. Может быть не включена анонимная аутентификация на iis
3. Возможно какой-то пункт из инструкции был сделан неправильно(к сожалению, такое чаще всего происходит)

Добрый день, Илья!

1. Логин/пароль в bpmonline задаются в параметрах синхронизации - там логин/пароль 1с верный, а вот для bpm только логин - проверил, все заполнено корректно.
2. Включена на стороне iis с вебсервисом и на стороне bmponline. Удостоверение анонимного пользователя=указанный пользователь IUSR
3. Вот это самое сложное, хотя проверял шаги несколько раз. Кстати кнопка Проверить соединение в настройках интеграции также выдает ошибку.

Пытался я разобраться с сертификатами для серверов, но безрезультатно. Мне все же кажется тут какой-то галочки или параметра не хватает в разрешениях на iis (недаром про протокол http пишет), понять бы хоть на каком)

Александр,

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

В котором часу Вы завтра можете предоставить нам доступ?

С уважением,
Зайчиков Илья
Менеджер продуктов
ООО «Программные Технологии»
Центр разработки и внедрения Террасофт Поволжье
Тел. +7 (846) 266-55-69
Сот. +7 (937) 076-12-84
samarasoft.com

Стучусь в скайп :)
Спасибо!

Показать все комментарии
Технические вопросы
Разработка

Добрый день сообщество. Установил Oracle 9i на локальную машину. Поставил клиентские драйвера. Создал базу данных с именем ts и востановил из дампа базу данных террасофт. Подключился с помощью менеджера к ней, все таблицы вроде как создались. Пытаюсь настроить подключение в террасофт 3.3.1 и возникает ошибка:

ORA-12514 TNS процесс прослушивания не нашел SERVICE_NAME для данного дескриптора соединения.

С ораклом знаком первую неделю так что куда смотреть не знаю. Помогите кто сталкивался.

В архиве файлы tnsnames.ora и listener.ora

Нравится

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

Решил проблему подключения но возникла след. При логине пишет ORA-00902 неверный тип данных.

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

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

ORA-00902 неверный тип данных.
Понял что надо было имя схемы установить полностью в верхний регистр.
След ошибка вылезла:
ORA-04092 COMMIT в триггере невозможно

----------------------------------
Timestamp: 14:04:01.299
Logon attempt failed. username: 'SUPERVISOR'; database: 'tswork'
----------------------------------
Timestamp: 14:04:01.299
Runtime error occurred: 1005 (ORA-01005: задан пустой пароль; вход в систему запрещается)
----------------------------------
Timestamp: 14:04:05.940
Successful logon attempt (session tag: 0xE417140) 
username: 'SUPERVISOR'; database: 'tswork'
----------------------------------
Timestamp: 14:04:05.940
declare  cursor NlsParamsCursor is    SELECT * FROM nls_session_parameters;begin  SELECT Nvl(Lengthb(Chr(65536)), 
Nvl(Lengthb(Chr(256)), 1))    INTO :CharLength FROM dual;  for NlsRecord in NlsParamsCursor loop    if NlsRecord.parameter = 
'NLS_DATE_LANGUAGE' then      :NlsDateLanguage := NlsRecord.value;    elsif NlsRecord.parameter = 'NLS_DATE_FORMAT' then      
:NlsDateFormat := NlsRecord.value;    elsif NlsRecord.parameter = 'NLS_NUMERIC_CHARACTERS' then      :NlsNumericCharacters := 
NlsRecord.value;    elsif NlsRecord.parameter = 'NLS_TIMESTAMP_FORMAT' then      :NlsTimeStampFormat := NlsRecord.value;    
elsif NlsRecord.parameter = 'NLS_TIMESTAMP_TZ_FORMAT' then      :NlsTimeStampTZFormat := NlsRecord.value;    end if;  end loop; 
 SELECT NLS_CHARSET_ID(:Charset) INTO :CharsetId FROM dual;end;
CharLength = 1
NlsDateLanguage = 'RUSSIAN'
NlsDateFormat = 'DD.MM.RR'
NlsNumericCharacters = ', '
NlsTimeStampFormat = 'DD.MM.RR HH24:MI:SSXFF'
NlsTimeStampTZFormat = 'DD.MM.RR HH24:MI:SSXFF TZR'
Charset = 'UTF8'
CharsetId = 871
----------------------------------
Timestamp: 14:04:05.955
ALTER SESSION SET CURRENT_SCHEMA = SUPERVISOR
----------------------------------
Timestamp: 14:04:05.955
select * from table(CAST("SUPERVISOR"."fn_GetLoginInfo" ('SUPERVISOR') AS "SUPERVISOR"."tbl_GetLoginInfo"))
----------------------------------
Timestamp: 14:04:05.971
SELECT
  Column_Name Col, Con.Constraint_Name Con
FROM
  All_Constraints Con, All_Cons_Columns Col
WHERE
  Con.Owner = :Owner and
  Col.Owner = :Owner and
  Con.Table_Name = :Name and
  Col.Table_Name = :Name and
  Con.Constraint_Type in ('P', 'U') and
  Con.Constraint_Name = Col.Constraint_Name
ORDER BY
  Con.Constraint_Name,Col.Position
Name = 'TABLE'
Owner = 'SUPERVISOR'
----------------------------------
Timestamp: 14:04:05.986
Logoff (session tag: 0xE417140).
----------------------------------
Timestamp: 14:04:05.986
Runtime error occurred: 4092 (ORA-04092: COMMIT в триггере невозможно)

вот что выдает sql монитор

Однозначно определить причину проблемы очень непросто. Возможно при установке схемы в ней есть "невалидные" объекты (функции, процедуры, триггера). Если это так, нужно попробовать их откмпилировать. Это можно сделать командой из контекстного меню в каком-нибудь Oracle-менеджере, например TOAD. Важно то, как устанавливалась схема. Обязательно это нужно выполнять при помощи скриптов, которые находятся в дистрибутиве в папке "DB" (запускается на выполнение командный файл RestoreDatabase.cmd). Какая схема устанавливалась? Чистая из дистрибутива или перенос уже работавшей. Если схема переносится, то это нужно выполнять только при помощи инструментария: http://community.terrasoft.ua/blogs/4524. Как вариант попробувать выполнить через какой-то инструмент работы с Oracle запрос из лога выше: select * from table(CAST("SUPERVISOR"."fn_GetLoginInfo" ('SUPERVISOR') AS "SUPERVISOR"."tbl_GetLoginInfo"))

Александр в скриптах по созданию фигурирует схема TSAUTOBUILD которой как я понял у меня нету. Откуда она береться? я создаю базу данных первоначально с помощью dbca на сервере. После чего запускаю bat файл из папки DB с инсталяцией террасофта.

При выполнении скрипта востановления из дампа выходят такие ошибки

IMP-00017: при выполнении следующей команды ORACLE возвращает ошибку 23308:
"BEGIN DBMS_DDL.SET_TRIGGER_FIRING_PROPERTY('"TSAUTOBUILD"', '"tr_tbl_Oppo"
"rtunityHistory_BI"', FALSE); END;"
IMP-00003: ORACLE выдал ошибку 23308
ORA-23308: объект TSAUTOBUILD.tr_tbl_OpportunityHistory_BI либо неправильный, либо не существует
ORA-06512: на "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: на "SYS.DBMS_DDL_INTERNAL", line 41
ORA-06512: на "SYS.DBMS_DDL", line 255
ORA-06512: на line 1

 (ORA-04092: COMMIT в триггере невозможно)

Проверьте, похоже что у вас есть триггер на Logoff

Схема TSAUTOBUILD - это та, с которой делается дамп, поставляемый с дистрибутивом. Её у Вас нет и не должно быть. "" Пользовательскую схему не нужно создавать в ручном режиме. Как я сообщал выше для этого предназначен инструментарий из папки "DB". Там в скриптах предусмотрено что дамп был создан со схемы TSAUTOBUILD. Обращаю Ваше внимание на то, что термин "база данных" в Oracle радикальным образом отличается от такого же по звучанию и написанию в MS SQL Server. Если проводить аналогию с SQL, то база в Oracle - это экземпляр в MS SQL Server, а база в SQL - это схема в Oracle. Таким образом создавая базу на Oracle через DBCA - это всё равно, что установить ещё один SQL-экземпляр. Как я уже сообщал, установите схему через запуск RestoreDatabase.cmd. Приу становке в процессе будут сообщения об ошибках при создании триггеров - не обращайте внимания (только на эти сообщения, на остальные - обращайте) они создаются.

"Евгений Либин" написал:Проверьте, похоже что у вас есть триггер на Logoff

Можно по подробнее? не совсем понял где смотреть

Здравствуйте.
Вопрос был решён в режиме удалённого доступа.

Показать все комментарии
диалоговое окно
Технические вопросы
Разработка

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

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

Нравится

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

Здравствуйте.
Нет, к сожалению такого окна нету, мы же не можем предусмотреть всех вариантов.

Есть следующие типы окон:

ShowErrorDialog(Message);
ShowWarningDialog(Message);
if (MessageResult = System.MessageDialog(Message, mdtWarning, mdbYes + mdbNo, 0) != wmrYes) {
}
if (ShowConfirmationDialog(Message) != wmrYes) {
}

Есть информационное окно еще

ShowInformationDialog(Message);
Показать все комментарии