Вопрос

Коллеги, как запретить добавлять новые города пользователям (в том числе и System adminsitator'ам) через такую прекрасную функциональность, как Создать в Lookup?

Это относится не только к городам, просто, как самый яркий пример.

Если честно, пользователи жмут, не думая. Потом чистить надоедает.

 

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

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

Добрый день, Владимир!

Данная логика настраивается на уровне системной операции с кодом "CanManageLookups". На детали "Доступ к операции" удалить те пользователи или роли, у которых нужно забрать права на данную функциональность. После этого не будет появляется кнопка «Создать» в самом поле страницы, если такой записи еще нет в справочнике. Минусом данного варианта является тот момент, что у пользователей не будет доступа к разделу "Справочники", так как это взаимосвязанный функционал. 

в LookupQuickAddMixin закомментировать или изменить строчку:

config.objects[Terrasoft.GUID_EMPTY] = this.getNewListItemConfig(config.filterValue);

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

upd. меня опередили) в принципе совет сверху тоже подойдет, ибо там же в init стоит проверка 

RightUtilities.checkCanExecuteOperation({
	operation: "CanManageLookups"
}

 

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

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

Борис Леонов пишет:
вкратце о тотальных проблемах замещения модуля

Resources. это вкратце.

Подробнее: замещаем схему (модуля). копируем туда подчистую код. 
1) отсутствует вкладка less. надо модуль сохранить, перезайти заново и только тогда она появится
2) локализ. строки - они есть, но их нет. В буквальном смысле. Приходится перед всеми строками ставить точку, сохранять, потом убирать точки и пересохранять
3) с картинками такая же фигня как и со строками. Только ещё хуже - картинки приходится вытаскивать через браузер и перевставлять. Про то, что некоторые иконки иногда не отображаются, а вытащить их надо я промолчу (где-то в недрах форума валяется инструкция как по ссылке и названию вытащить ресурс).
4) все messages нужно перевбивать. руками. good luck have fun
мб что-то ещё. уже не помню)

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

очень сильно вкратце :)

Борис Леонов пишет:
очень сильно вкратце :)

 расписал) ух как горит пятая точка - проблемы не могут исправить 2 год как

Адасюк Валерий Викторович пишет:
Данная логика настраивается на уровне системной операции с кодом "CanManageLookups"

У меня ощущение, что на города это не действует. Кроме того, эта логика останется на Контрагенты, Контакты и другие Lookup-поля, которые ссылаются не на Справочники, а на Разделы 

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

ценная инфо, спасибо!

это не всегда происходит, случайным образом?

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

Борис Леонов,

Всегда, при замещении модуля. при замещении простых page и section(к примеру) всё отлично.

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

еще раз спасибо за информацию!

Радикальный вариант — пустым INSTEAD OF INSERT триггером на таблице городов. Или такой же логикой на уровне БП при добавлении записей в этой таблице.

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

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

Пытаюсь реализовать сортировку справочного поля типа ENUM.

attributes: {
			"LeadType": {"isRequired": false},
			"Stage": {
				"lookupListConfig": {
					"filters": [
						function() {
							var filterGroup = Ext.create("Terrasoft.FilterGroup"), {
								sortProperty: "Number"
							});
							filterGroup.add("ActiveStage",
								Terrasoft.createColumnFilterWithParameter(
									Terrasoft.ComparisonType.EQUAL,
										"UsrShowInMiniPage", "1"));
							filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
							filterGroup.add("Sort",
								Terrasoft.createColumnFilterWithParameter(
									Terrasoft.ComparisonType.GREATER_OR_EQUAL,
										"Number", "0"));
							return filterGroup;
 
						}
					]
				}
			}
		},

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

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

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

А если вот так?

"Stage": {
	"lookupListConfig": {
		"filters": [
			function() {
				var filterGroup = Ext.create("Terrasoft.FilterGroup"), {
					sortProperty: "Number"
				});
				filterGroup.add("ActiveStage",
					Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.EQUAL,
							"UsrShowInMiniPage", "1"));
				filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
				filterGroup.add("Sort",
					Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.GREATER_OR_EQUAL,
							"Number", "0"));
				return filterGroup;
 
			}
		],
		"columns": ["Number"]
	}
}

 

Добрый день.

Добавьте свойство orders в lookupListConfig. К примеру:

