UserConnection
БП
Плановый запуск БП
7.11
sales
Соединение

Есть БП, в нем есть скрипт. в скрипте выполняется некий код, который использует сервис ReportService. Там берется Connection. Если запускать БП вручную - все работает. Если по плану - выбивает ошибку.

Вопрос: Как в БП передать Get("UserConnection"); в userConnection сервиса ReportService? Есть ряд других сервисов, возможно туда тоже нужно будет это передать....

Нравится

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

Почему вы решили что UserConnection не передается?

Вы от какого пользователя запускаете БП по расписанию? Есть ли у єтого ползователя права для рабьоты с  ReportService?

Добавить комментарий

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

Автозапуск от пользователя что и обычный запуск, вот ошибка:

System.ServiceModel.ServiceActivationException: Set AspNetCompatibilityEnabled true

   в Terrasoft.Web.Common.BaseService.get_UserConnection()

   в Terrasoft.Configuration.ReportService.ReportService.GenerateDevExpressReport(String entitySchemaUId, String reportSchemaId, String recordId, String reportParameters)

   в Terrasoft.Configuration.ReportService.ReportHelper.CreateReport(String entitySchemaUId, String reportSchemaUId, String templateId, String recordId, String reportParameters, Boolean convertInPDF)

   в Terrasoft.Configuration.ReportService.ReportService.CreateReport(String entitySchemaUId, String reportSchemaUId, String templateId, String recordId, String reportParameters, Boolean convertInPDF)

   в Terrasoft.Core.Process.UsrAutoSendNightReportMethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)

   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Функциональность сервиса ReportService была разработана под вызов с веба, а не с сервера. Ряд его логики может не работать при вызове с серверной стороны. С GenerateMSWordReport будет аналогично.

Те определять UserConnectionнужно как для сервиса

userConnection = HttpContext.Current.Session["UserConnection"]

Те определять UserConnectionнужно как для сервиса

userConnection = HttpContext.Current.Session["UserConnection"]

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

Дмитрий Степанов,

тоже делал так, но там нужно было несколько функций тока, а тут хз что нужно будет...

Добрый день!

У меня данная проблема отпала при передаче параметра "UserConnection" конструктору ReportService.

var reportService = new Terrasoft.Configuration.ReportService.ReportService(UserConnection);

 

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

Добрый день!

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

Нравится

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

А что мешает например при загрузке загрузить в справочник ваше значение атрибута и настроить чтоб при изменении атрибута менялось значения справочника или вам что-то другое нужно?  Обмен данными между страничкой и деталью можно через подписку на события реализовать.Таким событием может стать например изменение атрибута(виртуальной колонки)

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

Да. Вот моя страница подбора продукта.

На самом деле мне просто нужно сохранить подобранный продукт в детали. Я не смог найти как можно настроить комплексный фильтр для справочного поля детали. Смог только реализовать через esq для атрибута. Но теперь не могу значение этого атрибута передать в деталь. 

Руслан Хасанов пишет:

На самом деле мне просто нужно сохранить подобранный продукт в детали

Если Вам нужно сохранить нужный продукт в деталь, то сделать это можно либо с помощью бизнес-процесса, либо с помощью классов InsertQuery для клиентской или серверной части приложения bpm'online.

На самом деле хотелось бы просто передать значение Id продукта на клиентской схеме. Вариант прямого сохранения в объект детали используя запрос не удобен тем что:

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

2. Второе происходит из первого - надо проверять есть ли такой Id в детали, если да то йпдейт. 

3. Надо переопределить кнопку сохранения

4. Необходимо изобретать велосипед, т.е. повторять логику сохранения записи детали.

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

А что мешает например при загрузке загрузить в справочник ваше значение атрибута и настроить чтоб при изменении атрибута менялось значения справочника или вам что-то другое нужно?  Обмен данными между страничкой и деталью можно через подписку на события реализовать.Таким событием может стать например изменение атрибута(виртуальной колонки)

Да, Григорий, мне так и надо сделать, чтобы в значение справочника устанавливалось значение атрибута. Мешает недостаток опыта, я не могу найти пример кода как это сделать. Если есть возможность, приведите, пожалуйста, пример. Спасибо огромное!

