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

TOP1 номер который соответсвует критерию. 

Читал статьи так и не понял.  Данный запрос в разделе контакты.

Select T1."Number" From  "ContactCommunication" T1

LEFT JOIN "Contact" T2 ON T1.Contact=T2.Id

Where T1.CommunicationType='3DDDB3CC-53EE-49C4-A71F-E9E257F59E49'

 

onEntityInitialized: function() {

        this.callParent(arguments);

        this.helping();

    },

    helping: function() {

     // Получаем [Id] объекта карточки.

      // Получаем [Id] объекта карточки.

var recordId = this.get("Id");

// Создаем экземпляр класса Terrasoft.EntitySchemaQuery с корневой схемой [Contact].

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

    rootSchemaName: "Contact"

});

esq.addColumn("[ContactCommunication:Contact:Id].Number", "Number");

esq.addColumn("[ContactCommunication:Contact:Id].CommunicationType", "CommunicationType");

var esqFirstFilter= esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "CommunicationType", "3DDDB3CC-53EE-49C4-A71F-E9E257F59E49");

// Добавление созданных фильтров в коллекцию запроса. 

esq.filters.add("esqFirstFilter", esqFirstFilter);

// В данную коллекцию попадут объекты - результаты запроса, отфильтрованные по двум фильтрам.

esq.getEntityCollection(function (result) {

    if (result.success) {

      result.collection.each(function (item) {

      this.showInformationDialog(result.entity.get("Number"));

        });

    }

}, this);

        }

Нравится

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

Вот мой пример по копированию всех адресов электронной почты контакта, по аналогии можно выбрать топ1 нужного типа

/** Копирование почты */
copyEmail: function() {
	if (this.get("Contact")) {
		var contact = this.get("Contact");
		contact = contact.value;
		var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
			rootSchemaName: "ContactCommunication"
		});
		var email = "";
		esq.addColumn("Contact");
		esq.addColumn("CommunicationType");
		esq.addColumn("Number");
		// Создание экземпляра первого фильтра.
		var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Contact", contact);
		// Создание экземпляра второго фильтра.
		var esqSecondFilter =	esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
							"CommunicationType", "ee1c85c3-cfcb-df11-9b2a-001d60e938c6");
		// Фильтры в коллекции фильтров запроса будут объединяться логическим оператором OR. 
		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.each(function(item) {
					// Обработка элементов коллекции.
					email = email + " " + this.get("Number");
				});
				this.set("UsrEmail", email);
			}
		}, this);
}

 

Вот мой пример по копированию всех адресов электронной почты контакта, по аналогии можно выбрать топ1 нужного типа

/** Копирование почты */
copyEmail: function() {
	if (this.get("Contact")) {
		var contact = this.get("Contact");
		contact = contact.value;
		var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
			rootSchemaName: "ContactCommunication"
		});
		var email = "";
		esq.addColumn("Contact");
		esq.addColumn("CommunicationType");
		esq.addColumn("Number");
		// Создание экземпляра первого фильтра.
		var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Contact", contact);
		// Создание экземпляра второго фильтра.
		var esqSecondFilter =	esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
							"CommunicationType", "ee1c85c3-cfcb-df11-9b2a-001d60e938c6");
		// Фильтры в коллекции фильтров запроса будут объединяться логическим оператором OR. 
		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.each(function(item) {
					// Обработка элементов коллекции.
					email = email + " " + this.get("Number");
				});
				this.set("UsrEmail", email);
			}
		}, this);
}

 

Быстров Сергей, Спасибо, сейчас попробуем. 

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

Здравствуйте, подскажите как можно заблокировать от изменений деталь "Средства связи" у контакта и контрагента. Добавоение "+" убирается без проблем, про вот изменение типа (выпадающий список) и значения как можно заблокировать?

Нравится

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

Александр, тут возможны два подхода: либо модифицировать схему детали ContactCommunicationDetailV2, добавив элементам свойство только для чтения, или AccountCommunicationDetailV2, либо настроить нужным пользователям права доступа только для чтения на объект этой детали. Но в случае последнего подхода нужно помнить, что в объекты разделов Contact и Account во встроенные БП добавлена логика синхронизации с деталью средств связи. Чтобы отсутствие прав не приводило к ошибкам, нужно в своём пакете переопределить функцию SynchronizeCommunication в процессах этих объектов.

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

первый вариант только на чтение - не выходит заблокировать выпадающий список

Александр, сложно сказать, не зная, что Вы меняли.

Это поле и выпадающий список формируются в ContactCommunicationDetailV2 здесь:

var typeMenuItems = [];
var communicationTypes = this.get("CommunicationTypes");
communicationTypes.each(function(item) {
	var name = item.get("Name");
	var value = item.get("Id");
	typeMenuItems.push({
		id: value,
		caption: name,
		tag: value,
		click: { bindTo: "typeChanged" }
	});
}, this);
var typeButtonConfig = {
	id: "type",
	className: "Terrasoft.Button",
	classes: {
		wrapperClass: ["label-wrap", "detail-type-btn-user-class"],
		textClass: ["detail-type-btn-inner-user-class"]
	},
	style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
	selectors: {wrapEl: "#type"},
	caption: {
		bindTo: "CommunicationType",
		bindConfig: { converter: "typedStringValueConverter" }
	},
	menu: { items: typeMenuItems }
};

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

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