"Owner": {
    lookupListConfig: {
        columns: ["Name"],
        orders: [
            {
                columnPath: "Name",
                direction: Terrasoft.OrderDirection.DESC
            }
        ]
    }
},

Терещук Сергей,

Сортировка таким образом не работает. Ни при указании колонки "Name", ни при какой-либо другой колонки. Direction также не влияет на порядок отображения

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

Сортировка также не работает, тем не менее, колонка "Number" добавляется в ответ от сервера

del

 

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

Подскажите, пожалуйста, возможно ли в конфиге отфильтровать набор данных для Lookup по определенному полю. В моем случае - "BTNumber".
Вот текст конфига:
var config = {
entitySchemaName: "BTVwPCManifest",
multiSelect: true
};

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

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

Разобралась самостоятельно :exclaim:
Возможно, кому-то пригодится эта информация.

Это можно реализовать таким образом:
var config = {
entitySchemaName: "BTVwPCManifest",
multiSelect: true,
sortedColumns: [{
name:"BTNumber",
orderPosition: 0,
orderDirection: Terrasoft.OrderDirection.ASC
}]
};

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

Добрый день.
Версия 7.9

Кейс был такой: Нужно создать деталь с полем справочник (у меня это "UsrStore") c ссылкой на объект "Остаток продукта".

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

1)

Uncaught iargumentName: ""__proto__: constructor$className: "Terrasoft.exceptions.ArgumentNullOrEmptyException"alternateClassName: "Terrasoft.ArgumentNullOrEmptyException"argumentName: nullconfig: e__proto__: Objectconstructor: function ()__proto__: Objectconstructor: function Object()hasOwnProperty: function hasOwnProperty()isPrototypeOf: function isPrototypeOf()propertyIsEnumerable: function propertyIsEnumerable()toLocaleString: function toLocaleString()toString: function toString()valueOf: function valueOf()__defineGetter__: function __defineGetter__()__defineSetter__: function __defineSetter__()__lookupGetter__: function __lookupGetter__()__lookupSetter__: function __lookupSetter__()get __proto__: function __proto__()set __proto__: function __proto__()configMap: Object__proto__: ObjectinitConfigList: Array(0)length: 0__proto__: Array(0)initConfigMap: Objectmessage: "Несуществующий или пустой аргумент"self: function i()superclass: constructortoString: function ()__proto__: constructor
/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
title="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
>a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-...">http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-... line: 846
 column: 295
 message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент
 date: Fri Mar 24 2017 11:05:50 GMT+0200 (Финляндия (зима))
 stack: undefined
writeErrorMessage @ /core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579

2)

LookupPageViewModelGenerator.js:284 Uncaught i {argumentName: ""}argumentName: ""__proto__: constructor
addColumn @ all-combined.js:846
addColumn @ all-combined.js:939
(anonymous) @ LookupPageViewModelGenerator.js:284
Terrasoft.utils.array.each @ all-combined.js:225
addSelectColumns @ LookupPageViewModelGenerator.js:282
Terrasoft.each.scope @ LookupPageViewModelGenerator.js:273
Terrasoft.utils.array.each @ all-combined.js:225
getSelect @ LookupPageViewModelGenerator.js:271
loadData @ LookupPageViewModelGenerator.js:344
load @ LookupPageViewModelGenerator.js:73
(anonymous) @ /0/configuration/fec43bee7d1bd6fa3769ce764f5b8168ru-RU/LookupPage.js:176
(anonymous) @ /0/configuration/fec43bee7d1bd6fa3769ce764f5b8168ru-RU/LookupPage.js:284
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457

3)

/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
title="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
>a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-...">http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-... line: 846
 column: 295
 message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент
 date: Fri Mar 24 2017 11:11:48 GMT+0200 (Финляндия (зима))
 stack: undefined
writeErrorMessage @ /core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579
(anonymous) @ /core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:740
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457

4)

/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
title="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
>a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-...">http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-... line: 846
 column: 295
 message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент
 date: Fri Mar 24 2017 11:11:48 GMT+0200 (Финляндия (зима))
 stack: undefined

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

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

По ошибкам сложно понять в чем дело, напишите в поддержку, с предоставлением доступа к сайту:
support@terrasoft.ru
Пусть посмотрят и исправят на месте.

Ок. Спасибо.

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

Здравствуйте.
Версия 7.9.2

Необходимо в карточке CallMessagePublisherPage отфильтровать поле Contact по Контрагенту и изменить тип поля на ENUM