Нашел ветку в которой обсуждалась данная тема https://community.terrasoft.ru/questions/znacenie-v-pole-spravocnik

Вот решение для этого вопроса: 

this.loadLookupDisplayValue("Type", constants.ContractType.Standard);

Большое спасибо Сергею за подсказку.

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

Стоит задача реализовать комплексный фильтр подбора продукта. Т.е. каталог продуктов состоит из 4 категорий (Корневая категория, вложенная 2 уровня, вложенная 3 уровня и вложенная 4 уровня). У продукта имеются характеристики (например, цвет и модификация). Необходимо чтобы при выборе категорий справочные поля модификации и цвета содержали только те значения которые входят в эту категорию (это работает). Также надо чтобы справочное поле продукта фильтровалось по категориям, цветам и модификациям. Получилось выполнить данное задачу через виртуальную колонку (атрибут). Не могу понять как такой фильтр применить к полю продукта детали (ни где не встретил пример который бы это описывал). Подскажите, пожалуйста, как настроить комплексный фильтр для справочного поля в секции diff. Или устроило бы правило которое бы привязывало значение виртуального поля к реальному, как это можно сделать?

Нравится

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

Что-то похожее есть в Bpm’online real estate, механизм подбора листингов в разделе лидов.

Интересно было бы посмотреть как реализован такой фильтр. Но, к сожалению, у меня нет доступа к платформе real estate. 

Это решение партнёра Softline, связываться нужно с ними.

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

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

Добрый день. 

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

Нравится

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

Очистка редиса в первую очередь и выйти зайти в систему. Так же советую проверить все настройки телефонии согласно статьи в академии, может чтото зацепили

А какие при этом сообщения в консоли возникают?

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

только эту ошибку видно

file: undefined

 line: undefined

 column: undefined

 message: Cannot read property 'value' of undefined 

 date: Fri Oct 19 2018 16:45:09 GMT+0300 (Москва, стандартное время)

 moduleId: ViewModule_RightSideBarModule_CtiPanelModule

 moduleName: CtiPanelModule

Уточните, вносились ли какие-то изменения в конфигурацию bpm'online?

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

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

Серков Игорь Владимирович,

Сгенерируйте исходные коды для всех схем и перекомпилируйте все приложение.

Если сайт развернут on-site, тогда ещё очистите Redis.

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

 

Очистка редиса в первую очередь и выйти зайти в систему. Так же советую проверить все настройки телефонии согласно статьи в академии, может чтото зацепили

Игорь, здравствуйте!

Проблема в том что у Вас on-site и самоподписанный сертификат. 

По проблеме on-site. В bpm'online базовая интеграция с телефонией Webitel Collaboration есть только для cloud.

Для того, чтобы подключить данную интеграцию на вашем сайте рекомендую Вам обратиться в тех. поддержку support@terrasoft.ru

Для включения интеграции необходимо следующее:

1) Доступность вашего сайта "из вне"

2) Временный доступ к системе для сотрудников тех. поддержки Террасофт

3) Валидный сертификат SSL из официального центра сертификации. Либо Вы можете настроить сайт по http

Показать все комментарии
C#
sales
7.10

Добрый день!

 

Есть две таблицы:

1) ListObject с колонками ObjectName(строка), ObjectType(Lookup), ObjectRule(Lookup на RulesList )

2) RulesList с колонками NameRule(строка),  ObjectType(Lookup)

Нужно реализовать фильтр, для колонки ObjectRule, таблицы ListObject. 

Фильтр должен выводить доступными только те записи ObjectRule, ObjectType которых соответствует ObjectType таблицы ListObject.

 

rules: {
  "typeObjectFilter": {
	 lookupListConfig: {
	   filters: [
	     function() {
		   var ruleToObject = this.get("ObjectRule");
		   var filterGroup = Ext.create("Terrasoft.FilterGroup");
		   if (ruleToObject) {
			  var filterByTypeRule = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"[RulesList:ObjectType].value", ruleToObject.value);
			  filterGroup.add("filterByTypeRule", filterByTypeRule);
			  return filterGroup;
		   }
		 }
	   ]
    }
  }
}

