Добрый день!

Создала в бп преднастроенную страничку. Зашла в конфигурации в схему данной странички и изменила тип данных дробных полей. При сохранении изменения на странице не применились.

В связи с этим вопрос: как настроить типы дробных полей, а именно, указать тип данных 0,0001 и 0,1. 

Буду благодарна за совет.

Нравится

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

Попробуйте открыть эту страницу в конфигураторе (action -> source code), затем найти требуемый параметр и поставить ему нужный тип данных.

Попробуйте открыть эту страницу в конфигураторе (action -> source code), затем найти требуемый параметр и поставить ему нужный тип данных.

Трефилов Павел Сергеевич,

Павел, спасибо, я эти действия сделала в самом начале и никаких изменений не произошло. Ранее данные действия выполнялись без проблем. Видимо, в последних версиях такая функциональность исчезла или это баг. Закрыла вопрос применением кода в Diff. Помогли коллеги :-)

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

Коллеги, здравствуйте. 

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

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

Заранее спасибо!

 

Нравится

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

Здравствуйте, Роман!

Бизнес-процес для вашей ситуации может выглядеть следующим образом (скриншот 1):

1.Для запуска БП, начальным событием будет сигнал от обьекта, в нашем случае это "Добавление нового контрагента" (скриншот 2);

2.С помощью действия системы [Изменить данные], мы ищем нашего нового контрагента по Id, и устанавливаем ему 

значение поля "Тип контрагента" - Клиент (скриншот 3).

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

Для этого Вам нужно:

1. Перейти в [Управление конфигурацией](скриншот 4);

2. Выбрать вкладку [Конфигурация];

3. Дальше [Схемы]-[Добавить]-[Замещающий обьект] (скриншот 5);

4. В Структуре выбрать "UsrEntity1", в свойствах [Родительский обьект] указать "Контрагент" (скриншот 6);

5. Затем в структуре перейти на вкладку [Type] - [Поведение]-[Значение по умолчанию]-[Установить константу] и в поле выбора значения

выбрать неоходимое (скриншот 7).

Роман,

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

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

Добрый день!

Имеется несколько типов контрагентов, для каждого из которых создана страница со своей логикой.
Естественно, что не все пользователи имеют право создавать Поставщиков, Агентов и уж тем более Нашу компанию.
Скорее всего, необходимо создать функциональные роли: Agent manager, Vendor manager и т.п.

Но как в зависимости от функциональных ролей скрывать или показывать пункты меню Add?
Add Account

Нравится

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

В данной ситуации вижу 2 выхода:
1. Попробовать назначить права на объект "Тип контрагента". Как вариант ESQ не будет возвращать тип КА без разрешения на него и он не будет отображаться в кнопке.
2. Изменить логику в странице реестра контрагентов. Проверять к какой роли относится текущий пользователь и добавлять доступные для роли типы КА.

"Царьков Сергей Вячеславович" написал:1. Попробовать назначить права на объект "Тип контрагента". Как вариант ESQ не будет возвращать тип КА без разрешения на него и он не будет отображаться в кнопке.
2. Изменить логику в странице реестра контрагентов. Проверять к какой роли относится текущий пользователь и добавлять доступные для роли типы КА.

1-й вариант не подойдёт, так как пользователь должен видеть другие типы, но не создавать их.

А в какой схеме прописывается эта логика реестра контрагентов?

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

Мне кажется, лучше не привязвавться к конкретной роли, а создать новую операцию (в «Права доступа на операции», таблица SysAdminOperation), выдать пользователю или роли права на эту операцию, и в коде страницы уже запрограммировать проверку на наличие права.

Логику, скорее всего, менять на странице AccountSectionV2, но надо смотреть.

"Владимир Соколов" написал:

А в какой схеме прописывается эта логика реестра контрагентов?


Логика действительно меняется на странице AccountSectionV2. Но копнуть нужно глубже - на странице BaseSectionV2 в diff есть объявление кнопки

{
"operation": "insert",
"name": "SeparateModeAddRecordButton",
"parentName": "SeparateModeActionButtonsLeftContainer",
"propertyName": "items",
"values": {
	"itemType": Terrasoft.ViewItemType.BUTTON,
	"style": Terrasoft.controls.ButtonEnums.style.GREEN,
	"caption": {"bindTo": "AddRecordButtonCaption"},
	"click": {"bindTo": "addRecord"},
	"classes": {
		"textClass": ["actions-button-margin-right"],
		"wrapperClass": ["actions-button-margin-right"]
	},
	"controlConfig": {
		"menu": {
	        	"items": {
				"bindTo": "EditPages",
				"bindConfig": {
					"converter": function(editPages) {
					if (editPages.getCount() > 1) {
					return editPages;
					} else {
					return null;
					}
				}
			}
		}
	}
}
}
},

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

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

