Вопрос

Коллеги, не нашла описания, подскажите или ссылкой.

Версия 7.15, sale. В карточке создала поле Дата. Где поставить признак, чтобы по умолчанию - отображать текущую дату. Т.е. карточка открывается для создания новой записи - и дата текущая уже проставлена.

Спасибо.

У меня такой же вопрос

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

Открыть объект через конфигурацию. Выбрать в дереве элементов (слева) свою колонку. В свойствах колонки (справа) выбрать "Значение по умолчанию" -> "Установить из системной переменной" - > "Текущее значение даты". После чего опубликовать объект.

Открыть объект через конфигурацию. Выбрать в дереве элементов (слева) свою колонку. В свойствах колонки (справа) выбрать "Значение по умолчанию" -> "Установить из системной переменной" - > "Текущее значение даты". После чего опубликовать объект.

Добрый день.

Установить значение по умолчанию можно в сервисе таблицы в конфигурации системы таким образом:

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

Коллеги, огромное спасибо. Не ожидала, что Аналитик теперь и в конфигурации работает :)))

Милова Марина,

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

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

Добрый день!

Не могу понять почему в результате выполнения команды 

EntitySchema schema = _userConnection.EntitySchemaManager.FindInstanceByName("Account");

в результате schema == null

Подскажите, пожалуйста, в каких случаях может такое происходить.

У меня такой же вопрос

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

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

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

Добрый день!

Необходимо выделить лиды которые не были открыты пользователем. 

Есть следующий код:

define("LeadSectionV2", [], function() {
	return {
		entitySchemaName: "Lead",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			prepareResponseCollectionItem: function(item) {
				this.callParent(arguments);
				var scope = this;
				var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
					rootSchemaName: "UsrLeadStatusByUser"
				});
				esq.addColumn("Id");
				var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrLead", item.get("Id"));
				var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrContact", Terrasoft.SysValue.CURRENT_USER_CONTACT.value);
				esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
				esq.filters.add("esqFirstFilter", esqFirstFilter);
				esq.filters.add("esqSecondFilter", esqSecondFilter);
				esq.getEntityCollection(function (result) {
					if (result.success && result.collection.collection.items.length > 0) {
						//Лид уже был просмотрен
						item.customStyle = null;
					}else{
						//Лид еще ни разу не открывали
						item.customStyle = {
							"color": "white",
							"background": "#8ecb60",
							"font-weight": "bold"
						};
					}
				}, scope);
			}
		}
	};
});

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

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

У меня такой же вопрос

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

В объектной модели Лида, добавьте например булево значения IsViewed, в момент открытия карточки, обновляйте это значение.
А подкрашивание грида, делайте уже от этого параметра IsVewed (true/false).

В объектной модели Лида, добавьте например булево значения IsViewed, в момент открытия карточки, обновляйте это значение.
А подкрашивание грида, делайте уже от этого параметра IsVewed (true/false).

Спасибо, Павел! Скорее всего так и поступлю. Хотел сделать по пользователям, но откажусь от этой затеи.

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

Руслан Хасанов пишет:
Теперь возникла другая проблема, после закрытия лида в реестре раздела у просмотренного лида не обновляется стиль. После перезагрузки страницы страницы - все в порядке. Как сделать чтобы это происходило автоматически?

Путем использования сообщений, вызовите в разделе метод this.refreshGridData();

Примерно так:
 

init: function() {
	this.callParent(arguments);
	this.sandbox.subscribe("NeedReloadLeadGrid", this.customMethod, this);
},
customMethod: function() {
	//если нужно что-то еще сделать, то делаете, а потом:
	this.refreshGridData();
}
 
messages: {
	"NeedReloadLeadGrid": {
		"mode": Terrasoft.MessageMode.PTP,
		"direction": Terrasoft.MessageDirectionType.SUBSCRIBE
	}
}
 
 
На карточке лида, по сохранению/закрытии/изменении параметра, в общем там, где вам нужно, вызываете публикацию данного сообщения.
 
