Здравствуйте, что-то я запутался((

Есть колонка(дробное число) необходимо её заполнить одинаковым значением - 1000000 для всех контрагентов, как это сделать не импортом... Пробовал  БП, он вроде проходит, но не заполняет(

Нравится

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

Колосов Алексей,

Если Вам нужно это выполнить единоразово, то проще всего cделать, действительно, sql-запросом вида:

update Account

set Field1 = value

where IsNull(Field1, 0) = 0

где Field1 - это название Вашего поля, value - его значение.

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

 

Выполнять прямой запрос к БД или через Microsoft Management Studio если у вас On-Site или через SQL Script в Админки BPM'Online. Нужна помощь в написании SQL скрипта пишите поможем.

а средствами BPM?

В С#-коде можно сформировать и запустить Update-запрос. Пример запроса:

Query update = new Update(UserConnection, "SysEntitySchemaRecordDefRight")
	.Set("AuthorSysAdminUnitId", Column.Parameter(authorId))
	.Where("Id").IsEqual(Column.Parameter(RedactedRecordId));
update.Execute();

В Вашем случае будет ещё и без условия Where.

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

Данная конструкция на C# может не сработать, так как ключевые входные данные это 1 миллион записей. Есть вероятность что по Таймауту ошибка выйдет.

Здесь лучше чтобы Автор поста описал свои знания и от этого лучше отталкиваться чтобы дать совет.

Если много записей, можно порциями, where Id in select top 1000 Id from...

1000000 это не записи, а значение в колонку... Знаний на уровня С# нету....(( Хотелось бизнес-процессом...

В  БП есть элемент «Изменить данные», который делает примерно то же.  Возможно, медленнее, за счёт отрабатывания событий сохранения по каждой записи.

Зверев Александр, этим элементом можно только значения из справочника передать, а у меня дробное число((

Числовые тоже можно.

Колосов Алексей,

Если Вам нужно это выполнить единоразово, то проще всего cделать, действительно, sql-запросом вида:

update Account

set Field1 = value

where IsNull(Field1, 0) = 0

где Field1 - это название Вашего поля, value - его значение.

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

 

Спасибо, разобрался... наверное - понедельник был)))

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

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

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



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

 

Нравится

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

Вот пример Как я его понял исходя из условий Задачи

Михаил, не уверен, что получится именно то, что хочет автор. У Вас найдёт где есть или тот, или тот тип адреса.

Лучше так:

 

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

Добрый день!

Не совсем понятно как выглядит процесс разработки в файловой системе. Файлы должны храниться на сервере или их можно перенести на клиентский компьютер? Можно ли для файловой разработки использовать IIS Express на клиентском компьютере? Подскажите, пожалуйста, как вы выполняете разработку в файловом режиме. 

Нравится

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

Как по мне так лучший вариант, это разворачиваете локально копию рабочей системы, включаете режим разработки в файловой системе, подключаете Git/Svn (для себя), создаете новый пакет и работаете.

Затем, переносите пакет на прод.

См. большую серию статей «Разработка в файловой системе».

По поводу IIS Express, судя по примечанию ниже, поддержка есть:

Название рабочего процесса может различаться в зависимости от конфигурации используемого сервера IIS. Так, для полнофункционального IIS процесс называется w3wp.exe, для IIS Express — iisexpress.exe.

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

Коллеги всем доброго времени суток.

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

Нравится

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

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

VwWorkspaceObjects (Объекты рабочего пространства (представление))

SysAdminOperation (Operation permissions, если надо)

SysAdminOperationGrantee (Доступ к operation permissions, если надо)

SysEntitySchemaOperationRight (Доступ к объектам)

SysEntitySchemaRecordDefRight (Доступ к записям по умолчанию)

SysEntitySchemaRecordRight (Доступ пользователей к операциям над объектом)



SysAdminUnit(Объект администрирования) и тд. 



так же можете в конфигурации системы найти схемы объектов с словом "Доступ", может быть что-то упустил 

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

VwWorkspaceObjects (Объекты рабочего пространства (представление))

SysAdminOperation (Operation permissions, если надо)

SysAdminOperationGrantee (Доступ к operation permissions, если надо)

SysEntitySchemaOperationRight (Доступ к объектам)

SysEntitySchemaRecordDefRight (Доступ к записям по умолчанию)

SysEntitySchemaRecordRight (Доступ пользователей к операциям над объектом)



SysAdminUnit(Объект администрирования) и тд. 



так же можете в конфигурации системы найти схемы объектов с словом "Доступ", может быть что-то упустил 

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

Появилась потребность расширить таблицу Прайс-лист, добавив колонку с типом дата. Но обнаружилось что стоит проверка (и не одна) на дублирование записей. Первую проверку, так чтобы она учитывала новую колонку, изменить удалось (она находится на странице редактирования детали). Но осталась еще одна (а может и больше) проверка до которой не могу добраться. Вот такое сообщение она выдает -"Дублирующиеся данные в объекте ProductPrice". Подскажите, пожалуйста, где эта проверка находится и как ее можно изменить. Спасибо.

Нравится

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

Стандартно в разделе «Правила поиска дублей» есть только правила по контактам, контрагентам и лидам. Открывать этот раздел можно  в блоке ссылок «Настройка системы» из окна дизайнера системы.

Возможно, у Вас что-то ещё настроено или это отдельная логика, не связанная с этим механизмом.

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

select * from DuplicatesRule as dr where dr.ObjectId=(SELECT TOP 1 SysSchema.UId FROM SysSchema

WHERE SysSchema.Name = 'ProductPrice' AND SysSchema.ExtendParent = 0)

- для правил поиска дублей в цене продукта



select * from DuplicatesRule as dr where dr.ObjectId=(SELECT TOP 1 SysSchema.UId FROM SysSchema

WHERE SysSchema.Name = 'Pricelist' AND SysSchema.ExtendParent = 0)

- для правила поиска дублей в Прайс-листе

И посмотрите на ваши новые колонки у них должен быть признак "Выполнять копирование", от так же может влиять на правило

К сожалению данные запросы ни чего не возвращают.

Комментарий удален, чтобы не вводить пользователей в заблуждение 

До этого не была установлена. Сейчас поставил, опубликовал, выполнил запрос к базе - ни чего нет. Так же не нашел описания этой галочки.

Руслан Хасанов,

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

Тогда я не совсем понимаю назначение этой галочки. За уникальность записей отвечает, если я правильно понимаю, поле "Id". Строка в любом случае будет уникальной, зачем эта опция?

Вот свойства колонки.

Запросы ни чего не возвращают. 

Галочка «выполнять копирование» совсем для другого, при нажатии кнопки копирования в разделе в новую запись попадают из старой только значения помеченных ею полей. Уникальность значения она никак не проверяет.

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

Стандартно в разделе «Правила поиска дублей» есть только правила по контактам, контрагентам и лидам. Открывать этот раздел можно  в блоке ссылок «Настройка системы» из окна дизайнера системы.

Возможно, у Вас что-то ещё настроено или это отдельная логика, не связанная с этим механизмом.

Да, какая то отдельная логика, видимо на странице. Буду искать дальше.

Попробуйте в разделе переводов поискать этот текст «Дублирующиеся данные в объекте», обрамлённый символами процента. Если что-то найдётся, можно будет увидеть английское название переменной, по которому искать по исходникам C# и JS-схем. У меня, правда, ничего не нашлось.

Вы имеете ввиду таблицу SysDuplicatesRuleLcz? У меня тоже ни чего не нашлось. Интересно а поиск по тексту схем можно как то произвести?

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

А поиск по тексту схем можно вести через базу, по полю Content в SysSchemaContent для JS и Source в SysSchemaSource для C#.

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

Коллеги всем доброго времени суток!

Нужна помощь.

Есть код обработчик:

 

diff:[
			{
				"operation": "insert",
				"name": "AltNoInformationInterestd2e10eaa-14f7-4005-96b9-78145978b4f2",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "GeneralInfoTabGridLayout8576b06a"
					},
					"labelConfig": {},
					"enabled": true,
					"bindTo": "AltNoInformationInterest",
					"controlConfig": {
						"checkedchanged": {
							"bindTo": "onInterestCheked"
						}
					}
				},
				"parentName": "GeneralInfoTabGridLayout8576b06a",
				"propertyName": "items",
				"index": 0
			},
			{
				"operation": "insert",
				"name": "AltAbsentInterestb586a604-e240-48b6-ba46-2889721a98cf",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 1,
						"layoutName": "GeneralInfoTabGridLayout8576b06a"
					},
					"labelConfig": {},
					"enabled": true,
					"bindTo": "AltAbsentInterest",
					"controlConfig": {
						"checkedchanged": {
							"bindTo": "onInterestCheked"
						}
					}
				},
				"parentName": "GeneralInfoTabGridLayout8576b06a",
				"propertyName": "items",
				"index": 1
			},
			{
				"operation": "insert",
				"name": "AltHaveInterest8b3652ac-d60d-4562-a1a5-e28a28cbce58",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 2,
						"layoutName": "GeneralInfoTabGridLayout8576b06a"
					},
					"labelConfig": {},
					"enabled": true,
					"bindTo": "AltHaveInterest",
					"controlConfig": {
						"checkedchanged": {
							"bindTo": "onInterestCheked"
						}
					}
				},
				"parentName": "GeneralInfoTabGridLayout8576b06a",
				"propertyName": "items",
				"index": 2
			},
],
methods: {
onInterestCheked : function() {
				debugger;
				//var event = window.event;
				if(event) {
					if(event.currentTarget.toString() != "[object XMLHttpRequest]")
					{
						if(this.get("AltNoInformationInterest")  == false 
							&& event.currentTarget.id.indexOf("AltNoInformationInterest") >= 0)
						{
							this.set("AltNoInformationInterest", true);
							this.set("AltAbsentInterest", false);
							this.set("AltHaveInterest", false);
						}
 
						if(this.get("AltAbsentInterest") == false && event.currentTarget.id.indexOf("AltAbsentInterest") >= 0)
						{
							this.set("AltAbsentInterest", true);
							this.set("AltNoInformationInterest", false);
							this.set("AltHaveInterest", false);
						}
 
						if(this.get("AltHaveInterest") == false  && event.currentTarget.id.indexOf("AltHaveInterest") >= 0)
						{
							this.set("AltHaveInterest", true);
							this.set("AltAbsentInterest", false);
							this.set("AltNoInformationInterest", false);
						}
					}
				} 
				else {
					console.log("");
				}
			},
}

