При работе и выполнении команд WorkspaceConsole.

Возникает ошибка.

Error: Object reference not set to an instance of an object.

Как ее решить?

Нравится

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

Необходимо проверить настройки подключения в файле Terrasoft.Tools.WorkspaceConsole.exe.config, который находится в той же директории WorkspaceConsole.

•В секции <connectionStrings> укажите параметры подключения, которые используются в файле конфигурации ConnectionStrings.config;

•В секции <db> укажите значение параметра connectionStringName="db".

Если рекомендации не помогут, нужен будет лог запуска консоли, сохраняется в папку WorkspaceConsole\Log 

Мотков Илья,

Аналогичная проблема при запуске команды "Build Workspace" при ведении разработки в файловой системе. 

Лог в папке WorkspaceConsole\Log не создается.

 

Аналогично, проверьте настройки. Без дополнительной информации Вам никто причину не определит.

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

Каким образом настраиваться профайл вертикального реестра?

Создал новый раздел, а DataGridVerticalProfile туда не прогружается, понятно что его надо настроить, но где и как?

Вот этот:

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

 

Нравится

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

На странице нужно выбрать "Вид" -> "Настройка списка"

 

Боже, год  разрабатываешь на платформе и о такой мелочи я и не знал. Спасибо!

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

Коллеги, здравствуйте! 

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

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

С чем это может быть связано?

Спасибо!

Нравится

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

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

Добрый день!



Скорее всего это связано с тем что у команды нету прав на чтение связанных записей. Команда без выдачи прав на работу с контрагентом может видеть эти записи? 

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

Роман Никулин,

Добрый день!



Вы проверяли права команды на эти записи? Если у них не будет прав на эти записи, то команда не увидит записи несмотря на права на контрагента. Для раздачи прав на старые связанные записи можно создать бизнес с элементом «изменить права доступа». А фильтрации можно указать например поле контрагент заполнено.

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

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

Всем привет в документации есть пример с добавление нового контакта по средствам веб запроса. Сделал все работает. Щас пытаюсь записать лид, но получаю:"Удаленный сервер возвратил ошибку: (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,

Спасибо

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

Как использовать, когда схема страниц и элементов на ней с разных объектов?

И

В коде можно? 

                save: function () {

                    try {

                        this.entitySchemaName = "SxCandidate";

                         this.callParent(arguments);

                        }

                    }

                    catch (e) { }

                    finally {

                        ***

                    }

                }

 

Нравится

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

Добрый день

Не очень понятно что вы делаете

Артем Гура,

привет,

ковыряю чужой код самописной страницы, притом с другой страницы раздела нужно перенести кейсы на самописную, при условии что entitySchemaName у них разный, тк это все писали разные люди, несколько тысяч строк кода, притом с кейсами никогда не работал, а они перенеслись на самописную страницу только заменой значения в entitySchemaName. То есть они лежат в исключительно бд, хотя оно все в бд :) притом разработка разных разработчиков в разных пакетах, дикое наследование - веселуха. 

Хочу понять/выработать какой-то подход для объединения функционала страниц с разных разделов, т. е. разные entitySchemaName. Псевдокод saveAll: function() {

this.entitySchemaName = 'aa';

this.save();

this.entitySchemaName = 'bb';

this.save();

}

или как что-то подобное для схожий целей делать, чтобы не лопатить весь код...

Чисто гипотетически так будет работать :) 

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

Артем Гура,

У меня сомнения, все из-за атрибутов и не только их наверно, думал если соответствующим атрибутам прописать 

referenceSchemaName 

тогда будут сопоставляться правильно, но пока не получилось

_____________________________________________________________

Почему-то нельзя создать раздел на произвольном объекте, только в ручную, видимо когда растишь его по полям, платформа что-то себе дописывает куда-то там. (в гуидах ковыряться дело гиблое) Хотя это вполне можно вынести в обработку и применять ко всем полям и не важно вообще какой объект. Повторное использование кода нарушено, ну то ладно. Может когда-нибудь можно будет придумают как модули описывать от нескольких схем с разными наборами атрибутов и тп Некоторая аналогия с делегатами в дотнете: не сразу стали множественными.

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

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

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

Станислав

Нравится

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

Добрый вечер!

В схеме ContactCareerPageInAccount есть цепочка методов:

1) save - всё идёт от сохранения

2) getContactCareerCollection - выборка из детали