Фильтр реализовал в lookupListConfig атрибута Contact:

"Contact": {
   "isLookup": true,
   "lookupListConfig": {
     "columns": ["Account"],
     "filter":  function() {
       var filters = Ext.create("Terrasoft.FilterGroup");
       var listenerInfo = this.getListenerRecordData();
       if (listenerInfo.relationSchemaName === "Account" &&
          !Ext.isEmpty(listenerInfo.relationSchemaRecordId)) {
            var accountFilter = this.Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL,
                "Account",
                listenerInfo.relationSchemaRecordId);
            filters.add("AccountFilter", accountFilter);
        }
       return filters;
     }
   }
}

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

В чем причина такого поведения?

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

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

"Коновалов Игорь" написал:В чем причина такого поведения?

Попробовал на тестовой 7.9.1 - всё воспроизводится, проверил на 7.8.0 у клиента (мы там ему enum поле фильтровали в активности) - там всё идеально работает, фильтруется через lookupConfig.

Помнится когда начинал изучать bpm, то столкнулся с подобной проблемой. Спросил у ТП, ребята говорят: "переопределяйте change и prepareListConfig" при описании контрола (что дико неудобно)

Вывод: хрен знает как оно вообще работает ¯\_(ツ)_/¯

Вам стоит смотреть в сторону добавления свойства orders в lookupListConfig. К примеру:

"EmployeesNumber": {
	lookupListConfig: {
		orders: [{columnPath: "Position"}]
	}
}

"Мотков Илья" написал:

Вам стоит смотреть в сторону добавления свойства orders в lookupListConfig. К примеру:

"EmployeesNumber": {
        lookupListConfig: {
                orders: [{columnPath: "Position"}]
        }
}

Илья, здравствуйте.
Мне не нужна сортировка. Нужна фильтрация выпадающего списка.
Я использую стандартное свойство filter в lookupListConfig.

Прошу прощения. Неправильно прочитал. Как вариант, есть возможность заполнять выпадающий список значениями вручную при помощи свойства prepareList.

"Мотков Илья" написал:

Прошу прощения. Неправильно прочитал. Как вариант, есть возможность заполнять выпадающий список значениями вручную при помощи свойства prepareList.


Т.е. стандартная фильтрация для справочных полей при использовании выпадающих списков, начиная с 7.9, не работает?

Игорь, фильтрация выпадающих списков через lookupListConfig отрабатывает в 7.9.2. Проблема заключается в том, что логика работы с свойством filters прописана в BasePageV2(NUI). Схема CallMessagePublisherPage не наследуется от BasePageV2.

Вам стоит смотреть в сторону копирования части логики из BasePagev2 в Вашу схему.

Да, спасибо. Уже реализовал через prepareList

Войдите или зарегистрируйтесь, чтобы комментировать
Идея
При установке системной настройки [Тип сравнения для строковых колонок] = 1 хотелось бы, чтобы во всех lookup-полях это тоже работало бы без знака %.Иначе, пользователям всё равно приходится использовать знак %, что усложняет работу.
Одобрена
3 комментария

Здравствуйте, Владимир!

Для решения данного вопроса необходимо заместить схему LookupPageViewModuleGenerator. В данной схеме есть метод pushSelectFilters. Именно этот метод отвечает за тип поиска. В базовой версии тип поиска START_WITH. В замещающей схеме Вам необходимо заменить тип поиска на CONTAIN.

"Мотков Илья" написал:В замещающей схеме Вам необходимо заменить тип поиска на CONTAIN.

Уже хорошо! Спасибо!

"Мотков Илья" написал:Именно этот метод отвечает за тип поиска

Останется как нибудь забиндить тип поиска на системный параметр и будет вообще красиво все :)

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

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

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

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

Возьмите за пример событие dlDataOnDatasetDataChange для поля AccountID, источника данных dlData, окна редактирования wnd_ContactEdit. В событии происходит вызов функции FillInformationBySelectedItem - которая заполняет поля по определенному правилу (фильтру).

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

Здравствуйте!
Есть задача добавить поле с выпадающим списком(наполнение справочника), значение которого будет является быстрым фильтром для реестра справочников.
Отображаться данная страница справочника будет всего в одном месте (в процессе).
Также необходимо добавить некоторую логику на возможность выбора/отмены выбора значений в реестре справочника и кастомные стили.

