Добрый день!

Настроил систему на разработку в файловой системе. Все делал по инструкции с академии. Но при отладки когда проставляю точку останова то она не работает - http://prntscr.com/mon7s3

Второй метод дебага что описан в статье мне не подходит.

Подскажите из- за чего может быть такое поведение?

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

Нравится

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

Как вариант - посмотреть настройки отладчика в VS.

 

 

Как вариант - посмотреть настройки отладчика в VS.

 

 

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

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

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

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

Что не так сделал и как же мне перенести этот шаблон письма?

Нравится

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

SysEmailTemplateLcz посмотрите

Поправьте — Тип установки: "Установка".

Поправил. Помогло на 50%. Перенесся только английский вариант письма. А вот на Русском языке нет. Где посмотреть что не так?

SysEmailTemplateLcz посмотрите

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

Спасибо. Наводка помогла. Добавил в данные объект "Таблица локализации для шаблонов" - EmailTemplateLang

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

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

Столкнулся с проблемой интеграции с Google Analytics. Написал сервис с с ипользованием следующих библиотек - https://prnt.sc/mmm8kd

Но при вызове сервиса вываливаются следующие ошибки -https://prnt.sc/mmm98e

Я понял что идет конфликт встроенных библиотек Google и тех что добавили в кастомном пакете.

Что можете посоветовать? 

Нравится

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

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



Приносим свои извинения за неудобства. Версии библиотек Google API планировали обновлять с версии 7.13.0, но в результате тестирования возникли технические проблемы. На данный момент ответственная команда занимается решением  этого вопроса. Обновления версии библиотек Google API запланировано на ближайшие релизы.



Спасибо за понимание!

Мотков Илья,

Благодарю!

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

Добрый день.

Стоит задача: назначать дату начала активности на ближайший день недели указанный в поле Контрагента "День недели" или "День недели 2". Например, у Контрагента в поле "День недели" указан понедельник, а в "День недели 2" - пятница, тогда все новые активности связанные с этим контрагентом должны назначаться на ближайший будущий понедельник или пятницу, в зависимости от того, какая дата ближе..

 

Нравится

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

А в чем конкретно вопрос, что именно не получается реализовать? По логике здесь все просто:

Получаете текущий день недели и сравниваете с ДН1 и ДН2, дальше назначаете дату активности соответствующим днем.

А в чем конкретно вопрос, что именно не получается реализовать? По логике здесь все просто:

Получаете текущий день недели и сравниваете с ДН1 и ДН2, дальше назначаете дату активности соответствующим днем.

Как раз не могу понять как найти дату соответствующую ДН1 или ДН2. Видел функцию ДеньНедели() но он возвращает номер дня

Смотрите номер текущего дня, номера обоих дней контрагента, находите разницу вперёд до ближайшего из двух, если не 0, то добавляете столько дней к сегодняшней дате посредством myDate.AddDays(offset), полученную дату пишете в параметр и используете для создания активности.

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

Добрый день!

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

Пробовал следующий БП:

старт по созданию нового контакта с типом сотрудник и блок настроек прав доступа отнимает права Р/У у роли "торговый агент" (это функциональная роль, взял для тренировки)

Проблема в том, что права остаются у стандартно присваиваемой роли "all employees" и это позволяет торговым агентам редактировать т.к. они по умолчанию входят в эту группу. Складывается впечатление что мне нужно строить БП с десятком блоков ограничивающих права для каждой роли отдельно. А если добавится роль, снова редактировать БП?

 

Нравится

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

А отнимайте в БП для "сотрудников" все права у всех ролей. А затем добавляйте права read - для всех, а edit/delete - для System administrators

И заодно, этот БП запускайте при смене типа контакта.

А отнимайте в БП для "сотрудников" все права у всех ролей. А затем добавляйте права read - для всех, а edit/delete - для System administrators

И заодно, этот БП запускайте при смене типа контакта.

Владимир Соколов,

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

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

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

 

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

Я добавил запись в справочник и настроил правило (сначала правило, потом - запись тоже пробовал):

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

Даже для чистоты эксперимента делал правило (правда не добавлял записи): созданные мной доступны для всех.

И всегда выбор типа контакта был вообще пустой для всех, кроме меня.

Подскажите, в чем может быть моя ошибка. 

Спасибо

 

 