В хроме работает отлично, но в FireFox ругается на event. т.к. не определено и не отображало часть контента карточки.

определил event:

var event = window.event;

ошибку перестало бить но метод перестал корректно работать:

Chrome: http://prntscr.com/lkanf6

Firefox: http://prntscr.com/lkaoau

Кто нибудь сталкивался с подобным? И как с этим бороться?

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

Нравится

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

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



var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);

var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);

 

Проще проверять на null значение event и если да — применять то или иное обходное решение.

WebKit follows IE's old behavior of using a global symbol for "event", but Firefox doesn't. When you're using jQuery, that library normalizes the behavior and ensures that your event handlers are passed the event parameter.

Вопрос с этой особенностью Firefox рассматривается во многих местах, см. ссылки: 1, 2, 3, 4, 5.

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

Добрый день!

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

Нравится

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

На примере базовой детали:

 

define("ContactCareerDetailV2",
	["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
	function() {
		return {
			attributes: {
				IsEditable: {
					dataValueType: Terrasoft.DataValueType.BOOLEAN,
					value: true
				}
			},
			diff: /**SCHEMA_DIFF*/[
				{
					name: "DataGrid",
					operation: "merge",
					values: {
						activeRowAction: {bindTo: "onActiveRowAction"},
						activeRowActions: [
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.SaveIcon"},
								markerValue: "save",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "save"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.CardIcon"},
								markerValue: "card",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "card"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.CancelIcon"},
								markerValue: "cancel",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "cancel"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.RemoveIcon"},
								markerValue: "remove",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "remove"
							}
						],
						changeRow: {bindTo: "changeRow"},
						className: "Terrasoft.ConfigurationGrid",
						generateControlsConfig: {bindTo: "generateActiveRowControlsConfig"},
						generator: "ConfigurationGridGenerator.generatePartial",
						initActiveRowKeyMap: {bindTo: "initActiveRowKeyMap"},
						multiSelect: false,
						onGridClick: {bindTo: "onGridClick"},
						unSelectRow: {bindTo: "unSelectRow"}
					}
				}
			]/**SCHEMA_DIFF*/,
			methods: {
				getSwitchGridModeMenuItem: Terrasoft.emptyFn,
				onActiveRowAction: function(buttonTag, primaryColumnValue) {
					switch (buttonTag) {
						case "card":
							var row = this.getGridData().get(primaryColumnValue);
							this.saveRowChanges(row, function(p) {
								this.editRecord(row);
							}, this);
							break;
						case "remove":
							this.deleteRecords();
							break;
						case "cancel":
							this.discardChanges(primaryColumnValue);
							break;
						case "save":
							this.onActiveRowSave(primaryColumnValue);
							break;
					}
				},
				openCardByMode: function() {
					var cardState = this.get("CardState");
					var editPageUId = this.get("EditPageUId");
					var primaryValueUId = this.get("PrimaryValueUId");
					//в любом случае открываем страницу редактирования записи детали
					this.openCard(cardState, editPageUId, primaryValueUId);
 
					//кусок базовой логики
					/*if (this.getIsEditable() && cardState !== enums.CardStateV2.EDIT) {
						this.addRow(editPageUId);
					} else {
						this.openCard(cardState, editPageUId, primaryValueUId);
					}*/
				}
			},
			mixins: {
				ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
			}
		};
	});

 