3) onGetSelectResult - дальнейшая обработка с вопросом пользователю

4) getSelectedButton - обработка ответа пользователя

5) onAnswerNo - здесь Current ставится в false

Сергей, подскажите, пожалуйста, немного детальнее.

Если я правильно понял - мне нужно:

1. Создать "Замещающий клиентский модуль".

2. В качестве родительского объекта выбрать "Страница редактирования карьеры контакта в контрагенте".

3. Скопировать весь код из "ContactCareerPageInAccount"

4. Изменить функцию "onAnswerNo", чтобы значение "Current" не менялось.

5. Сохранить все

После проделывания этой операции ничего не меняется. Пробовал варианты:

а) удалял строчку update.setParameterValue('Current', true);

б) менял строчку update.setParameterValue('Current', false); на update.setParameterValue('Current', true);

в) удалял полностью функцию "onAnswerNo"

г) в функции "getSelectedButton" вместо вызова функции "onAnswerNo" вызывал "onAnswerYes"

Реакции ноль. Подскажите, пожалуйста, что я делаю не так.

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

Копировать весь код из схемы ContactCareerPageInAccount не надо, достаточно поместить методы, которые будут замещены. В каком пакете у вас замещающая схема и какие там связи с другими пакетами? Ощущение, что система не видит эту схему. Ну и чистить кэш после любых изменений с клиентскими модулями.

Замещающая схема находится в пакете Custom, он, на сколько я понимаю, связан со всеми другими пакетами.

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

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

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

Всем привет помогите с условием перехода в бизнес процессе.

В общем задача - изменить права на лид если, с ним никто не работал.

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

 

Пока получается так, но чет не работает:

[#Перечитываем лид.Первый элемент результирующей коллекции.Дата последнего взаимодействия#]==null

 

Нравится

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

А у Вас там есть такое поле? А когда оно заполняется? Это переименованное стандартное поле "Дата изменения" или Ваше пользовательское поле?

[#Перечитываем лид.Первый элемент результирующей коллекции.Дата изменения#] == null

 

Тоже не работает(((

Оно и не будет равно NULL, так как в это поле сразу же присваивается дата создания, а если кто-то с лидом работал, то эта дата будет отлична от даты создания. Я не совсем понимаю что именно Вам нужно, но из того, что я понял, я бы сравнил две этих даты. "Дата создания" и "Дата изменения". Если они отличаются, значит с лидом хоть какая-то работа проводилась, а если идентичны, то к нему никто не прикасался.

Но это такое себе решение. Может есть смысл прочитать есть ли завершенные активности по этому лиду?

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

Последовский Роман,

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

Спасибо за помощь)

Привязался к первому звонку

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

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

 В ActionDashBoard есть поле - http://prntscr.com/j49u8q

Реализовано оно следующим способом - http://prntscr.com/j49v2d, задал на данный атрибут фильтрацию, но она не срабатывает. Подскажите как реализовать фильтрацию данного атрибута?

пробовал через правила так же не работает.

Что делаю не так?

 

Заранее спасибо.

Нравится

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

var countryId = this.get("Country") - Вы здесь получаете не айдишник, а объект. попробуйте в самом фильтре дописать - countryId.value

Alex Zaslavsky,

Данный атрибут у меня текст я заполняю его следующим образом:

"Country": {

                        "dataValueType": Terrasoft.DataValueType.TEXT,

                        "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

                        "value": ""

                    }

getCurrentContactCountry: function () {

                        var currentContactId = Terrasoft.SysValue.CURRENT_USER_CONTACT.value;

                        var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                            rootSchemaName: "Contact"

                        });

                        esq.addColumn("Country", "CountryId");

                        esq.getEntity(currentContactId, function(result) {

                            if (!result.success) {

                                this.showInformationDialog(Resources.localizableStrings.AbCurrentUserCountryError);

                                return;

                            }

                            var country = result.entity.get("CountryId");

                            if(country!== null || country!== undefined) {

                                this.set("Country", country.value);

                            }

                        },this)

                    }

У меня проблема в другом в функцию фильтрации даже и не заходит

Я не силен в этом, но попробуйте вместо - 

"filters": [

function()

написать - 

filter: function()

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

Alex Zaslavsky,​​​​​​

Благодарю. Подскажите, а UsrSourcePartner определен у Вас в лиде? Мой атрибут не определен в моем объекте. Я ссылаюсь на другой объект. Данное поле грубо говоря у меня одноразовое, достал id и передал на сервис. Может не срабатывать фильтрация если нет связи основного объекта с атрибутом?

Нигрескул Алексей,

Да, это определенное поле "Партнер" (справочник Контрагенты).

По второму вопросу не подскажу, не сталкивался.

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

Нигрескул Алексей пишет:

Коллеги нужна помощь, не работает фильтрация в атрибутах

Спрашивали - помогаю.

TLDR: террасофт факапнулся. В очередной раз. Убирите ContentType.ENUM. 

Теперь подробно (тестил на CallMessagePublisherPage. У вас я так понимаю аналог, ну да не важно):

1. Сделал фильтр, запустил, контакты отфильтровались

2. Раскомментировал contentType. ВНЕЗАПНО сортировка перестала работать.

3. Нет. Тот факт, что колонка виртуальная никак не влияет. тестил.



В итоге: я бы посоветовал посмотреть что творится в функции loadLookupData или др. функции которую, возможно, запускает enum. Честно говоря, устал воевать с ветряными мельницами. Сначала редактируемый реестр испоганили, теперь вот это...

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

Благодарю! Проверим.

Нигрескул Алексей пишет:

Благодарю! Проверим.

Я тут вспомнил, что уже сталкивался с таким поведением) BaseMessagePublisherPage не наследуется от BasePageV2, и из BasePageV2 не вызывается getLookupQuery. Чтобы исправить поведение ENUM-ов придётся ручками перекопировать функцию (и все вложеные в неё) на вашу страницу.

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

Благодарю! Все получилось! Так же сделал при добавлении нового элемента в маркетинговой кампании  - 

http://prntscr.com/j5wl4q

Работает - УРА!))

 

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

