Вопрос

BPM 5.2 On-Site.
Как вывести перечисление на форму?

1. Создаю объекты типа Перечисление, например, Возраст со значениями Молодой, Средний и Пожилой.
2. Добавляю в объект Контакт это перечисление.
3. Вывожу на страницу редактирования контакта. Выводить пробовал и через элемент выпадающего списка и через переключатель - не отображает данных.

Что я делаю не так?

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

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

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

А как сделать выбор один из нескольких вариантов (переключатель) вместо списка?

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

Пример кода где-нибудь можно посмотреть?

В 5.4 PeriodicitySettingsPage. Только там скорее всего булевое поле и два радиобаттона для него.

вопрос сейчас очень актуальный, на скрине видно что я хочу сделать: http://joxi.ru/a9SfUxjKTJBIH7UgTy0

пробовл связать эти radiobutton с ценым значением и строковым в базе - не сохраняет и не отображает значения

Здравствуйте, Илья.

Как ранее говорила Ольга, пример работы с "radio-button'ами" есть в процессе страницы PeriodicitySettingsPage:

if (Page.OnceRadioButton.Checked && onceEdit.IsNull) {
	var clientId = onceEdit.ClientID;
	var messagePanelMessage = string.Format(ValueIsEmpty.Value, "{" + clientId + "}");
	baseMessagePanel.AddMessage(clientId, Warning, messagePanelMessage, MessageType.Warning);														
	isDataCorrect = false;
}
if (startDateTimeEdit.IsNull) {
	var clientId = startDateTimeEdit.ClientID;
	var messagePanelMessage = string.Format(ValueIsEmpty.Value, "{" + clientId + "}");
	baseMessagePanel.AddMessage(clientId, Warning, messagePanelMessage, MessageType.Warning);														
	isDataCorrect = false;
}
if (Page.CustomRadioButton.Checked) {
	if (customFromEdit.IsNull) {
		var clientId = customFromEdit.ClientID;
		var messagePanelMessage = string.Format(ValueIsEmpty.Value, "{" + clientId + "}");
		baseMessagePanel.AddMessage(clientId, Warning, messagePanelMessage, MessageType.Warning);														
		isDataCorrect = false;
	}
	if (customTillEdit.IsNull) {
		var clientId = customTillEdit.ClientID;
		var messagePanelMessage = string.Format(ValueIsEmpty.Value, "{" + clientId + "}");
		baseMessagePanel.AddMessage(clientId, Warning, messagePanelMessage, MessageType.Warning);														
		isDataCorrect = false;
	}
.......
}

Спасибо!

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

Иногда бывает необходимость получить название элемента перечисления в ходе интеграции с 1С. Например, если Вы планируете синхронизировать поле типа перечисление в 1С и справочник в TS.

Для этого можно использовать синтаксис 1С

Для 8.х:

var EnumName = 'ТипыКонтактнойИнформации';
var EnumIndex = Param.Obj1C.Перечисления[EnumName].Индекс(Select1C.Тип);
var Name = Select1C.Тип.Метаданные().EnumValues.Get(EnumIndex).Имя;

Для 7.7:

var Name = Select1C.Тип.Представление()

Поделиться

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

А можно так

var TypeName = Param.Obj1C.String(Select1C.Тип)

?

*где Param.Obj1C - COM-объект 1С;
Select1C - объект (объект 1С 'ВыборкаИзРезультатаЗапроса') содержащий текущую строку выборки из 1С

Спасибо, Максим :)

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

У меня в карточке договора есть поле типа "Перечисление". Мне нужно скрывать одно значение в этом поле для определенного типа договора. Как это сделать программно?

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

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

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

var ContrTypeIDDefault = 'Default'; 
var CurrentContrTypeID = '{3D51B409-B691-4F77-9723-359C65399AB4}';
 
var Initialized = false;
if (!Initialized) {
             var BaseEnum = Services.GetNewItemByUSI('enm_xxx');
             var EnumCache = {};
             EnumCache.ContrTypeIDDefault = BaseEnum;                               
             var EnumCacheItem = BaseEnum.CreateCopy();                                
             EnumCacheItem.Remove(EnumCacheItem.ItemsByCode('Code'));
             EnumCache.CurrentContrTypeID = EnumCacheItem;                      
             Initialized = true;
 }                  
var Item = EnumCache.CurrentContrTypeID;
if (Assigned(Item)&&(Dataset.Values('ContractTypeID') == CurrentContrTypeID)) {
             edtEnumControl.DataField.Enum = System.EmptyValue;	
             edtEnumControl.DataField.Enum = Item;                              
} else {
             edtEnumControl.DataField.Enum = System.EmptyValue;
	     edtEnumControl.DataField.Enum = EnumCache.ContrTypeIDDefault;
}

Спасибо, Наталья :twisted:. Ключевым для меня в вашем ответе было то, что нужно присваивать значение System.EmptyValue перед изменением списка значений в поле типа "Перечисление".

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

Подскажите, как в Террасофт работать с полем перечисления.
Например, я хочу проверить какое значение выбрано в поле перечисления. Мне для этого нужно сравнивать ID, Code или Caption?
Или как мне присвоить определенное значение этому полю: с помощью ID, Code или Caption?

Как будет удобнее всего и универсальнее?

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

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

"Кошкаров Андрей" написал:Или как мне присвоить определенное значение этому полю: с помощью ID, Code или Caption?

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