Права на записи определяются не по полю «Создал», а по записям в отдельной системной таблице базы. Когда Вы сверху поставили галочку, в базе создалась таблица вроде SysContactTypeRight, и в неё нужно добавить записи для каждого типа. Такой-то видит группа «Все пользователи», а такой-то — другая группа. Если у какого-то из типов никаких прав не будет, как у Вас для всех типов сейчас, то этот тип увидит только админ, что Вам и нужно.

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

А можно немного подробнее как мне это сделать?

Если есть доступ, то через базу.

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

хорошо, это я понял. Есть выход создать новый тип "сотрудники" (благо их не много сейчас) и дать чтение только админам, вот я не понимаю почему другие записи тоже скрываются, т.е. как мне настроить доступ, пускай, для новых записей, но чтобы системные не скрылись. Или только через базу?

Когда Вы включили администрирование справочника по записям, то пользователи-неадмины  будут видеть только те записи, которые им разрешены на чтение, то есть существуют записи в таблице прав. Изначально в таблице прав этого справочника пусто, то есть неадмины не будут видеть ничего. Нужно добавить по каждой записи, кроме «сотрудники» право на чтение для роли «все пользователи».

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

спасибо, хорошо получилось. Раздал права на справочник, создал новые записи кроме "сотрудник" и в существующих контактах через БП заменил старые типы на новые. 

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

Нужно сделать следующий запрос на стороне клиента:

select id, Name, (select top(1) pp.Price from ProductPrice pp where pp.ProductId = Product.Id and pp.TypeId = 'xxxxxxx') from Product

На стороне сервера нашел как: https://academy.terrasoft.ua/documents/technic-sdk/7-13/dobavlenie-kolonok-v-zapros-metod-addcolumn

Как сделать этот запрос на клиенте?

Нравится

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

Здравствуйте, вам нужно смотреть в сторону Terrasoft.SubQueryExpression

https://academy.terrasoft.ua/jscoresdk/?partner=sibis#!/api/Terrasoft.d…

Поищите в конфигурации примеры по "SubQueryExpression"

Сортировку можно применить как к обычной колонке. И добавить необходимые фильтры.

Простите, описание съезжает в приложение кода)

/**
 * Добавляет в запрос колонку имени схемы.
 * @protected
 * @virtual
 * @param {Terrasoft.EntitySchemaQuery} esq Объект запроса.
 * @param {String} columnPath Путь к колонке.
 * @param {String} columnAlias Псевдоним колонки.
 */
 
addSchemaNameColumn: function(esq, columnPath, columnAlias) {
	var expressionConfig = {
		columnPath: columnPath,
		parentCollection: this,
		aggregationType: Terrasoft.AggregationType.NONE
	};
	var column = Ext.create("Terrasoft.SubQueryExpression", expressionConfig);
	var filter = Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL,
		"SysWorkspace",
		Terrasoft.SysValue.CURRENT_WORKSPACE.value
	);
	column.subFilters.addItem(filter);
	var esqColumn = esq.addColumn(columnAlias);
	esqColumn.expression = column;
}

 

Можно реализовать запрос в запросе, то есть сначала получить select id, Name from Product, а потом в функции обработки результата выборки для каждой записи вызывать select top(1) pp.Price from ProductPrice pp where pp.ProductId = Product.Id and pp.TypeId = 'xxxxxxx'.

С точки зрения нагрузки на базу данных будет тоже, что и select id, Name, (select top(1) pp.Price from ProductPrice pp where pp.ProductId = Product.Id and pp.TypeId = 'xxxxxxx') from Product

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

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

Для клиента это выглядит так

Получилось сделать так:

esq.addAggregationSchemaColumn("[WisPriceInRegion:WisProduct].WisCostDelivery",
          Terrasoft.AggregationType.MIN, "Price", Terrasoft.AggregationEvalType.ALL);
var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
        "[WisPriceInRegion:WisProduct].WisDistrict", this.get("WisDistrict").value);
esq.filters.add("esqFirstFilter", esqFirstFilter);

Но все же нужно сделать сортировку по дате создания и выбирать топ(1)

Здравствуйте, вам нужно смотреть в сторону Terrasoft.SubQueryExpression

https://academy.terrasoft.ua/jscoresdk/?partner=sibis#!/api/Terrasoft.d…

Поищите в конфигурации примеры по "SubQueryExpression"