Есть lookup как повесить на его onchage функцию???

 

Нравится

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

"UsrField1": {

                dependencies: [

                    {

                        columns: ["UsrField2"],

                        methodName: "someMethodName"

                    }

                ]

            }

Вы об этом? Если в поле "UsrField2" Вы что-то изменили, то запускается Ваш метод "someMethodName". 

Вот статья на академии: https://academy.terrasoft.ua/documents/technic-sdk/7-12/atributy-svoystvo-attributes

Там нужно посмотреть раздел "Дополнительные свойства атрибутов", свойство dependencies

Золотарев Артем Андреевич,

Спасибо, получилось!

 

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

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

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

Стоит задача: предотвратить возможность пользователей копировать значения из полей детали "Средства связи" на странице Контакта. Кто-то занимался когда-нибудь подобной задачей?

Нравится

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

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

Заблокировать копирование средствами bpm'online вряд ли получиться. но вы можете использовать стандартные средства JavaScript, например:

  • событие oncopy разрешает выделение текста, но полностью зарпещает копирование (сам пробовал, не нашел способа реально скопировать текст, как по мне - один из самых простых и достаточно надежных способов). Единственный недостаток - на некоторых  браузерах может работать не так, как ожидается (в Edge, Chrome, Mozilla, Opera работает точно хорошо).
  • отмена события ​onmousedown​ (для IE - onselectstart) - можно поставить return false для этих событий, что запртетит выделение. Проблема с этим событием в том, что если начать выделение за пределами контейнера, для которого отменены эти событие, текст все-таки выделится.
  • CSS свойство xxx-user-select, где xxx - префиксы браузеров (например, -webkit-, -moz-, -ms-) запрещает выделение, но оно так и не было внесено в стандарты, хотя и поддерживается большинством браузеров (кроме IE9-)

Можете попробовать один из способов или их комбинации.

Золотарев Артем Андреевич,

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

Подскажите, пожалуйста, по коду:

define("ContactCommunicationDetail", ["terrasoft"],
	function(Terrasoft) {
		return {
			entitySchemaName: "ContactCommunication",
			methods: {
				init: function() {
					this.callParent(arguments);
					document.body.oncopy = function() { return false; };
				}
			},
			diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
		};
	});

Как видите, я вставил его на деталь, но копирование теперь не работает на всей странице контакта + на всех последующих страницах. Как мне сделать так, чтоб копирование не работало конкретно в полях детали?

В любом случае пользователь сможет нажать в браузере F12 и скопировать всё нужное из HTML-кода страницы.

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

Разве что заставить пользователей работать с системой в браузере на изолированном компьютере по  RDP без общего буфера обмена и расшаренных папок.

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