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

Нравится

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

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

Не совсем понял ваш вопрос, но начиная с версии 7.17.4 можно вызвать веб-сервис с помощью следующего кода:

 

using Terrasoft.Configuration.ServiceSchema;
 
//...
 
try {
    // Создаем экземпляр ServiceSchemaClient
    var client = ClassFactory.Get<IServiceSchemaClient>();
    // Настраиваем параметры вызова
    var parameters = new Dictionary<string, object>() {
        {"id", 1}, {"name", userName}
    };
    // Получаем результат выполнения
    var serviceResponse = client.Execute(UserConnection, serviceName, methodName, parameters);
} catch (Exception e) {
    // Обрабатываем ошибки
}

Также вам может помочь обсуждение тут.

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

Добрый день, имеется развернутый локально Creatio. Хочу добавить лэндинг(чтобы можно было к примеру перейти на localhost/landing/index.aspx) с формой, у которой есть поле phone и данные введенные в поле будут попадать в контакты -> мобильный телефон уже к имеющемуся контакту.

Что уже сделал?

Сейчас контакт выглядит следующим образом

Изображение удалено.

Как описано в документации добавил лэндинг. Сжато он выглядит так:

Изображение удалено.

После чего в папке ../0/Nui/ создал папку Landing с файлом index.aspx в котором лежит следующий код:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <!--ШАГ 2-->
    <!--Эту часть необходимо скопировать из поля ШАГ 2 страницы редактирования лендинга-->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/track-cookies.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/create-object.js"></script>
    <script>
 
    var config = {
        fields: {
            "Subject": "#subject-field",
            "Email": "#email-field",
            "Name": "#name-field",
            "MobilePhone": "#phone-field",
        },
        landingId: "54a57d16-e7b6-4c7d-9c38-237cfcf6512d",
        serviceUrl: "http://localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData",
        redirectUrl: "yandex.ru"
    };
 
    function createObject() {
        landing.createObjectFromLanding(config)
    }
    </script>
    <!--ШАГ 2-->
</head>
<body>
<h1>Landing web-page</h1>
<div>
    <h2>Case form</h2>
    <form action="localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData" method="POST" class="mainForm" name="landingForm" onSubmit="createObject(); return false">
        Subject:<br>
        <input type="text" name="subject" id="subject-field"><br>
        Email:<br>
        <input type="text" name="Email" id="email-field"><br>
        Name:<br>
        <input type="text" name="Name" id="name-field"><br>
        Phone:<br>
        <input type="text" name="Phone" id="phone-field"><br><br>
        <input type="submit" value="Submit">
        </font>
    </form>
</div>
</body>
</html>

Если я правильно понял для того чтобы POST запрос прошел корректно должен отработать файл GeneratedObjectWebFormService.svc. Нужно ли его создавать по документации или он является дефолтным? При попытки отправки запроса возникает 403 ошибка. Как сделать это рабочим и какие ошибки я совершил?

Изображение удалено.

Изображение удалено.

Нравится

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

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

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

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

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

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

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

Нет, дело не в этом. Посмотрите второй абзац прошлого ответа.

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

исправил без /0/ теперь следующую проблему не могу побороть 

политика CORS дефолтная и выглядит так:

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

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

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

Имеется следующая проблема: Возникают различные ошибки при установке пакетов скачанных с marketplace. Устанавливаю стандартным способом, через интерфейс установки приложений в BPM. Например, установка валится на проверке зависимостей устанавливаемого пакета от пакетов в БД, или при выполнении sql скриптов установки справочных значений,  и т.д..

Вопрос: каким образом можно разобрать(распаковать) скачанный с marketplace пакет(приложение) на составляющие,  что-то поправить в нем и собрать обратно для загрузки на свой стенд BPM? Может есть инструкция(на академии не нашел) ?

Спасибо!

Нравится

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

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

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

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

Про marketplace понятно, что лучше обратиться к разработчику пакета. Но вопрос у меня в другом. Если например, стандартным способом выгрузить пакет из из системы, то он выгружается в архиве zip, а в нем архив gz, а в нем один файл. Вот вопрос - можно ли этот файл как-то открыть в VisualStudio например для редактирования?

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

Вот нашел, утилиту bpmcli

https://github.com/Advance-Technologies-Foundation/bpmcli&nbsp; - может она умеет распаковывать пакеты?

Там упоминается команда:

Convert existing package to project

Convert package with name MyApp and MyIntegration, located in directory C:\Pkg

bpmcli convert -p C:\Pkg -n MyApp,MyIntegration

Convert all packages in directory C:\Pkg

bpmcli convert -p C:\Pkg