Добрый день!

Очень не удобно накидывать заново все "базовые" данные при настройке страниц Мастера (в зависимости от Типа записи). Почему нельзя было (не только колонку "Название", а ) сразу набор "базовых" данных закинуть на страницу нового Типа?

Нравится

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

И еще неудобнее copy-paste логику, программируя фильтрацию и прочие вещи для каждого типа

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

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

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

Сказано красиво, но не ясно будет ли какой-то результат?

Мы делаем так:
1) редактируем базовую страницу в Мастере (получаем replacing page).
2) создаем пустые страницы с типами
3) меняем у созданных страниц родительский объект на страницу объекта
4) общие вещи меняем у страницы, созданной в 1-м пункте
5) уникальные вещи меняем (а вся функциональность уже есть) у страниц, созданных во 2-3 пунктах.

Пока работает, но немного стрёмно :)

"Владимир Соколов" написал:

Мы делаем так:

1) редактируем базовую страницу в Мастере (получаем replacing page).

2) создаем пустые страницы с типами

3) меняем у созданных страниц родительский объект на страницу объекта

4) общие вещи меняем у страницы, созданной в 1-м пункте

5) уникальные вещи меняем (а вся функциональность уже есть) у страниц, созданных во 2-3 пунктах.

Пока работает, но немного стрёмно :)

Один из возможных вариантов решения.

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

bpm'online sales enterprise версия 7.6.0.
В данной версии при добавлении нового товара можно ли добавить тип продукта? Допустим у меня интернет магазин и в продаже из типовых продуктов имеются крупная, мелкая бытовая техника и т.д. А в в списке имеется только антивирусы и продукты связанные только с компьютерным обеспечением. Есть ли возможность добавить туда продукты другого типа?

Нравится

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

Дмитрий, подробный ответ с ссылками по данному вопросу предоставлен в посте http://www.community.terrasoft.ru/forum/topic/12590#comment-53498

"Адасюк Валерий Викторович" написал:
<

Благодарю

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

Добрый день! Помогите решить задачу: В карточке продаж есть колонка(Тип) в зависимости от её состояния нужно скрывать колонки, а лучше групповой элемент в которых эти колонки находятся!
Допустим при создании продажи я выбираю в колонке Тип -->состояние Автозалог и в этот момент групповой элемент Договор исчезает, а в место него появляется групповой элемент Автозалог и колонками которые уже были ранее туда добавлены
Подскажите пожалуйста как это реализовать!
Где искать id групового елемента и где создавать скрипт? AfterPageLoad в карточке редактирования продаж (Base) нельзя! Вообщем подскажите пожайлуста как это реализовать! если есть возможно то прикрепите инструкцию!Заранее спасибо

Нравится

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

Добрый день,

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

if (Page.TypeEdit.Value == 'ID типа продажи') {
Page.MyControlLayout.Hidden = true;
} else {
Page.MyControlLayout.Hidden = false;
}

Большое спасибо за инф. Но есть еще один вопросик, а если мне нужно скрывать разные контролы!
Как указать какой именно я хочу скрыть?
Допустим у меня 2 групповых элемента!
И да дело еще в том что в базовой карточке нельзя нечего редактировать!

Это к 5 версии ? Вроде можна просто не можно удалять, а спрятать можно,скрыть: Page.NameControl.Visible = true/false, если 7 то создаешь замещающию страницу, а спрятат как посмотри тут

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

Добрый день.
По умолчанию при создание новой продажи, поля "Тип" и "Состояние" заполняются по умолчанию, как это можно убрать? Нужно, чтобы при создание новой продажи, эти поля были пустыми.

Нравится

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

В ds_OpportunityScript есть функция SetDefaultDatasetValues. Возможно, это происходит там.

Чтобы отключить заполнение поля "Состояние", необходимо изменить функцию SetDefaultDatasetValues сервиса ds_OpportunityScript таким образом (закомментированный код):

function SetDefaultDatasetValues(Dataset) {   
	var Today = GetTodayDate();
	var StartDate = Today.getVarDate();
	var ActualCloseDate = AddDateDays(Today, 7).getVarDate();
	Dataset.DisableEvents();
	try {
		Dataset.ValAsDateTime('StartDate') = StartDate;
		Dataset.ValAsDateTime('ActualCloseDate') = ActualCloseDate;
		Dataset.Values('OwnerID') = Connector.CurrentUser.ContactID;
		var OpportunityDefs = GetOpportunityDefs();
		var StatusID = OpportunityDefs.StatusID;
		/*if (!IsEmptyGUID(StatusID)) {
			Dataset.Values('StatusID') = StatusID;
		}*/	
		var RatingID = OpportunityDefs.RatingID;
		if (!IsEmptyGUID(RatingID)) {
			Dataset.Values('RatingID') = RatingID;
		}
	} finally {
		Dataset.EnableEvents();
	}
	Dataset.Values('CurrencyID') = GetBasicCurrencyID(); 
}