messages: {
	"NeedReloadLeadGrid": {
		"mode": Terrasoft.MessageMode.PTP,
		"direction": Terrasoft.MessageDirectionType.PUBLISH
	}
}
 
callPublish_YourCustomMethod: function() {
	this.sandbox.publish("NeedReloadLeadGrid", null, ["_NeedReloadLeadGrid"]);
}
 
//вместо null можете передать объектом параметры, при необходимости

 

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

Добрый день

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

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

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

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

спасибо. 

У меня такой же вопрос

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

из примера 

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

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

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

curl_close($ch);
 

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

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

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

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

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

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

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

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

 

 

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

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

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

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

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

 

 

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

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

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

У меня такой же вопрос

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

Можно

В БП вы можете использовать элемент Сценарий для выполнения c# кода, а в сервисах напрямую подключать ваш код.

Можно

В БП вы можете использовать элемент Сценарий для выполнения c# кода, а в сервисах напрямую подключать ваш код.

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

Григорий Чех,

Тут вопрос в том, как организовать вызов кода, чтобы не копипастить его в каждом процессе или сервисе. То есть это можно было бы решить через внешнюю библиотеку, но она должна будет иметь ссылки на библиотеки Terrasoft, поэтому придется переделывать её, например, при обновлении подключенных библиотек до новой версии framework. Этого делать не хотелось бы. Может быть, есть более правильное решение

Если взаимодействовать не через C#-код, а чисто как с веб-сервисом, вызов по URL и получение ответа, то ссылки не потребуются.

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

Добрый день. Подскажите как можно отфильтровать справочник контактов по группе? Смысл в том что при выборе из справочника в списке должны быть сотрудники только определенной группы (у нас тебе группа "телефермеры")

У меня такой же вопрос

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

Александр Тыра,

1. Можно сделать эту группу не функциональной, а организационной ролью.

2. Можно попробовать написать свое представление и для фильтрации нужных контактов завязаться на это представление.

Доброе утро.

Ваша группа 'Телефермеры' - это группа администрирования или какая-то другая?

Телефермеры — это как телепузики?smiley

Если это группа администрировования, см. тут. Если группа контактов, то условие фильтра будет даже проще, только по полю FolderId в таблице ContactInFolder. 

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

"Организационные роли"

Александр Тыра,

Посмотрите решение по ссылке выше, которое привел Александр Зверев.

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

"Организационные роли" работают, а вот "Функциональные роли" нет

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

Спасибо, решение отличное, но только работают так только 

"Организационные роли", а вот "Функциональные роли" нет

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

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

я видел что и те и те, но только при фильтре "Функциональные роли" фильтруются, я так понял, не люди а группы, а люди входят в "Организационные роли", потому такой способ и не работает

Если есть доступ к базе, напишите SQL-запрос, обращающийся к Contact, SysAdminUnit, SysUserInRole и SysAdminUnitInRole и получающий нужную Вам выборку контактов, а затем адаптируйте его под синтаксис с квадратными скобками.

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

спасибо за совет, попробую

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

Select * from "Contact" INNER JOIN "SysAdminUnit" ON "Contact"."Id" = "SysAdminUnit"."ContactId"
where "SysAdminUnit"."Id" IN (Select "SysAdminUnitId" from "SysAdminUnitInRole" where "SysAdminUnitRoleId" = '{C7C2A8E0-C54A-485B-A7A7-6FE3590E769B}')

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

 

filterGroup.add("IsGroupAccess",
    Terrasoft.createColumnFilterWithParameter(
    Terrasoft.ComparisonType.EQUAL,
    "[SysAdminUnit:Contact].[SysAdminUnitInRole:SysAdminUnit].SysAdminUnitRole.Id",
    "{C7C2A8E0-C54A-485B-A7A7-6FE3590E769B}"));

так пробую - не работает