Имеете ввиду сделать override модуля, и в функции удалить 

var communicationTypes = this.get("CommunicationTypes");
communicationTypes.each(function(item) {
	var name = item.get("Name");
	var value = item.get("Id");
	typeMenuItems.push({
		id: value,
		caption: name,
		tag: value,
		click: { bindTo: "typeChanged" }
	});
}, this);

 

 

?

Прежде, чем менять, надо сначала ещё проверить в отладке, используется ли в этой версии логика из ContactCommunicationDetailV2 или из ContactCommunicationDetail и BaseCommunicationDetail, созданная для более старого интерфейса.

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

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

 

Не могу понять логику загрузки файлов из папки Files.

Добавляю туда свои js-файлы, и при попытке, как сказано в документации: "Обновить пакеты из файловой системы" и "Компилировать", вижу, что загружается предыдущая версия js-файлов.

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

Нравится

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

Максим, Вы точно заливали нужные файлы в нужную папку? Тут пишут:

  • [ Обновить пакеты из файловой системы ] ([ Update packages from file system ]) — загружает пакеты из каталога ...\Terrasoft.WebApp\Terrasoft.Configuration\Pkg в базу данных.

Спасибо, Александр, за внимание к моему вопросу.

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

Максим, уточнил у разработчиков функциональности:

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

Подтягиваются в приложение файлы js через bootstrap.js, который находится в той же папке Files и зарегистрированный в descriptor.json, и при этом это происходит в режиме реального времени, когда приложение работает.

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

Добрый день!

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

 

Спасибо!

Нравится

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

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

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

Алексей Следь, спасибо большое!))) В 7.17 не могу её найти((( 

"Удалять записи" не помогает.

 

 

Екатерина, непонятно, почему у Вас подписи переключателей такие, а не «Блокировать удаление, если есть связанные записи в текущем объекте с этим значением» и «Удалять записи из текущего объекта с этим значением», как написано при открытии в дизайнере стандартной детали, вроде «Контрагент в группе». Там у поля связи с разделом выбрано второе значение.

На всякий случай, старая конфигурация доступна на /0/dev_old и можно включить каскадную связь там.

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

Cпасибо большое! Помогло переключение на старую конфигурацию!)

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

Добрый день!

 

Для меня Террасофт новое ПО, понемногу пытаюсь разбираться. При запуске настройки страницы из мастера разделов автоматически генерируется страница с вкладками "Файлы и примечания" и "Лента". На вкладке "Файлы и примечания" есть деталь Примечания, которая отображает поле RICH_TEXT с визуальным редактором. 

Вот он

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

 

Если же я попробую создать страницу, например, при добавлении преднастроенной страницы в бизнес-процесс, то найти деталь "Примечания" не удастся. У меня Studio. Исходя из документации, "Примечания" доступны для всех продуктов.

 

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

 

Подскажите, пожалуйста, если есть какой-то рецепт, как добавлять поле RICH_TEXT на вкладку новой страницы?

Нравится

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

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

{
	"operation": "insert",
	"name": "UsrTextEmaila9104234-0e5e-4e48-8f19-3b2a78a42e99",
	"values": {
		"layout": {
			"colSpan": 24,
			"rowSpan": 1,
			"column": 0,
			"row": 5,
			"layoutName": "LeadPageRegisterInfoBlock"
			},
				"bindTo": "UsrTextEmail", //Ваше текстовое поле
				"enabled": false,
				"contentType": 4,  //добавляем
				"labelConfig": { //добавляем
					"visible": false. //добавляем
				}. //добавляем
				}

Таким образом на текстовое поле нужно навесить ContentType и labelConfig. Код выдирал из одного из старых проектов - года 3 назад оно работало)

 

p.s. свойство enabled - у вас будет, естественно, true. 

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

{
	"operation": "insert",
	"name": "UsrTextEmaila9104234-0e5e-4e48-8f19-3b2a78a42e99",
	"values": {
		"layout": {
			"colSpan": 24,
			"rowSpan": 1,
			"column": 0,
			"row": 5,
			"layoutName": "LeadPageRegisterInfoBlock"
			},
				"bindTo": "UsrTextEmail", //Ваше текстовое поле
				"enabled": false,
				"contentType": 4,  //добавляем
				"labelConfig": { //добавляем
					"visible": false. //добавляем
				}. //добавляем
				}

Таким образом на текстовое поле нужно навесить ContentType и labelConfig. Код выдирал из одного из старых проектов - года 3 назад оно работало)

 

p.s. свойство enabled - у вас будет, естественно, true. 

Александр, можно создать преднастроенную страницу с обычным текстовым полем, переключиться на код и добавить перед «layout» строку «"contentType": Terrasoft.ContentType.RICH_TEXT,», тем самым получить требуемый результат. При последующих правках в дизайнере страницы константа «Terrasoft.ContentType.RICH_TEXT» автоматически заменится на 4, это одно и то же.

define("UsrClientUnit_ca620a9", [], function() {
	return {
		entitySchemaName: "",
		attributes: {},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
		methods: {},
		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "STRING8ab3f912-5eb7-42a5-a397-1e2f1d9455b9",
				"values": {
					"contentType": 4,
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "Header"
					},
					"bindTo": "UsrString1",
					"enabled": true
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 0
			}
		]/**SCHEMA_DIFF*/
	};
});