Чтобы отключить заполнение поля "Тип", необходимо добавить в функцию wnd_OpportunityEditOnPrepare сервиса wnd_OpportunityEditScript строку кода:

function wnd_OpportunityEditOnPrepare(Window) {
	Initialize(Window);
	wnd_BaseDBEditOnPrepare(Window);
	var Dataset = BaseDBEdit.Dataset;
/* MODULE WORKFLOW */
	if (Dataset.State == dstInsert) {
//Добавить эту строку
		Dataset.Values('TypeID')= null;

Спасибо большое, задача решена.

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

Добрый день!

В новой для меня области начинают возникать различные вопросы...
Имеется задача: в разделе используется 5 типов например продуктов. Для двух из них нужно в карточке отобразить дополнительные пару полей.
Если пользоваться базовым функционалом, то мы создаем нужное количество карточек (в данном случае 5) для каждого типа, на основании одной базовой, содержащей все прочие поля. Далее в каждой карточке для каждого типа добавляем индивидуально дополнительные поля.
Далее в настройке Рабочих мест к разделу в деталь "Карточки редактирования" добавляем все 5 карточек для каждого типа отдельно. Все работает.

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

Нравится

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

Кстати, вдогонку...
Гуру, подскажите для bpm-чайника стоит ли связываться и как проще сделать традиционное скрытие/показ контролов на карточке? Или такой метод будет идеологически совсем неправильным?

Александр, добро пожаловать в BPMonline :) На какой это версии? Думаю, стоит подправить базовую логику, чтобы название пункта меню формировалось как название типа + карточка.
Мы скрываем элементы управления используя метод public virtual void SetVisible(bool visible), он управляет видимостью с помощью выполнения скрипта на клиенте. и это быстрее, чем управлять видимостью меняя свойство public virtual bool Hidden, хотя так тоже можно.

Это версия 5.3.0.332
Базовая логика - с непривычки боязно, я буду бороться с этим страхом, обещаю;) настораживает, что это название потом может использоваться для подъема карточки, передаваясь куда-то. Соответственно править надо и его, почва для исследования есть.

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

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

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

1. Откройте сервис карточки окна редактирования контрагента wnd_AccountEdit;
2. Выберите поле, Которое планируется скрывать в зависимости от типа, и скопируйте его название:

01

По имени поля мы будем обращаться к нему из скрипта, меняя свойство IsEnabled:

edtField.IsEnabled = true;

3. Откройте запрос справочника Тип контрагента sq_AccountType.
Нажмите просмотр запроса

02

Затем выполнить запрос:

03

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

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

if (Dataset('AccountTypeID') ==  '{2229B3B7-9210-4B3A-AAAD-2A4168678CA1}'){
edtField.IsEnabled = true;
edtField.IsVisible = true;
}else{
edtField.IsEnabled = false;
edtField.IsVisible = false;
}

4. Вставлять данный программный код нужно в двух местах:
- на открытие карточки
- на изменение значения поля Тип

Откройте скрипт карточки редактирования контрагента scr_AccountEdit и найдите функцию function wnd_AccountEditOnPrepare(Window)

04

В конец функции вставьте следующий программный код:

               if (dlData.Dataset('AccountTypeID') ==  '{2229B3B7-9210-4B3A-AAAD-2A4168678CA1}'){
                               edtField.IsEnabled = true;
                               edtField.IsVisible = true;
               }else{
                               edtField.IsEnabled = false;
                               edtField.IsVisible = false;
               }

06

Найдите функцию function dlDataOnDatasetDataChange(DataField) и добавьте в нее следующий программный код:

               if(FieldName == 'AccountTypeID'){
                               if (Dataset('AccountTypeID') ==  '{2229B3B7-9210-4B3A-AAAD-2A4168678CA1}'){
                                               edtField.IsEnabled = true;
                                               edtField.IsVisible = true;
                               }else{
                                               edtField.IsEnabled = false;
                                               edtField.IsVisible = false;
                               }
               }

07

5. Сохраните и закройте скрипт. Перезапустите Terrasoft.

В результате поле Отрасль будет отображаться только для контрагентов с типом Партнер.

Нравится

Поделиться

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

GUID хорошо выносить в константы (scr_Consts).