Её код — в файле PackageConverter.cs 

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

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

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

Всем привет в документации есть пример с добавление нового контакта по средствам веб запроса. Сделал все работает. Щас пытаюсь записать лид, но получаю:"Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.". Подскажите что я делаю не так?

В тесте пытаюсь записать лид с одним заполненным полем(Название контрагента

Мой код:

public static void insertData()
        {
            Console.WriteLine("Попытка создать лид");
 
            // Экземпляр класса запроса.
            var insertQuery = new InsertQuery()
            {
                // Название корневой схемы.
                RootSchemaName = "Lead",
                // Коллекция добавляемых значений колонок.
                ColumnValues = new ColumnValues()
            };
 
            var columnExpressionName = new ColumnExpression
            {
                // Тип выражения запроса к схеме объекта — параметр.
                ExpressionType = EntitySchemaQueryExpressionType.Parameter,
                // Параметр выражения запроса.
                Parameter = new Parameter
                {
                    // Значение параметра.
                    Value = "ЛИД C САЙТА",
                    // Тип данных параметра — строка.
                    DataValueType = DataValueType.Text
                }
            };
 
 
          
 
            // Инициализация коллекции колонок запроса.
            insertQuery.ColumnValues.Items = new Dictionary<string, ColumnExpression>();
            // Добавление выражений запроса в коллекцию добавляемых колонок.
            // Колонка [Название контрагента].
            insertQuery.ColumnValues.Items.Add("Account", columnExpressionName);
           
 
 
            // Сериализация экземпляра класса запроса на добавление в JSON-строку.
            var json = new JavaScriptSerializer().Serialize(insertQuery);
 
            // Преобразование строки JSON-объекта в массив байтов.
            byte[] jsonArray = Encoding.UTF8.GetBytes(json);
            // Создание экземпляра HTTP-запроса.
            var insertRequest = HttpWebRequest.Create(insertQueryUri) as HttpWebRequest;
            // Определение метода запроса.
            insertRequest.Method = "POST";
            // Определение типа содержимого запроса.
            insertRequest.ContentType = "application/json";
            // Добавление полученных ранее аутентификационных cookie в запрос на получение данных.
            insertRequest.CookieContainer = AuthCookie;
            // Установить длину содержимого запроса.
            insertRequest.ContentLength = jsonArray.Length;
 
            // Добавление CSRF-токена в заголовок запроса.
            CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));
            string csrfToken = cookieCollection["BPMCSRF"].Value;
            insertRequest.Headers.Add("BPMCSRF", csrfToken);
 
            // Помещение в содержимое запроса JSON-объекта.
            using (var requestStream = insertRequest.GetRequestStream())
            {
                requestStream.Write(jsonArray, 0, jsonArray.Length);
            }
 
          
          
          // Выполнение HTTP-запроса и получение ответа от сервера.
          using (var response = (HttpWebResponse)insertRequest.GetResponse())
          {
              // Вывод ответа в консоль.
              using (StreamReader reader = new StreamReader(response.GetResponseStream()))
              {
                  Console.WriteLine("JSON ответ от сервера");
                  Console.WriteLine(reader.ReadToEnd());
              }
          }
 
 
        }

 

Нравится

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

Добрый день.

В таких случаях проще всего сравнить запросы через Fiffler(тогда станет ясно что забыли). Пример работы можно посмотреть - https://academy.terrasoft.ua/documents/technic-sdk/7-12/vypolnenie-zapr…

Короче, проблема было в том что в карточке лида были обязательные поля. Но конечно забавно возвращать 500ю ошибку 

VladKapitanchyk,

Спасибо

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

Добрый день!

На маркетплэйсе в данный момент существует только одно решение по интеграции скриптов телефонных продаж в CRM (коннектор скриптдизайнер).

Скажите пожалуйста, быть может кто-то пробовал реализовывать скрипты продаж своими способами (может даже внутренними средствами bpm: через бизнес-процессы)?

Может есть другие интеграции скриптов, помимо решения , представленного на маркетплэйс?

Нравится

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

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

Для решения вашей бизнес цели Вы можете использовать базовый функционал bpm'online, например, создать бизнес процесс, который будет запускаться по сигналу Звонок. После чего будет выполнять переход по созданным страницам (элемент "Автогенерируемая страница"). 

Альтернативный вариант, чтобы не нагружать систему по "сигналу Звонок" Вы можете назначить операторам организационную роль "Оператор КЦ", тогда на CTI - панели будут отображаться бизнес процессы которые можно запускать во время звонка. Указываются в справочнике "Действия cti панели".

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

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

Нравится

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

День добрый! 