Сортировку можно применить как к обычной колонке. И добавить необходимые фильтры.

Простите, описание съезжает в приложение кода)

/**
 * Добавляет в запрос колонку имени схемы.
 * @protected
 * @virtual
 * @param {Terrasoft.EntitySchemaQuery} esq Объект запроса.
 * @param {String} columnPath Путь к колонке.
 * @param {String} columnAlias Псевдоним колонки.
 */
 
addSchemaNameColumn: function(esq, columnPath, columnAlias) {
	var expressionConfig = {
		columnPath: columnPath,
		parentCollection: this,
		aggregationType: Terrasoft.AggregationType.NONE
	};
	var column = Ext.create("Terrasoft.SubQueryExpression", expressionConfig);
	var filter = Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL,
		"SysWorkspace",
		Terrasoft.SysValue.CURRENT_WORKSPACE.value
	);
	column.subFilters.addItem(filter);
	var esqColumn = esq.addColumn(columnAlias);
	esqColumn.expression = column;
}

 

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

Вот это было круто, спс

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

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

Настройка не кешируется.

Аналогичная настройка Статус системного договора - заполнение работает.

Все из коробки.

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

Куда копать?Изображение удалено.

Нравится

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

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

scr_section_administering_tab_objects.png

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

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

Права на изменение объекта и поля и т.д. есть у пользователя. И заполнение из других настроек работает.

Вы же написали что прав нет:

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

Значит, нужно добавить. 

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

Как добавить права, на конкретную настройку? Видимо, только их не хватает.

Системные настройки по записям обычно не администрируются. Если у Вас с какой-то целью включили, посмотреть можно в разделе прав для объекта «Системная настройка». Но, скорее всего, дело не в ней, см. мой ответ выше.

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

У меня стало работать, как нужно, когда я добавил права на операцию "Доступ к разделу Системные настройки". Т.е. дело не в объекте, у которого изменяются поля.

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

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

Добрый день!



Столкнулись со следующей задачей:

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



Поэтому появляется три вопроса:

1) как осуществить функционал вставки из буфера? Например: находясь в поле "Решение" нажимается вставка скриншота из буфера и в детали "Файлы и ссылки" этого обращения появляется файл с названием "Решение_Название файла"

2) вставка документа (например pdf) путем перетаскивания его на поле "Решение" и чтобы он появлялся в детали "Файлы и ссылки" этого обращения появляется файл с названием "Решение_Название файла"

3) как добавить в шаблон, который отправляется автоматически, эти самые файлы? С использованием макросов invoke?



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

Нравится

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

По размеру, есть системная настройка «Максимальный размер загружаемого файла» (MaxFileSize). По умолчанию там 10 Мб, можно менять.

По шаблону со вложением, см. приложение.

По остальному, в теории, такое возможно. Например, на детали файлов в любом разделе есть место для перетаскивания файла. См. в FileDetailV2 логику, связанную с DragAndDropContainer:

onFileSelect: function(files) {
	if (files.length <= 0) {
		return;
	}
	const config = this.getUploadConfig(files);
	const isNewRecord = this.getIsNewRecord();
	this.set("FileUploadConfig", config);
	if (isNewRecord) {
		const args = {
isSilent: true,
messageTags: [this.sandbox.id]
		};
		this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
	} else {
		this.upload(config);
	}
},
 
 
/**
 * Uploads files using FileAPI.
 * @private
 * @param {Object} config File upload configuration.
 * @param {Function} callback Callback.
 */
upload: function(config, callback) {
	this.Terrasoft.ConfigurationFileApi.upload(config, callback);
},
 
 
onUpload: function() {
	this.showBodyMask();
},
 
initDropzoneEvents: function() {
	const dropZone = document.getElementById("DragAndDropContainer");
	if (!dropZone) {
		return;
	}
	if (this.Terrasoft.Features.getIsEnabled("CheckMasterRecordEditRights") &&
!this.get("CanEditMasterRecord")) {
		return;
	}
	this.Terrasoft.ConfigurationFileApi.initDropzoneEvents(dropZone, function(over) {
		if (over) {
dropZone.classList.add("dropzone-hover");
		} else {
dropZone.classList.remove("dropzone-hover");
		}
	}, function(files) {
		this.onFileSelect(files);
	}.bind(this));
},
 