Кроме IsVisible и IsEnabled может понадобиться edtField.DataField.IsRequired.

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

...
edtField.IsVisible = Dataset('AccountTypeID') == '{222...8CA1}';
edtField.IsEnabled = Dataset('AccountTypeID') == '{222...8CA1}';
...

+1 к предыдущему, но ещё я в декоративных целях добавляю скобки:

edtField.IsVisible = (Dataset('AccountTypeID') == '{222...8CA1}');

Это повышает читаемость, особенно в сложных условиях:

edtField.IsVisible = (Dataset('AccountTypeID') == '{222...8CA1}') || (Dataset('AccountTypeID') == '{333...8CB2}')

Коллеги, благодарю!
В случае, если значений много, действительно гораздо функциональнее будет такая конструкция :)

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

Хочу выводить деталь проекта только для определенного условия

function dlProjectOnDatasetAfterPositionChange(Dataset) {
    if ((Dataset.Values('EssenceType') == 'Work') &&
            (Dataset.Values('TypeID') == '{1142CDEE-FA70-4CB6-8DBC-20C7F68B71BB}') &&
                (Dataset.Values('OfferingTypeID') == '{FCB4DC72-C668-46C8-8BFF-E6ABA7FD9411}')) {
...

выдает ошибку: Поле 'Тип' не активно
почему выскакивает такая ошибка? и как можно решить данную задачу?

Нравится

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

В sq_Project у колонки EssenceType поставьте флажок "Всегда выбирать в запросе"

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

"Штинов Антон Викторович" написал:

Запрос по проектам с юнионом идет. В юнионе тоже должна быть выбрана эта опция для указанных полей.

Лучше использовать GetFieldValueFromDisabledField(Dataset, FieldName).

"Раловец Ольга" написал:Лучше использовать GetFieldValueFromDisabledField(Dataset, FieldName).

Почему?

Таким образом Вы будете получать нужное значение только по требованию и избавите от необходимости выбирать данные из колонки, когда это не нужно, например, если детали скрыты. Или, если реестр проектов используется где-то отдельно вне раздела, то Вы и там будете в запросе всегда выбирать тип, а он там может быть ни к чему.

В этой ситуации лучше ставить галочку "Всегда выбирать в запросе". И вот почему
1. В приведенном примере Антон всегда при смене позиции в датасете будет анализировать эти поля
2. функция GetFieldValueFromDisabledField очень тяжела с точки зрения производительности. Если посмотреть на ее реализацию (к реализации вопросов нет, всё сделано корректно), то создается еще один датасет с уже активным нужным полем, и из которого уже берется значение. Получается что при смене позиции в датасете будет открыто еще три (для каждого не активного поля).

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

Евгений, я думала об этом, но не знаю, как сравнить "тяжесть" передачи данных из трех лишних полей с сервера на клиент каждый раз при открытии набора данных и выполнение "тяжелых" операций на клиенте только при определенном запросе, но при условии, что запрос происходит часто. Не знаю, как сравнить количество открытий набора данных проектов без использования деталей с количеством переходов по записям при видимых деталях.
Для трех полей сразу GetDatasetFieldsValuesNamedArray(Dataset, FieldNames), а также при повторном обращении НЕ создается новый экземпляр набора данных, а sq кэшируется в атрибутах набора данных и переоткрывается.

Я просто встречал GetFieldValueFromDisabledField в функциях, которые используются ну очень часто, например раскраска реестра. И 1-2 ИДшника передать для 40 записей будет попроще, чем делать 40 доп.запросов на сервер.

Нужно быть очень осторожным с использованием этой функции.

"Раловец Ольга" написал:Для трех полей сразу GetDatasetFieldsValuesNamedArray(Dataset, FieldNames), а также при повторном обращении НЕ создается новый экземпляр набора данных, а sq кэшируется в атрибутах набора данных и переоткрывается.

Да, действительно есть такая функция, но все равно создается новый экземпляр Dataset

	var Dataset = SelectQuery.Open();

Это на клиентской части. На сервере же, если данные выбираются в едином контексте (одним селектом) - то это проще для сервера, чем создавать отдельный контекст, отдельный курсор и т.д..... Хотя при очень сложных запросах нужно делать разные курсоры...
В общем для разных ситуаций используются разные подходы, и к сожелению, универсального подхода нет :smile:

"Глова Сергей" написал:Нужно быть очень осторожным с использованием этой функции.

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

"Раловец Ольга" написал:Глова Сергей пишет:

Нужно быть очень осторожным с использованием этой функции.

Аватарка очень подходит к этой фразе :)

+1 :lol:
В общем, как сказал Евгений, использование зависит от ситуации

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