Скрипт по апдейту значений из продукта в заказе продуктов в счете (через график поставок и оплат) лежит в схеме OrderAmountHelper.

Удачи!

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

Необходимо установить валидацию на заполнения полей детали средства связи тип телефон
validateField: function(value) {
var invalidMessage = "";
var communicationType = this.get("CommunicationType");
if (communicationType) {
if (CommunicationUtils.isEmailType(communicationType.value) && !Ext.isEmpty(value) &&
!EmailHelper.isEmailAddress(value)) {
invalidMessage = resources.localizableStrings.WrongEmailFormat;
} else if (CommunicationUtils.isPhoneType(communicationType.value) &&
!this.isPhoneNumber(value)) {
invalidMessage = resources.localizableStrings.WrongPhoneFormat;
} else if (CommunicationUtils.isSkypeType(communicationType.value) && !Ext.isEmpty(value) &&
!this.isSkypeAddress(value)) {
invalidMessage = resources.localizableStrings.WrongSkypeFormat;
}
}
return {
fullInvalidMessage: invalidMessage,
invalidMessage: invalidMessage
};
},

это метод из модуля BaseCommunicationViewModel, переопределил этот метод в замещающей странице, но никак изменений на странице контактов не происходит:)

Нравится

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

так же есть еще метод isPhoneNumber: function(value) {
var phonePattern = /^[^'|^`]*$/;
return phonePattern.test(value);
},

Евгений, добрый день.

Насколько я понимаю, Вы замещали ViewModel, что в принципе не есть хорошей практикой, да и если это и делать, необходимо полностью переносить код из базовой реализации. Рекомендую Вам создать замещающую схему для самой детали, и в:
this.addColumnValidator("Number", newItem.validateField, newItem);
и вместо validateField вызывать свою реализацию.

"Мотков Илья" написал:

Евгений, добрый день.

Насколько я понимаю, Вы замещали ViewModel, что в принципе не есть хорошей практикой, да и если это и делать, необходимо полностью переносить код из базовой реализации. Рекомендую Вам создать замещающую схему для самой детали, и в:

this.addColumnValidator("Number", newItem.validateField, newItem);

и вместо validateField вызывать свою реализацию.


спасибо за совет:)

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

Необходимо что бы для объекта орг структуры скрывалась вкладки с деталями на странице редактирования. исходный код замещающей страницы позволяет скрыть и добавить вкладку, но при сохранении консоль выдает ошибку :
define("SysAdminUnitPageV2", ["ConfigurationConstants"],
function() {
return {
entitySchemaName: "SysAdminUnit",
attributes: {
"ITShowDetails": {

"dataValueType": this.Terrasoft.DataValueType.BOOLEAN,
"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
"dependencies": [
{
"columns": ["ITShowDetails"],
"methodName": "showRegionsSalesAreas"

}
]

}

},
details: /**SCHEMA_DETAILS*/{

"ITRegionInOrgStructureDetail": {
"schemaName": "ITRegionInOrgStructureDetail",
"entitySchemaName": "ITRegionInOrgStructure",
"filter": {
"detailColumn": "ITSysAdminUnit",
"masterColumn": "Id"

}

}
}/**SCHEMA_DETAILS*/,
methods: {
onEntityInitialized: function() {
this.callParent(arguments);
this.showRegionsSalesAreas();
},
showRegionsSalesAreas: function() {

var showDetail = this.get("ITShowDetails");
var tabsCollection = this.get("TabsCollection");
var selectTab = tabsCollection.contains("ITRegionsSalesAreas") ?
tabsCollection.get("ITRegionsSalesAreas"):false;
if (showDetail === true && !selectTab) {
tabsCollection.insert(5, "ITRegionsSalesAreas", this.selectTab);

} else if (showDetail === false &&
selectTab) {
this.selectTab = selectTab;
tabsCollection.removeByKey("ITRegionsSalesAreas");

}
this.callParent(arguments);
}
},
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"parentName": "Tabs",
"propertyName": "tabs",
"index": 5,
"name": "ITRegionsSalesAreas",
"values": {
"caption": {"bindTo": "Resources.Strings.RegionsSalesAreasCaption"},
"items": []
}
},
{
"operation": "insert",
"name": "ITRegionInOrgStructureDetail",
"values": {
"itemType": 2,
"markerValue": "added-detail"

},
"parentName": "ITRegionsSalesAreas",
"propertyName": "items",
"index": 0

},
{
"operation": "insert",
"parentName": "Header",
"propertyName": "items",
"name": "ITShowDetails",
"values": {
"layout": {"column": 0, "row": 2, "colSpan": 12}
}

},
{
"operation": "insert",
"parentName": "Header",
"propertyName": "items",
"name": "SysAdminUnitTypeValue",
"values": {
"layout": {"column": 12, "row": 2, "colSpan": 12}
}

}
]/**SCHEMA_DIFF*/

};

});