На примере базовой детали:

 

define("ContactCareerDetailV2",
	["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
	function() {
		return {
			attributes: {
				IsEditable: {
					dataValueType: Terrasoft.DataValueType.BOOLEAN,
					value: true
				}
			},
			diff: /**SCHEMA_DIFF*/[
				{
					name: "DataGrid",
					operation: "merge",
					values: {
						activeRowAction: {bindTo: "onActiveRowAction"},
						activeRowActions: [
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.SaveIcon"},
								markerValue: "save",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "save"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.CardIcon"},
								markerValue: "card",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "card"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.CancelIcon"},
								markerValue: "cancel",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "cancel"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.RemoveIcon"},
								markerValue: "remove",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "remove"
							}
						],
						changeRow: {bindTo: "changeRow"},
						className: "Terrasoft.ConfigurationGrid",
						generateControlsConfig: {bindTo: "generateActiveRowControlsConfig"},
						generator: "ConfigurationGridGenerator.generatePartial",
						initActiveRowKeyMap: {bindTo: "initActiveRowKeyMap"},
						multiSelect: false,
						onGridClick: {bindTo: "onGridClick"},
						unSelectRow: {bindTo: "unSelectRow"}
					}
				}
			]/**SCHEMA_DIFF*/,
			methods: {
				getSwitchGridModeMenuItem: Terrasoft.emptyFn,
				onActiveRowAction: function(buttonTag, primaryColumnValue) {
					switch (buttonTag) {
						case "card":
							var row = this.getGridData().get(primaryColumnValue);
							this.saveRowChanges(row, function(p) {
								this.editRecord(row);
							}, this);
							break;
						case "remove":
							this.deleteRecords();
							break;
						case "cancel":
							this.discardChanges(primaryColumnValue);
							break;
						case "save":
							this.onActiveRowSave(primaryColumnValue);
							break;
					}
				},
				openCardByMode: function() {
					var cardState = this.get("CardState");
					var editPageUId = this.get("EditPageUId");
					var primaryValueUId = this.get("PrimaryValueUId");
					//в любом случае открываем страницу редактирования записи детали
					this.openCard(cardState, editPageUId, primaryValueUId);
 
					//кусок базовой логики
					/*if (this.getIsEditable() && cardState !== enums.CardStateV2.EDIT) {
						this.addRow(editPageUId);
					} else {
						this.openCard(cardState, editPageUId, primaryValueUId);
					}*/
				}
			},
			mixins: {
				ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
			}
		};
	});

 