В настоящий момент фильтр не работает, страница не загружается.

Нравится

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

engineer7,

По первому пункту рекомендую ознакомиться со статьей по построению путей к колонкам относительно корневой схемы на академии:

https://academy.terrasoft.ru/documents/technic-sdk/7-13/postroenie-putey-k-kolonkam-otnositelno-kornevoy-shemy

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

Дальше Вы реализуете её в блоке rules, но, если делать через  lookupListConfig, то реализовывать нужно через блок attributes.

На мой взгляд, в данном случае Вы сильно усложнили себе задачу.

Ваш запрос на sql выглядит таким образом:

select Id

from RuleList

where RuleList.ObjectTypeId = @ObjectTypeId

где @ObjectTypeId - это значение ObjectType из таблицы ListObject

Реализовать такую фильтрацию можно легко с помощью мастера бизнес-правил https://academy.terrasoft.ru/documents/administration/7-13/nastroyka-biznes-pravil либо внести изменения в страницу редактирования на уровне конфигурации https://academy.terrasoft.ru/documents/technic-sdk/7-13/primer-primeneniya-pravila-filtration

1. Почему в выражении "[RulesList:ObjectType].value" Вы указали "value"?

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

Например: "[RulesList:ObjectType].ObjectRule"

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

Алла,  добрый день! Спасибо за ответ!

1. Не знал этот момент.

2. Sql запрос выглядит таким образом:

SELECT ObjectRule

  FROM ListObject INNER JOIN RulesList ON

  ListObject.ObjectTypeId =  ListObject.ObjectRule.ObjectTypeId

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

Возможно мне нужно идти по другому пути и для начала получить значение из поля "Тип объекта"(ObjectRule таблицы ListObject), которое я добавляю первым? 

engineer7,

По первому пункту рекомендую ознакомиться со статьей по построению путей к колонкам относительно корневой схемы на академии:

https://academy.terrasoft.ru/documents/technic-sdk/7-13/postroenie-putey-k-kolonkam-otnositelno-kornevoy-shemy

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

Дальше Вы реализуете её в блоке rules, но, если делать через  lookupListConfig, то реализовывать нужно через блок attributes.

На мой взгляд, в данном случае Вы сильно усложнили себе задачу.

Ваш запрос на sql выглядит таким образом:

select Id

from RuleList

where RuleList.ObjectTypeId = @ObjectTypeId

где @ObjectTypeId - это значение ObjectType из таблицы ListObject

Реализовать такую фильтрацию можно легко с помощью мастера бизнес-правил https://academy.terrasoft.ru/documents/administration/7-13/nastroyka-biznes-pravil либо внести изменения в страницу редактирования на уровне конфигурации https://academy.terrasoft.ru/documents/technic-sdk/7-13/primer-primeneniya-pravila-filtration

Алла, огромное спасибо!

Получилось реализовать, рабочий вариант: 

	// Набор правил для колонки [ObjectRule] модели представления.
			"ObjectRule": {
				// Правило фильтрации колонки [ObjectRule] по значению колонки [ObjectType].
				"FiltrationObjectRuleByObjectType": {
					// Тип правила FILTRATION.
					"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
					// Будет выполняться обратная фильтрация.
					"autocomplete": true,
					// Будет выполняться очистка значения при изменении значения колонки [ObjectType].
					"autoClean": true,
					// Путь к колонке для фильтрации в справочной схеме [ObjectRule],
					// на которую ссылается колонка [ObjectRule] модели представления
					// страницы редактирования.
					"baseAttributePatch": "ObjectType",
					// Тип операции сравнения в фильтре.
					"comparisonType": Terrasoft.ComparisonType.EQUAL,
					// В качестве значения при сравнении выступает колонка (атрибут)
					// модели представления.
					"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
					// Имя колонки модели представления страницы редактирования,
					// по значению которой будет выполняться фильтрация.
					"attribute": "ObjectType"
				}
			}

 

Показать все комментарии
email
MS Exchange
7.12
sales