Скрывает вкладки и добавляет, но при сохранении выдает ошибку в консоль:
less-parser.js:4151 [Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
xhr @ less-parser.js:4151
loadStyleSheet @ less-parser.js:4043
loadStyleSheets @ less-parser.js:3935
less.refresh @ less-parser.js:3894
(anonymous) @ less-parser.js:3910
(anonymous) @ less-parser.js:4305
less-parser.js:4199 less: parsed http://localhost:82/core/83ba267f0b2f5663dc71a6f8341355dd/combined/all-c... successfully.
less-parser.js:4199 less: css for http://localhost:82/core/83ba267f0b2f5663dc71a6f8341355dd/combined/all-c... generated in 71ms
less-parser.js:4199 less: css generated in 71ms
4all-combined.js:578 Колонка Id не объявлена в ViewModel элемента меню
log @ all-combined.js:578
getMenuItemConfig @ all-combined.js:1519
onAddItem @ all-combined.js:1518
(anonymous) @ all-combined.js:1518
each @ all-combined.js:1
each @ all-combined.js:680
onCollectionDataLoaded @ all-combined.js:1518
setControlPropertyValue @ all-combined.js:526
setControlInitialValue @ all-combined.js:525
(anonymous) @ all-combined.js:522
Terrasoft.utils.array.each @ all-combined.js:231
bind @ all-combined.js:522
bind @ all-combined.js:1105
callParent @ all-combined.js:1
bind @ all-combined.js:1516
bindMenu @ all-combined.js:1526
bind @ all-combined.js:1549
(anonymous) @ all-combined.js:1127
each @ all-combined.js:1
bindItems @ all-combined.js:1127
bind @ all-combined.js:1127
generate @ ConfigurationBootstrap.js:5596
render @ ConfigurationBootstrap.js:5558
safeExecute @ core.js:758
renderModule @ core.js:92
renderChainModule @ core.js:138
processModule @ core.js:145
(anonymous) @ core.js:237
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457
4all-combined.js:578 Колонка Id не объявлена в ViewModel элемента меню
log @ all-combined.js:578
getMenuItemConfig @ all-combined.js:1519
onAddItem @ all-combined.js:1518
(anonymous) @ all-combined.js:1518
each @ all-combined.js:1
each @ all-combined.js:680
onCollectionDataLoaded @ all-combined.js:1518
fire @ all-combined.js:1
continueFireEvent @ all-combined.js:1
fireEventArgs @ all-combined.js:1
fireEvent @ all-combined.js:1
loadAll @ all-combined.js:681
(anonymous) @ ConfigurationBootstrap.js:5008
parseResponse @ all-combined.js:966
callParent @ all-combined.js:1
parseResponse @ all-combined.js:983
(anonymous) @ all-combined.js:966
callback @ all-combined.js:954
a.callback @ all-combined.js:941
callback @ all-combined.js:1
onComplete @ all-combined.js:1
onStateChange @ all-combined.js:1
(anonymous) @ all-combined.js:1
all-combined.js:578 Колонка Id не объявлена в ViewModel элемента меню
log @ all-combined.js:578
getMenuItemConfig @ all-combined.js:1519
onAddItem @ all-combined.js:1518
fire @ all-combined.js:1
continueFireEvent @ all-combined.js:1
fireEventArgs @ all-combined.js:1
fireEvent @ all-combined.js:1
onCollectionAdd @ all-combined.js:677
callParent @ all-combined.js:1
onCollectionAdd @ all-combined.js:684
callParent @ all-combined.js:1
onCollectionAdd @ all-combined.js:713
fire @ all-combined.js:1
continueFireEvent @ all-combined.js:1
fireEventArgs @ all-combined.js:1
fireEvent @ all-combined.js:1
doInsert @ all-combined.js:1
insert @ all-combined.js:1
add @ all-combined.js:1
add @ all-combined.js:679
addItem @ all-combined.js:685
loadProfileButtonMenu @ MainHeaderSchema.js:220
onRender @ MainHeaderSchema.js:177
render @ ConfigurationBootstrap.js:22365
callParent @ all-combined.js:1
render @ ConfigurationBootstrap.js:23464
safeExecute @ core.js:758
renderModule @ core.js:92
renderChainModule @ core.js:138
(anonymous) @ ConfigurationBootstrap.js:22294
callback @ all-combined.js:1
(anonymous) @ MainHeaderSchema.js:168
(anonymous) @ ConfigurationBootstrap.js:17229
f @ all-combined.js:470
(anonymous) @ ConfigurationBootstrap.js:17784
querySysSettingsItem @ all-combined.js:948
initGoogleTagManager @ ConfigurationBootstrap.js:17782
f @ all-combined.js:470
(anonymous) @ ConfigurationBootstrap.js:17264
(anonymous) @ ConfigurationBootstrap.js:17274
(anonymous) @ all-combined.js:477
execCb @ require.js:1693
check @ require.js:881
(anonymous) @ require.js:1136
(anonymous) @ require.js:134
(anonymous) @ require.js:1186
each @ require.js:59
emit @ require.js:1185
check @ require.js:936
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1011
(anonymous) @ require.js:134
requestObject.onreadystatechange @ profile.js:39
all-combined.js:578 Колонка Id не объявлена в ViewModel элемента меню
log @ all-combined.js:578
getMenuItemConfig @ all-combined.js:1519
onAddItem @ all-combined.js:1518
fire @ all-combined.js:1
continueFireEvent @ all-combined.js:1
fireEventArgs @ all-combined.js:1
fireEvent @ all-combined.js:1
onCollectionAdd @ all-combined.js:677
callParent @ all-combined.js:1
onCollectionAdd @ all-combined.js:684
callParent @ all-combined.js:1
onCollectionAdd @ all-combined.js:713
fire @ all-combined.js:1
continueFireEvent @ all-combined.js:1
fireEventArgs @ all-combined.js:1
fireEvent @ all-combined.js:1
doInsert @ all-combined.js:1
insert @ all-combined.js:1
add @ all-combined.js:1
add @ all-combined.js:679
addItem @ all-combined.js:685
loadProfileButtonMenu @ MainHeaderSchema.js:233
onRender @ MainHeaderSchema.js:177
render @ ConfigurationBootstrap.js:22365
callParent @ all-combined.js:1
render @ ConfigurationBootstrap.js:23464
safeExecute @ core.js:758
renderModule @ core.js:92
renderChainModule @ core.js:138
(anonymous) @ ConfigurationBootstrap.js:22294
callback @ all-combined.js:1
(anonymous) @ MainHeaderSchema.js:168
(anonymous) @ ConfigurationBootstrap.js:17229
f @ all-combined.js:470
(anonymous) @ ConfigurationBootstrap.js:17784
querySysSettingsItem @ all-combined.js:948
initGoogleTagManager @ ConfigurationBootstrap.js:17782
f @ all-combined.js:470
(anonymous) @ ConfigurationBootstrap.js:17264
(anonymous) @ ConfigurationBootstrap.js:17274
(anonymous) @ all-combined.js:477
execCb @ require.js:1693
check @ require.js:881
(anonymous) @ require.js:1136
(anonymous) @ require.js:134
(anonymous) @ require.js:1186
each @ require.js:59
emit @ require.js:1185
check @ require.js:936
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1011
(anonymous) @ require.js:134
requestObject.onreadystatechange @ profile.js:39
all-combined.js:578 Колонка Id не объявлена в ViewModel элемента меню
log @ all-combined.js:578
getMenuItemConfig @ all-combined.js:1519
onAddItem @ all-combined.js:1518
fire @ all-combined.js:1
continueFireEvent @ all-combined.js:1
fireEventArgs @ all-combined.js:1
fireEvent @ all-combined.js:1
onCollectionAdd @ all-combined.js:677
callParent @ all-combined.js:1
onCollectionAdd @ all-combined.js:684
callParent @ all-combined.js:1
onCollectionAdd @ all-combined.js:713
fire @ all-combined.js:1
continueFireEvent @ all-combined.js:1
fireEventArgs @ all-combined.js:1
fireEvent @ all-combined.js:1
doInsert @ all-combined.js:1
insert @ all-combined.js:1
add @ all-combined.js:1
add @ all-combined.js:679
addItem @ all-combined.js:685
loadProfileButtonMenu @ MainHeaderSchema.js:239
onRender @ MainHeaderSchema.js:177
render @ ConfigurationBootstrap.js:22365
callParent @ all-combined.js:1
render @ ConfigurationBootstrap.js:23464
safeExecute @ core.js:758
renderModule @ core.js:92
renderChainModule @ core.js:138
(anonymous) @ ConfigurationBootstrap.js:22294
callback @ all-combined.js:1
(anonymous) @ MainHeaderSchema.js:168
(anonymous) @ ConfigurationBootstrap.js:17229
f @ all-combined.js:470
(anonymous) @ ConfigurationBootstrap.js:17784
querySysSettingsItem @ all-combined.js:948
initGoogleTagManager @ ConfigurationBootstrap.js:17782
f @ all-combined.js:470
(anonymous) @ ConfigurationBootstrap.js:17264
(anonymous) @ ConfigurationBootstrap.js:17274
(anonymous) @ all-combined.js:477
execCb @ require.js:1693
check @ require.js:881
(anonymous) @ require.js:1136
(anonymous) @ require.js:134
(anonymous) @ require.js:1186
each @ require.js:59
emit @ require.js:1185
check @ require.js:936
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1011
(anonymous) @ require.js:134
requestObject.onreadystatechange @ profile.js:39
core.js:579 Элемент SectionSummaryContainer не найден
writeErrorMessage @ core.js:579
injectedSandbox.loadModule @ core.js:513
loadSummaryModule @ SectionBundleModule.js:69086
loadSummary @ SectionBundleModule.js:69081
onRender @ SectionBundleModule.js:68813
callParent @ all-combined.js:1
onRender @ SysAdminUnitSectionV2.js:748
render @ ConfigurationBootstrap.js:22365
safeExecute @ core.js:758
renderModule @ core.js:92
renderChainModule @ core.js:138
(anonymous) @ ConfigurationBootstrap.js:22294
(anonymous) @ SectionBundleModule.js:68894
f @ all-combined.js:470
(anonymous) @ SectionBundleModule.js:68889
f @ all-combined.js:470
callback @ all-combined.js:1
(anonymous) @ SectionBundleModule.js:71423
(anonymous) @ all-combined.js:477
execCb @ require.js:1693
check @ require.js:881
(anonymous) @ require.js:1136
(anonymous) @ require.js:134
(anonymous) @ require.js:1186
each @ require.js:59
emit @ require.js:1185
check @ require.js:936
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1011
(anonymous) @ require.js:134
requestObject.onreadystatechange @ profile.js:39
all-combined.js:578 Object {connectionConfig: "{"debugMode":false,"disableCallCentre":false,"isAu…se,"useNotificationSound":false,"useVideo":false}", msgServerAddress: "", assemblyName: "", success: true}
all-combined.js:1 Uncaught TypeError: Cannot read property 'apply' of undefined
at i.callParent (all-combined.js:1)
at i.showRegionsSalesAreas (SysAdminUnitPageV2.js:739)
at i.onEntityInitialized (SysAdminUnitPageV2.js:721)
at i. (SectionBundleModule.js:25284)
at f (all-combined.js:470)
at i. (SectionBundleModule.js:25269)
at i. (all-combined.js:1013)
at i.parseGetEntityResponse (all-combined.js:980)
at i. (all-combined.js:981)
at i.callback (all-combined.js:954)
callParent @ all-combined.js:1
showRegionsSalesAreas @ SysAdminUnitPageV2.js:739
onEntityInitialized @ SysAdminUnitPageV2.js:721
(anonymous) @ SectionBundleModule.js:25284
f @ all-combined.js:470
(anonymous) @ SectionBundleModule.js:25269
(anonymous) @ all-combined.js:1013
parseGetEntityResponse @ all-combined.js:980
(anonymous) @ all-combined.js:981
callback @ all-combined.js:954
a.callback @ all-combined.js:941
callback @ all-combined.js:1
onComplete @ all-combined.js:1
onStateChange @ all-combined.js:1
(anonymous) @ all-combined.js:1
core.js:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
file: http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-c...
line: 1
column: 44656
message: Uncaught TypeError: Cannot read property 'apply' of undefined
date: Thu Jun 08 2017 11:52:09 GMT+0300 (RTZ 2 (зима))
stack: TypeError: Cannot read property 'apply' of undefined
at i.callParent (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-c...)
at i.showRegionsSalesAreas (http://localhost:82/0/configuration/b1e2814cad734eab60c931de3bb88cc7ru-R...)
at i.onEntityInitialized (http://localhost:82/0/configuration/b1e2814cad734eab60c931de3bb88cc7ru-R...)
at i. (http://localhost:82/0/configuration/db72f11f26ed19bd975b81f534ca9ee9/Sec...)
at f (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-c...)
at i. (http://localhost:82/0/configuration/db72f11f26ed19bd975b81f534ca9ee9/Sec...)
at i. (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-c...)
at i.parseGetEntityResponse (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-c...)
at i. (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-c...)
at i.callback (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-c...)

Нравится

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

А если

entitySchemaName: "SysAdminUnit",

убрать, будет работать?

нет, потому что лог поле в схеме объекта SysAdminUnit

Тогда беда. Насколько я помню конфигурация вообще напрямую не работает с SysAdminUnit. Даже UserPageV2 работает через вьюху. Просто так сохранить в SysAdminUnit думаю не получится.

Upd. Ну да, this.entitySchemaName="VwSysAdminUnit" по-умолчанию. В SysAdminUnitRoleBasePageV2 есть метод saveEntity, который черпает столбцы для сохранения из вьюхи и отправляет их в сервис:

var config = {
	serviceName: "AdministrationService",
	methodName: "SaveRole",
	data: dataSend
};

Как минимум надо удалять entitySchemaName="SysAdminUnit" из вашей схемы, добавлять столбец во вью, альтерить sql-командой и уже дальше смотреть, работает или нет

Спасибо, подумаю над этим.

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

Доброй день!
Может кто подскажет.
Как увеличить количество выводимых значений в поле lookup data control в карточке клиента?
Сейчас их 40.

Нравится

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

Это значение в 40 записей реестра задаётся для всей системы.
Как его менять, см. тут.

Спасибо, попробовал, значение ставиться для всех типов полей, кроме lookup data control с выставленной галочкой "выпадающий список". Вот его мне и нужно изменить. Где эта галочка и стоит.

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

Спасибо.

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

Добрый день.
На сервис sq_OpportunityLog добавил доп условия в WHERE (чтоб деталь логирования показывала не все записи) принудительные галки на условие поставил, чтоб всегда были включены. Но программа игнорирует мои доп условия и использует условия, те что заложенны в типовом варианте.
Не понятно, почему не работает. По трейсу в Провайлере запрос идет в туже таблицу tbl_OpportunityLog

Нравится

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

Сервис «sq_Opportunity» относится к основной таблице раздела «tbl_Opportunity», а не к таблице «tbl_OpportunityLog».

Это я описался, я поправил именно сервис sq_OpportunityLog

Будьте внимательнее.:wink:

поправил то я ошибку в описании (на форуме) а в программе у меня правильно был доработан sq_OpportunityLog. но не работает
Вопрос остаеться открытым(((

Алексей, а как именно он был «правильно доработан». Может, дело в этом?

Добавил параметры и уcловия к запросу, вот так он выглядит если смотреть на просмотр (в конфигураторе). :

SELECT
[tbl_OpportunityLog].[ID] AS [ID],
[tbl_OpportunityLog].[RecordID] AS [RecordID],
[tbl_OpportunityLog].[ActionID] AS [ActionID],
[tbl_OpportunityLog].[CreatedOn] AS [CreatedOn],
[tbl_OpportunityLog].[CreatedByID] AS [CreatedByID],
[CreatedBy].[Name] AS [CreatedByName],
[tbl_OpportunityLog].[CustomerName] AS [CustomerName],
[tbl_OpportunityLog].[CustomerID] AS [CustomerID],
[tbl_OpportunityLog].[ChannelName] AS [ChannelName],
[tbl_OpportunityLog].[ChannelID] AS [ChannelID],
[tbl_OpportunityLog].[StageStage] AS [StageStage],
[tbl_OpportunityLog].[StageID] AS [StageID],
[tbl_OpportunityLog].[TypeOpportunityType] AS [TypeOpportunityType],
[tbl_OpportunityLog].[TypeID] AS [TypeID],
[tbl_OpportunityLog].[OwnerName] AS [OwnerName],
[tbl_OpportunityLog].[OwnerID] AS [OwnerID],
[tbl_OpportunityLog].[ContactName] AS [ContactName],
[tbl_OpportunityLog].[ContactID] AS [ContactID],
[tbl_OpportunityLog].[Revenue] AS [Revenue],
[tbl_OpportunityLog].[EstimatedRevenue] AS [EstimatedRevenue],
[tbl_OpportunityLog].[EstimatedStartDate] AS [EstimatedStartDate],
[tbl_OpportunityLog].[EstimatedCloseDate] AS [EstimatedCloseDate],
[tbl_OpportunityLog].[DateConfirm] AS [DateConfirm],
[tbl_OpportunityLog].[AlliasName] AS [AlliasName],
[tbl_OpportunityLog].[AlliasID] AS [AlliasID],
[tbl_OpportunityLog].[IsTender] AS [IsTender],
[tbl_OpportunityLog].[EstimatedRevenueTo] AS [EstimatedRevenueTo],
[tbl_OpportunityLog].[AlliasSHName] AS [AlliasSHName],
[tbl_OpportunityLog].[AlliasSHID] AS [AlliasSHID]
FROM
[dbo].[tbl_OpportunityLog] AS [tbl_OpportunityLog]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [CreatedBy] ON [CreatedBy].[ID] = [tbl_OpportunityLog].[CreatedByID]
WHERE([tbl_OpportunityLog].[RecordID] = :RecordID AND
(EXISTS
(SELECT
[tbl_ContactDepartment].[ID] AS [ID]
FROM
[dbo].[tbl_ContactDepartment] AS [tbl_ContactDepartment]
WHERE([tbl_ContactDepartment].[ContactID] = '{251FB9AC-C17E-4DF7-A0CB-D591FDB97462}' AND
[tbl_ContactDepartment].[DepartmentID] =
(SELECT TOP 1
[tbl_Opportunity].[ChannelID] AS [ChannelID]
FROM
[dbo].[tbl_Opportunity] AS [tbl_Opportunity]
WHERE([tbl_Opportunity].[ID] = :RecordID)))) OR
'{EAB3D8EC-5400-4A26-8634-ACA9203EEB8E}' IN
(SELECT
[tbl_AdminUnit].[ID] AS [ID]
FROM
[dbo].[tbl_AdminUnit] AS [tbl_AdminUnit]
WHERE([tbl_AdminUnit].[UserIsAdmin] = :Is AND
[tbl_AdminUnit].[UserIsEnabled] = :Is))))

ORDER BY
4 DESC

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

А с правами доступа всё в порядке?

Да вроде норм, что под админом что просто под пользователем трейс ведет себя одинаково странно: при первом переходе на вкладку детали журнал изменения:
1) отрабатывает мой запрос (который я поправил),
2) а следом идет старый запрос:
exec sp_executesql N'SELECT TOP 40
[tbl_OpportunityLog].[ID] AS [ID],
[tbl_OpportunityLog].[RecordID] AS [RecordID],
[tbl_OpportunityLog].[ActionID] AS [ActionID],
[tbl_OpportunityLog].[CreatedOn] AS [CreatedOn],
[CreatedBy].[Name] AS [CreatedByName],
[tbl_OpportunityLog].[CustomerName] AS [CustomerName],
[tbl_OpportunityLog].[ChannelName] AS [ChannelName],
[tbl_OpportunityLog].[StageStage] AS [StageStage],
[tbl_OpportunityLog].[TypeOpportunityType] AS [TypeOpportunityType],
[tbl_OpportunityLog].[OwnerName] AS [OwnerName],
[tbl_OpportunityLog].[ContactName] AS [ContactName],
[tbl_OpportunityLog].[Revenue] AS [Revenue],
[tbl_OpportunityLog].[EstimatedRevenue] AS [EstimatedRevenue],
[tbl_OpportunityLog].[EstimatedStartDate] AS [EstimatedStartDate],
[tbl_OpportunityLog].[EstimatedCloseDate] AS [EstimatedCloseDate],
[tbl_OpportunityLog].[DateConfirm] AS [DateConfirm],
[tbl_OpportunityLog].[AlliasName] AS [AlliasName],
[tbl_OpportunityLog].[IsTender] AS [IsTender],
[tbl_OpportunityLog].[EstimatedRevenueTo] AS [EstimatedRevenueTo],
[tbl_OpportunityLog].[AlliasSHName] AS [AlliasSHName]
FROM
[dbo].[tbl_OpportunityLog] AS [tbl_OpportunityLog]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [CreatedBy] ON [CreatedBy].[ID] = [tbl_OpportunityLog].[CreatedByID]
WHERE([tbl_OpportunityLog].[RecordID] = @P1)
ORDER BY
4 DESC',N'@P1 varchar(8000)','{073780C3-F023-4CC9-B3A6-00036BFA6A30}'

, и если перейти к следующей записи, то уже только 2-ой запрос работает.

Функция RefreshChangesLogDetail в scr_BaseWorkspace вызывает RefreshDetailData из scr_DB, а та запускает функцию RefreshDetailDataByParentID.

RefreshDetailDataByParentID(ParentFieldValue, ChildDataset, ChildFilterName, false);

А в ней происходит отключение всех фильтров при помощи:

EnableDatasetFilters(ChildDataset, false);

Чтобы фильтры не отключались, нужно вызывать эту функцию RefreshDetailDataByParentID с последним параметром DoNotDisableAllFilters, равным true.

Вы можете внести доработку, чтобы эта функция запускалась со включенными фильтрами конкретно для нужной детали или для всех, в зависимости от потребностей. Понять внутри функции, что за деталь, можно по ChildDataset.SelectQuery.Caption равному "sq_OpportunityLog".
Получится вроде:

RefreshDetailDataByParentID(ParentFieldValue, ChildDataset, ChildFilterName, (ChildDataset.SelectQuery.Caption == 'sq_OpportunityLog'));

Спасибо, теперь все получилось.

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