Александр Тыра,

1. Посмотрите sql-профайлером, какой запрос формируется в базу данных при вызове Ввшего кода.

2. Также посмотрите статьи по принципам построения путей к колонкам вот эту и эту.

 

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

тут как раз пишут что к таблице этой не добраться такими запросами

https://community.terrasoft.ua/questions/esq-sintaksis-zaprosa-pri-cepo…

Александр Тыра,

1. Можно сделать эту группу не функциональной, а организационной ролью.

2. Можно попробовать написать свое представление и для фильтрации нужных контактов завязаться на это представление.

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

Задача в том что бы скрыть группу полей. Осталось только вернуть значение true или false для функции visibleReasons но не как не доходит как, сделал но понимаю что так не работает это

isAutoActivity: function(callback, scope){
	var recordId = this.get("PrimaryColumnValue");
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "Activity"
	});
	esq.addColumn("KtIsAutoActivity", "KtIsAutoActivity");
	esq.getEntity(recordId, function(result) {
		this.set("IsAutoActivity", result.entity.get("KtIsAutoActivity"));
		if (callback) {
			callback.call(scope || this);
		}
	}, this);
},
visibleReasons: function() {
	Terrasoft.chain(
		function(next) {
			this.isAutoActivity(next, this);
		},
		function(){
			if (this.get("IsAutoActivity")) {
				return false;
			}
			return true;
		},
		this);
}

 

У меня такой же вопрос

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

А если просто при открытии карточки выполнить 

isAutoActivity и дальше забиндится на 
IsAutoActivity которое при открытии будет проиницилизировано!

А если просто при открытии карточки выполнить 

isAutoActivity и дальше забиндится на 
IsAutoActivity которое при открытии будет проиницилизировано!

Григорий Чех, 

Сработало с init, только теперь вопрос - есть ли смысл делать такую конструкцию?

init: function(callback, scope) {
	this.callParent([function() {
		this.Terrasoft.chain(
			function(next) {
				this.isAutoActivity(next, this);
			},
			function(){
				if (callback) {
					callback.call(scope || this);
				}
			},this);
	}, this]);
},
isAutoActivity: function(callback, scope){
	var recordId = this.get("PrimaryColumnValue");
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "Activity"
	});
	esq.addColumn("KtIsAutoActivity", "KtIsAutoActivity");
	esq.getEntity(recordId, function(result) {
		this.set("IsAutoActivity", result.entity.get("KtIsAutoActivity"));
		if (callback) {
			callback.call(scope || this);
		}
	}, this);
}

или достаточно сделать?

init: function(callback, scope) {
	this.callParent([function() {
		var recordId = this.get("PrimaryColumnValue");
		var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
			rootSchemaName: "Activity"
		});
		esq.addColumn("KtIsAutoActivity", "KtIsAutoActivity");
		esq.getEntity(recordId, function(result) {
			this.set("IsAutoActivity", result.entity.get("KtIsAutoActivity"));
			if (callback) {
				callback.call(scope || this);
			}
		}, this);
	}, this]);
}

 

Если оба варианта работают одинаково и при отладке в браузере  заходит внутрь функции нормально, можете использовать любой из способов.

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

При параллельном сохранении Entity.Save() с использованием параллельных потоков Parallel.ForEach получаю ошибку:

System.Data.SqlClient.SqlException: A trigger returned a resultset and/or was running with SET NOCOUNT OFF while another outstanding result set was active.

Как установить NOCOUNT ON для объекта Entity при сохранении?

У меня такой же вопрос

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

Проблема возникает из-за того, что в каком-то триггере в базе данных для таблицы, связанной со схемой Entity не установлен SET NOCOUNT ON.

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

У меня, например, такая проблема воспроизводилась при попытке удалить бизнес-процесс из конфигураци и возникала для объекта Contact. Для этой таблицы в БД есть триггер завязанный на изменение (UPDATE), но в нем не было установлено SET NOCOUNT ON.