Проблема подключения к MS Exchange. При подключение используется домен, но настройки для введения домена нет. Пробовал через domen\ADLogin - не работает. Логин не имеет в себе "@mail.com" (в смысле не совпадает с адресом). При подключении пишет "Указан неправильный email или пароль." Проверил настройки на Outlook встроенный в Windows 10 - все работает нормально, просит завести: Сервер, домен, логин, пароль.

Настраивал по инструкции академии

Нравится

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

Насколько я понимаю в зависимости от настроек сервера в в имени пользователя может быть домен или его не быть е если у вас email VasaPupkin в домен ExtraCompany

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

ExtraCompany\VasaPupkin

Или попросить установить для Exchange сервера формат аутентификации без логина

Как то так: https://www.techieshelp.com/exchange-2013-change-owa-log-on-options/

Вот видео по настройке. Насколько понимаю, если логин не совпадает с email, то нужно вводить логин и email в соответствующие поля, а домен отдельно никуда вводить не нужно.

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

по этом видео делал - не работает

Может, какие-то запреты на стороне сервера. Уточните параметры подключения у админа, вдруг реально нужно прописывать не тот email. Если есть логи на стороне exchange, там тоже при неуспешном подключении может быть более подробная информация о причине.

Зверев Александр,Админ говорит что логин это - domin\Login, и имя сервера. Больше нечего не дает, говорит это все

Пусть ещё email Вам скажет.

И смотрите логи.

Зверев Александр, email я взял. Смотреть логи Exchange'а? Админ говорит что там оооочень много данных и смотреть их отбивается

Сообщение «Указан неправильный email или пароль» намекает на одну из двух возможных причин. Также попробуйте включить настройку «Использовать email как логин».

Если дело не в этом, могут быть запреты на уровне сервера.

Зверев Александр, «Использовать email как логин» тоже ставил, не помогло. В общем нужны логи Exchange'а?

scr_cases_ms_exchange_card.png

Тут есть разные варианты настройки. Если ничего не поможет, анализируйте логи.

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

все их перепробовал.

Такое ещё может быть, если на сервере Exchange просрочены сертификаты. Если дело в этом, есть два решения:

1) Установить нормальные сертификаты на сервере Exchange (не самоподписанные и не просроченные, а выданные центром сертификации) .

2) Установить значение true системной настройке «Игнорировать некорректные сертификаты сервера Exchange»

Насколько я понимаю в зависимости от настроек сервера в в имени пользователя может быть домен или его не быть е если у вас email VasaPupkin в домен ExtraCompany

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

ExtraCompany\VasaPupkin

Или попросить установить для Exchange сервера формат аутентификации без логина

Как то так: https://www.techieshelp.com/exchange-2013-change-owa-log-on-options/

Григорий Чех,пробовал прописывать domen\Name - тоже не работает. Вносить в настройки сервера админ не хочет, потому и думаю как это можно сделать без его участия. Админ считает "у нас все работает, это у вас не правильно настроено или не работает"

Третий вариант найти почтовый сервер который умеет собирать почту с других серверов, настроить в нем импорт почты с вашего Exchange и использовать его для забора почты с Exchange сервера и отправлять (хотя отправлять можно и через этот третий сервер) А в BPM настроить этот третий сервер. Такое вроде умеет mail.ru gmail.com Если это конечно разовая операция если таких пользователей много то нужно надавить на админа через руководство :)

Кстате а какая версия у вас Exchange сервера?

И еще обращатся в поддержку не пробовали?

 

Показать все комментарии
модальное окно
параметры
7.7
sales

Подскажите пожалуйста, как передать данные в модальное окно, а также как и где получить их в модальном окне?

Вызов модального окна 

 

var sandbox = this.sandbox;
var config = {
	heightPixels: 300,
	widthPixels: 700
};
var moduleName = "GrsModalModule";
var moduleId = sandbox.id + "_" + moduleName;
var renderTo = ModalBox.show(config, function() {
	sandbox.unloadModule(moduleId, renderTo);
});
sandbox.loadModule(moduleName, {
	id: moduleId,
	renderTo: renderTo,
});

 

Нравится

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

Пример из  TagUtilitiesV2 (заполнение parameters) и вызов модуля