Подскажите пожалуйста, как лучше реализовать данную задачу?

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

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

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

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

Здравствуйте. Насколько мне известно у автогенерируемых страниц весьма урезанный функционал.
Поле добавить можно, но вот расширить функционал LookupPage - нет.

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

Также при изменении типа должна отрабатывать фильтрация.

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

В таком случае Вам необходимо использовать элемент "Преднастроенная страница".

Естественно, страницу, ссылающуюся на города, придется создать.

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

Здравствуйте! Пример создание преднастроенной страницы для процесса описан

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

Вам необходимо
1) создать страницу редактирования
2) унаследоваться от LookupPageV2
3) добавить на страницу поле "Тип продукта", которое будет смотреть в соответствующий справочник
4) добавить фильтрацию по значению в этом поле (для отображения записей, соответствующих значению в этом поле)
5) добавить мультивыбор. Пример реализации рекомендую посмотреть ActivityParticipantDetailV2, метод openContactLookup (выбор контакта) и addCallBack (добавления выбранных записей на деталь. В Вашей задачи решение, скорее всего будет другим, например, запись в параметр страницы).
6) Обработка заданного параметра дальнейшими элементами процесса.

Войдите или зарегистрируйтесь, чтобы комментировать
Идея
По аналогии с подсказками можно сделать всплывающее описание в полях и колонках Lookup (с возможностью кастомизировать). Таким образом без перехода по карточкам можно будет видеть основную информацию по связанным объектам, что ускорит и упростит работу с системой
Реализована
7 комментариев

т.е. мини карточки? :smile:

"Андросов Дмитрий" написал:т.е. мини карточки?

о, а где это?

Упс, видимо, именно там, где искал, этого нет - в поле "заказ" :)

Добрый день!

Спасибо за идею.
Данная функциональность уже запланирована для реализации в последующих версиях. Функционал будет доступен уже в версии 7.9, и по возможности, даже уже в 7.8.

"Адасюк Валерий Викторович" написал:Данная функциональность уже запланирована

я надеюсь это будет настраиваться где-нибудь в diff'ах или lookupConfig'ах

"Андросов Дмитрий" написал:я надеюсь это будет настраиваться где-нибудь в diff'ах или lookupConfig'ах

Лучше один раз настроить для раздела, чем для каждого поля в каждой карточке отдельно

"Владимир Соколов" написал:Лучше один раз настроить для раздела, чем для каждого поля в каждой карточке отдельно

одно другому не мешает)

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

Спасибо за улучшение функционала лукапных полей в 7.5:можно перейти к записи и очистить кликом но давайте пойдем еще дальше и добавим возможность добавлять записи в справочный раздел (например Контакты) прямо из поля. Добавьте какой-нибудь плюсик, тем более, что на крестик вы уже решились

Реализована
9 комментариев

а зачем добавлять из поля, когда мы еще не знаем - нашли или нет?

Дмитрий, Вы тоже можете пойти дальше и предложить реализацию)) Тем более, исходники контролов открыты (лежат по пути ..\Terrasoft.WebApp\Resources\ui\Terrasoft\controls\) и в конфигурации можно создавать свои контролы на основе существующих. Если надо - могу поделиться примерчиком.

"Андрей Каспаревич" написал:конфигурации можно создавать свои контролы на основе существующих

еще не дошел до этих задач, но в планах есть. Примеры были бы кстати))

"Владимир Соколов" написал:а зачем добавлять из поля, когда мы еще не знаем - нашли или нет

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

Дмитрий, прилагаю пример. Это контрол с маской ввода, основанный на TextEdit. Не скажу, что он отлично работает, но в качестве примера подойдет.
tsc.multimaskedit.zip
Использование:

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "merge",
		"name": "MobilePhone",
		"values": {
			"controlConfig": {
				"className": "Terrasoft.MultiMaskEdit",
				"mask": {
					"bindTo": "getPhoneMask"
				},
				onBeforePasteFormatValue: this.getDigitsFromString
			}
		}
	}
]/**SCHEMA_DIFF*/,
methods:
{
	getDigitsFromString: function(value) {
		return value.replace(/\D/g, "");
	},
	getPhoneMask: function() {
		return {
			formats: ["+7(999)999-99-99"]
		}
	}
}

Спасибо, Александр!

??

Виноват) перепутал
Спасибо Андрей!

Так то))

Андрей Каспаревич, Большое спасибо!

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