onRender: function() {
	this.callParent(arguments);
	this.initDropzoneEvents();
...

 

Показать все комментарии
Вопрос: как правильно настраивается отображение справочных полей из связанных таблиц?
На карточке заключения заявки отображаю собственника заявки, указав
"columnName": "MSPApplication.Owner":

{
   "operation": "insert",
   "name": "settings",
   "values": {
      "entitySchemaName": "MSPApplicationConclusion",
      "items": [],
      "subtitleItems": [],
      "groupItems": [],
      "settingsType": "GridPage",
      "operation": "insert"
   }
},
{
   "operation": "insert",
   "name": "Owner",
   "values": {
      "row": 2,
      "content": "Ответственный",
      "columnName": "MSPApplication.Owner",
      "dataValueType": Terrasoft.DataValueType.Lookup,
      "operation": "insert"
   },
   "parentName": "settings",
   "propertyName": "groupItems",
   "index": 2
}

И внешне колонка отобржается корректно, однако она некликабельна(не открывает
карточку физ. лица по нажатию).

Проблема в том, что в base-preview-page-controller.js выдает ошибку в базовом методе

onPreview: function(recordId, field) {
        var columnName = field.getName();
        var parentComponent = field.getParent();
        var parentModel;
        if (parentComponent && parentComponent.isDecorator) {
            parentComponent = parentComponent.getComponent();
            parentModel = (parentComponent && parentComponent instanceof Terrasoft.ViewField) ?
                parentComponent.getRecord().self : null;
        } else {
            parentModel = (parentComponent && parentComponent instanceof Terrasoft.ViewEmbeddedDetailItem) ?
                parentComponent.getRecord().self : null;
        }
        var model = parentModel || this.self.Model;
        var columnConfig = model.ColumnConfigs.get(columnName);
        Terrasoft.util.openPreviewPage(columnConfig.modelName, {recordId: recordId});
    },
из-за того, что columnConfig undefined.

Как настроить columnConfig? 

Нравится

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

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

scr_mobile_wizard_new_column.png

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

     Александр, приведенный Вами пример относится к "встроенной детали"(через пункт меню "Настроить страницу" - добавить встроенную деталь)

     Мне же нужно добавить деталь в мастере, используя меню "Настроить детали". И в мастере можно  настроить только колонки для связи схем.

Поэтому gridPage и recordPage детали нужно настраивать программно.



 

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

я не нашел ни одного такого примера в базовом пакете Mobile,

поэтому и задал вопрос тут.

 

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

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

добрый день.

Нигде не смог найти пример на формирование значения поля на основании других полей.

Например для конфигурационной единицы. Автоматически генерировать Название КЕ по формуле Тип КЕ + Производитель КЕ (собственное поле) + Модель КЕ. 

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

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

Нравится

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

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

Исходя из Ваших требований, вариант с БП не подойдет.

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

Исходя из Ваших требований, вариант с БП не подойдет.

Что не работает. Сделал как описано в примере. Для начала решил сделать просто заполнение текстовым значением, потом переделать на заполнение значениями из справочника. Но даже так поле не заполняется. Что не так сделал?

define("ConfItemPage", [], function() {
	return {
		entitySchemaName: "ConfItem",
		attributes: {
			"EpmName": {
				dataValueType: Terrasoft.DataValueType.TEXT,
				dependencies: [
					{
						columns: ["TypeId", "ModelId", "EPMManufacturerId", "Name"],
						methodName: "generateNewName"
					}
					]
			}
		},
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.generateNewName();
			},
			generateNewName: function() {
				var result = this.get("Name") + " Hello word!";
				this.set("EpmName", result);
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "EpmName",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 5,
						"layoutName": "Header"
					},
					"bindTo": "EPMName",
					"labelConfig": {
						"caption": {
							"bindTo": "Resources.Strings.EpmNameCaption"
						}
					},
					"enabled": true
				},
				"parentName": "Header",
				"propertyName": "items"
			}
		]/**SCHEMA_DIFF*/
	};
});

 

Разобрался. 

В разделе attributes указывается поле страницы Оно у меня записано как EmpName

А вот в методе в строке this.set("EPMName", result); надо писать уже имя поля куда сохраняем значение bindTo. У меня было записано как имя поля EpmName.  А такого поля в схеме нет. Поменял на EPMName или все заработало.

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