openTagModule: function(config) {
	var scope = config.scope;
	var sandbox = config.sandbox || scope.sandbox;
	var tagModulePageId = this.getTagModulePageId(sandbox);
	this.prepareModalBox();
	var tagModuleConfig = {
		renderTo: this.getGridContainer(),
		id: tagModulePageId,
		parameters: {
			TagSchemaName: config.entityTagSchemaName,
			InTagSchemaName: config.entityInTagSchemaName,
			RecordId: config.entityRecordId
		}
	};
	sandbox.loadModule("TagModule", tagModuleConfig);
},

Пример чтения переданных параметров в модуле TagModule 

createViewModel: function() {
	var viewModel = this.callParent(arguments);
	var parameters = this.parameters;
	if (parameters) {
		viewModel.set("TagSchemaName", parameters.TagSchemaName);
		viewModel.set("InTagSchemaName", parameters.InTagSchemaName);
		viewModel.set("RecordId", parameters.RecordId);
	}
	return viewModel;
}

 

Пример из  TagUtilitiesV2 (заполнение parameters) и вызов модуля

openTagModule: function(config) {
	var scope = config.scope;
	var sandbox = config.sandbox || scope.sandbox;
	var tagModulePageId = this.getTagModulePageId(sandbox);
	this.prepareModalBox();
	var tagModuleConfig = {
		renderTo: this.getGridContainer(),
		id: tagModulePageId,
		parameters: {
			TagSchemaName: config.entityTagSchemaName,
			InTagSchemaName: config.entityInTagSchemaName,
			RecordId: config.entityRecordId
		}
	};
	sandbox.loadModule("TagModule", tagModuleConfig);
},

Пример чтения переданных параметров в модуле TagModule 

createViewModel: function() {
	var viewModel = this.callParent(arguments);
	var parameters = this.parameters;
	if (parameters) {
		viewModel.set("TagSchemaName", parameters.TagSchemaName);
		viewModel.set("InTagSchemaName", parameters.InTagSchemaName);
		viewModel.set("RecordId", parameters.RecordId);
	}
	return viewModel;
}

 

Показать все комментарии
привязка данных
перенос настроек
7.12
sales

Выдает: При привязке SysSettingsValue выдает "Не привязаны данные для связанного объекта "SysSettings" по колонке "SysSettings". Значение "72ab6c8f-fbb6-42ae-ba5c-7288bab96e2d"

Однако запись в SysSettings c Id = 72ab6c8f-fbb6-42ae-ba5c-7288bab96e2d предварительно успешно привязана.

Манипуляции из этой темы проблемы не решили.

Остается только через SQL?

Нравится

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

Убедитесь, что вы привязываете правильный объект. Вы должны выбрать в данных "Системная настройка (объект)", если выбрать просто "Системная настройка", то это будет просто представление в бд

Убедитесь, что вы привязываете правильный объект. Вы должны выбрать в данных "Системная настройка (объект)", если выбрать просто "Системная настройка", то это будет просто представление в бд

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

так и было! Благодарю.

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

Добрый день.

Собственно, сабж: как получить свой SysAdminUnit.Id? Нашел только для старой "клиент-серверной" архитектуры. Есть какая-то доступная переменная или функция?

Нравится

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

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

Вот так:

private UserConnection UserConnection
        {
            get
            {
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                _userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                return _userConnection;
            }

            set { _userConnection = value; }
        }

var userId = UserConnection.CurrentUser.Id;

 

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

Вот так:

private UserConnection UserConnection
        {
            get
            {
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                _userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                return _userConnection;
            }

            set { _userConnection = value; }
        }

var userId = UserConnection.CurrentUser.Id;

 

Показать все комментарии
поля
Деталь
7.12
sales

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

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

 

Нравится

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

Дело может быть в том, что объект детали «Продукт в продаже» (OpportunityProductInterest) сделан на основе базового объекта, а другие подобные детали «Продукт в заказе» (OrderProduct) и «Продукт в счете» (InvoiceProduct) — на основе виртуального объекта «Базовое вхождение продукта» (BaseProductEntry). Соответственно, у объектов OrderProduct и InvoiceProduct есть поле «Название» и оно является первичным для отображения.

Сравните между собой детали и попробуйте сделать аналогично.

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