В результате в параметр, который далее можно считать в БП, попадёт введенная строка, окружённая HTML-тегами: 

<div>Hello world!</div>

Но в реальной детали заметок есть ещё обработка вставляемых по кнопке картинок, реализованная в функции insertImagesToNotes из схемы GeneralDetails и в схеме NotesUtilities. Если она Вам важна, нужно вносить ещё доработки.

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

Добрый день. 

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

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

Все объекты хранятся в отдельном каталоге (не Custom), стоят чекеры "доступ по записям", "доступ по операциям", "Объект доступен на портале как раздел". В настройках доступа объекта прописаны пользователи и права.

Помогите пожалуйста, подскажите, что не так делаю.

 

Нравится

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

Раздел не появился вообще или нет данных в разделе? Проверьте полномочия на чтение данных для портальных пользователей.

Проверьте наполнение справочников "Список объектов, доступных пользователям портала" и "Список доступных полей объектов на портале". Почистите Redis и перезайти под портальным пользователем.

Раздел не появился вообще или нет данных в разделе? Проверьте полномочия на чтение данных для портальных пользователей.

Проверьте наполнение справочников "Список объектов, доступных пользователям портала" и "Список доступных полей объектов на портале". Почистите Redis и перезайти под портальным пользователем.

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

Добрый день!

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

Нравится

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

Добрый день!

У нас это реализовано следующим образом:

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

Добрый день!

У нас это реализовано следующим образом:

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

К тому же, надо помнить, что не только ответственные должны видеть все лиды, но и, например, ещё отдел маркетинга.



В Operation permissions создаём операцию CanReadLead и добавляем в неё роли. Затем в том же БП выдаём этим ролям права на чтение лидов.



И не забываем про права на редактирование.

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

gif_section_object_permissions_select_groups.gif

Зверев Александр пишет:

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

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

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

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

как правильно включить переводы названий полей, разделов в пакет? 

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

Как можно правильно включить эти переводы в пакет дабы перенести на продуктивную среду?

Нравится

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

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

Переводы хранятся в таблице SysTranslation, привязка данных осуществляется в разделе конфигурация -https://prnt.sc/w18hsw

https://prnt.sc/w18jq7

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

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

 

 

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

Переводы хранятся в таблице SysTranslation, привязка данных осуществляется в разделе конфигурация -https://prnt.sc/w18hsw

https://prnt.sc/w18jq7

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

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

 

 

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

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

Переводы которые были добавлены в разделе "переводы" попадут в ресурсы пакета. В ресурсы самого объекта они не попадут.

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

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

Нравится

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

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

В методе prepareCurrencyMenu мы биндим к своей функции "Click: {"bindTo": "on" + column + "CurrencyMenuItemClick"}". У меня мультивалютные колонки называются "NavDamageSize" и "NavSumCurrency", название методов "onNavDamageSizeCurrencyMenuItemClick", "onNavSumCurrencyCurrencyMenuItemClick" (изначально были другими). Название атрибутов должно быть "NavDamageCurrencyButtonMenuList" и "NavReqSumCurrencyButtonMenuList". Это особенности моей реализации.

Проще говоря, внимательно следите за названием методов и атрибутов.

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

В методе prepareCurrencyMenu мы биндим к своей функции "Click: {"bindTo": "on" + column + "CurrencyMenuItemClick"}". У меня мультивалютные колонки называются "NavDamageSize" и "NavSumCurrency", название методов "onNavDamageSizeCurrencyMenuItemClick", "onNavSumCurrencyCurrencyMenuItemClick" (изначально были другими). Название атрибутов должно быть "NavDamageCurrencyButtonMenuList" и "NavReqSumCurrencyButtonMenuList". Это особенности моей реализации.

Проще говоря, внимательно следите за названием методов и атрибутов.

Алексей Следь

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

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

Подскажите, как можно пакетно добавлять данные в деталь прилетающие со стороннего сервиса в виде json?

Нравится

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

Возможно эта статья Вам поможет https://academy.terrasoft.ru/documents/technic-sdk/7-16/funkcionalnost-…

Что Вы имеете в виду под «прилетающие со стороннего сервиса»? Вы можеете из БП на сайте 7.Х вызывать этот веб-сервис, а затем обработать полученную коллекцию данных, произвести вставку.

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

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

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

Возможно эта статья Вам поможет https://academy.terrasoft.ru/documents/technic-sdk/7-16/funkcionalnost-…

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