Так же ID

Вы используете EnumControl или EnumDataControl?

"Раловец Ольга" написал:Вы используете EnumControl или EnumDataControl?

EnumDataControl

Так обращайтесь не к элементу управления, а к соответствующему полю датасета по имени поля (полю указнному в DataFieldName EnumDataControl-a). В этом поле хранится ID записи.

"Раловец Ольга" написал:Так обращайтесь не к элементу управления, а к соответствующему полю датасета по имени поля (полю указнному в DataFieldName EnumDataControl-a). В этом поле хранится ID записи.

Я так и делаю. Вопрос был в другом. Как мне проверять значение этого поля и присваивать ему какое-то другое значение.
"Кулак Олег" написал:По ID

Хорошо, так и сделаю. Просто я думал, что возможно есть такая возможность по значению Code делать сравнение и присвоение.
Что-то типа:
if (EnumItem.Code == co_FIFO)
или
EnumItem.Code = co_Expensive

По ID не видно, какое значение используется, а по Caption - есть вероятность изменения этого значения. По Code было бы самым оптимальным:
- значение не меняется
- понятно о каком значении идет речь

А для этого, Вам нужно будет подключить перечисление к скрипту!

--
www.it-sfera.com.ua

"Виталий Ковалишин aka samael" написал:А для этого, Вам нужно будет подключить перечисление к скрипту!

А как это делается?

"Кошкаров Андрей" написал:Я так и делаю. Вопрос был в другом.

Включаете перечисление в скрипт и пишите

if (dlData.Dataset.Values('FieldName') ==  co_FIFO){
 //Do somthing
}

Ольга правильно ответила, Вы просто не поняли.

Upd: Хотя на самом деле почти правильно :)

я еще вот такую возможность нашел:

if (DataField.ValAsEnumItem.Code == 'co_FIFO') {
 // some code
}

Спасибо всем за помощь, теперь у меня ясность по этому вопросу.

"Underscore a.k.a. _" написал:Upd: Хотя на самом деле почти правильно :)

Поправьте меня, пожалуйста, что именно не правильно.

Вы не сказали, что нужно включить перечисление в скрипт. А вот Виталий об этом не забыл :)

"Underscore a.k.a. _" написал:Вы не сказали, что нужно включить перечисление в скрипт

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

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

Добрый день!

Необходима помощь знающих людей в следующем вопросе:

на карточке редактирования есть два поля. Первое поле типа справочник. При выборе значения в первом поле необходимо заполнить выпадающий список для второго поля, что бы пользователь смог выбрать только определенные значения. Значения для списка второго поля вычисляются в коде. Они не постоянны, поскольку один из элементов вычисления имеет переменное значение.
Идеальным вариантом был бы мемори датасет, но не получилось привязать его к контролу EnumDataControl.
Так же есть идея заполнять сервис Enum динамически в коде, возможно ли это?
Или есть другой вариант решения задачи?

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

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

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

http://terrasoft.com.ua/sdk/
IEnumExample.js - пример динамического заполнения перечисления.

спасибо!

Подскажите, пожалуйста, а можно добавлять/удалять элементы у сервиса Enum через код перед его открытием (ShowSelectEnumItemWindow(EnumUSI))? Мне это сделать не удалось. Наверно, что-то не так делаю.

www.informicus.ru

Конечно можно, IEnum в SDK посмотрите.
Что именно не удалось ?

1) Создала сервис Enum без значений.
2) далее заполняю и вызываю его следующим образом в коде:

var enm_ShowsForDay = Services.GetNewItemByUSI('enm_ShowsForDay');
	for (var i = 1; i <= 13; i++) {
	    var EnumItem = enm_ShowsForDay.CreateItem();
	    EnumItem.ID = EnumItem.Code = 'TranslationsPerBlock_' + i;
	    EnumItem.Caption = i;
	    enm_ShowsForDay.Add(EnumItem);
	}
 
	try{
		var TrsPerBlock = parseInt((ShowSelectEnumItemWindow('enm_ShowsForDay')).ResultValue.Caption);
	}
	catch (e){
		return false;
	}

но список оказывается пустым при открытии перечисления.

www.informicus.ru

Разобралась сама.
В функции ShowSelectEnumItemWindow просто заново объект создавался.

var Enum = Services.GetNewItemByUSI('EnumUSI');

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

www.informicus.ru

Кстати перечисления кажется по GetSingleItemByUSI получать надо.

"Underscore a.k.a. _" написал:Кстати перечисления кажется по GetSingleItemByUSI получать надо.

Почему?
GetSingleItemByCode ()
Services.GetNewItemByUSI()

"Раловец Ольга" написал:Почему?
GetSingleItemByCode ()
Services.GetNewItemByUSI()

Прошу прощения, я Вас не совсем понял :)
Я хотел сказать что перечисления как и таблицы получаем с помощью метода GetSingleItemByUSI объекта Services.

Я всегда считала, что правильно Services.GetNewItemByUSI(), но похоже и Services.GetSingleItemByUSI() тоже работает.

:redface:

Но я надеюсь Вы осознаете и исправитесь :) На самом деле немного стыдно, два раза подряд Вас так ткунуть. Но это было сильнее меня :)

"Underscore a.k.a. _" написал:На самом деле немного стыдно, два раза подряд Вас так ткунуть

Что Вы, напротив, я ценю конструктивную критику.

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