Спасибо, Данила! Настройка работает.

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

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

Нравится

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

Это определяется атрибутом CommentsVisible в схеме SocialMessageHistoryItemPageV2:

 * Comments block visibility attribute.
 */
"CommentsVisible": {
	"dataValueType": this.Terrasoft.DataValueType.BOOLEAN,
	"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
	"value": false
},

И его состояние считывает и инвертирует та самая ссылка-переключатель «Комментарии (1)»:

/**
 * Toggle comments block visibility and load first portion of comments if it is visible and empty.
 * @protected
 */
toggleCommentsVisibility: function() {
	if (this.get("CommentCount") < 1) {
		return;
	}
	var newVisibilityState = !this.get("CommentsVisible");
	this.set("CommentsVisible", newVisibilityState);
	if (newVisibilityState && this.get("ShownCommentMessagesCount") === 0) {
		this.onLoadNextComment();
	}
},

Нужно смотреть и экспериментировать, достаточно ли поменять атрибут на true, или нужно будет при открытии ещё принудительно вызывать логику загрузки комментариев.

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

При слияние дублей в разделе Контакты у администратора, выполнявшим слияние, в учетной записи поменялся контакт на лицо из дубля. Контакт админа удалился.

В результате имеем двух пользователей, синхронизированных LDAP, но с единым контактом.

Какой нужно выполнить запрос в поднятый бэкап БД для дедубликации или есть ещё какой либо способ. Откат не желателен.

Нравится

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

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

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

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

Здравствуйте! Подскажите, а как добавить в фильтры серверного EntitySchemaQuery подзапрос или где в системе можно найти пример? На SQL запрос выглядит следующим образом:

SELECT
   * 
FROM
   [Contract] 
WHERE
   StartDate = (
        SELECT MAX(c.StartDate)
        FROM Premises p
        JOIN PremisesInContract pic ON p.Id = pic.PremisesId
        JOIN Contract c ON spic.ContractId = c.Id
        WHERE p.Id = --@someparameter
   )

 

Нравится

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