Возможно, что у Вас также проблема именно в этом триггере.

Суть ошибки я понимаю. Вопрос в другом имеем ли мы право вносить правки в системные триггер.

 

Добрый день, Игорь.

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

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

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

Мотков Илья,

Илья, Добрый день.
проблема в базовых триггерах таблиц Contact и Account

Это стандартная логика, связанная с поиском дублей и полем-изображением. Из трёх триггеров на событии вставки и изменения работает только один, обновляющий изображение.

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

Коновалов Игорь пишет:
Суть ошибки я понимаю. Вопрос в другом имеем ли мы право вносить правки в системные триггер.

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

Если это ошибка, тогда хотелось бы получить от поддержки Terrasoft решение.

Решением будет удаление некорректных сторонних доработок, которые ломают стандартную логику триггеров раздела. В конфигурации вообще использование Parallel.ForEach минимально, только один раз при работе с сервисом рассылок.

Илья, вопрос к триггерам таблицы
- Контрагент:
TRILqybnWrGVlAZ250EZZORaS6GAIU
TRILqybnWrGVlAZ250EZZORaS6GJAD
TRAccountID
- Контакт:
TRContactID
TRILE9Mk5tdkf4ii5Xu52IJW7JlLAD

Все они являются базовыми и все содержат строку
SET NOCOUNT ON

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

Мотков Илья,

Я обрабатываю большой объем данных. Без применения

Parallel.ForEach данная выгрузка займет несколько дней.
Базовые триггеры прерывают данный процесс.

 

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

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

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

У меня такой же вопрос

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

Добрый день. Схожий вопрос обсуждался здесь:

https://community.terrasoft.ru/questions/izmenenie-zablokirovanogo-pake…

Если кратко, то посмотрите следующие скрипты:

--Решение проблемы при изменении хранилища
update syspackage set IsChanged = 1, IsLocked = 1 where InstallType=0
update SysSchema set IsChanged = 1, IsLocked = 1 where syspackageid in (select id from syspackage where InstallType=0)
update syspackageschemadata set IsChanged = 1, IsLocked = 1 where syspackageid in (select id from syspackage where InstallType=0)

 

Пащенко Александр Сергеевич,

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

Добрый день.

Если не меняли аттрибут sourceControlAuthPath в ConnectionStrings, то зайдите по пути C:\Windows\Temp\%номер сайта% (номер сайта можно узнать в IIS,нажав "Дополнительные параметры"  на нужном сайте. Удалите эту папку, очистите кэш redis и переавторизуйтесь в хранилище.

Если у вас указан свой путь, то просто удалите содержимое папки указанной по этому пути.

Дмитрий А.,

не помогает тоже

Александр Тыра пишет:

Дмитрий А.,

не помогает тоже

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

Дмитрий А.,

удалил все и почистил редис - не помогло

Александр Тыра,

Подскажите, удалось решить проблему? Если да, то как? Столкнулись с такой же.

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

Добрый день.
Интересуют лучшие практики по поводу следующего вопроса.

Велась разработка (в большей степени через дизайнер) в своем пакете и переносили пакет через SVN, но в следствии неопытности много косяков и артефактов появилось, в том числе и в SVN. Сейчас есть задача по кардинальным изменениям и хочу организовать это в новом пакете и в перспективе наследовать объекты сразу от базовых. Но есть НО.

Есть лид с двумя страницами (и артефактами) нужно чтобы пользователь по результату нового проекта получил лид с тремя страницами (2 старые и 1 новая), но избавится от артефактов и чтобы они не оказались в новом пакете. И остальные объекты (БП, схемы) должны остаться в функционале.
Кто подскажет как лучше организовать чтобы старым лидом и новым не было конфликтов и они правильно легли друг на друга (порядок пакетов, наследование объектов, зависимости, как лучше в хранилище сделать или новое)?

 

Спасибо

У меня такой же вопрос

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

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

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