Здравствуйте.
Подскажите как можно округлить итоговую сумму? К примеру, построил бизнес-процесс с налоговой ставкой в 5%. Всё считает и всё работает, но нужно, чтобы итог округлялся до целых чисел. Проставил элемент типа Формула и там есть значение "ОкруглитьВВерх()". Помогите правильно его вписать, чтобы не выдавал ошибку.
Благодарю

Нравится

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

Дмитрий, добрый день!

Пример использования функции на скриншоте.

Здравствуйте, Олег. Большое спасибо за помощь!

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

Добрый день
Пытаюсь создать Инцидент из активности типа Email . Делаю кнопку в странице карточки Email, обработчик. В БП:

При компиляции выходит ошибка:

Нравится

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

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

По первой, вы используете обращение к Terrasoft.Core.UserConnection.UserContext. А надо Page.UserConnection.UserContext.

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

Я смотрела тут: http://www.community.terrasoft.ru/forum/topic/9208
Там тоже подобная ошибка была, а сам процесс у меня правильный?

1) первую ошибку устранила.
2) по второй ошибке: создала новый параметр в БП: myParam.
В скрипте подготовки процесса действия открыть карточку пишу:
myParam = IncidentId;
В скрипте Генерации номера Инцидента пишу:
Page.DataSource.ActiveRow.SetColumnValue("IncidentId", myParam);

var entitySchemaManager = Page.Schema.SchemaManagerProvider.GetManager("EntitySchemaManager") as EntitySchemaManager;
var TargetScemaQuery = new EntitySchemaQuery(entitySchemaManager, "ServiceRequest");
var primaryColumn = TargetScemaQuery.AddColumn(TargetScemaQuery.RootSchema.GetPrimaryColumnName());
TargetScemaQuery.AddColumn("Number");
TargetScemaQuery.Filters.Add(TargetScemaQuery.CreateFilterWithParameters(
FilterComparisonType.Equal,
"Id",
myParam));
var incidentCollection = TargetScemaQuery.GetEntityCollection(UserConnection);
if(incidentCollection.Count != 0){
Page.IncidentEdit.SuspendAjaxEvents();
Page.IncidentEdit.SetValueAndText(incidentCollection[0].GetTypedColumnValue(primaryColumn.Name), incidentCollection[0].GetTypedColumnValue("Number"));
Page.IncidentEdit.ResumeAjaxEvents();

}

return true;

При опубликовании ошибка:

....исправила тип на Уникальный идентификатор.... Опубликовалось без ошибок

В итоге: при нажатии на кнопку в Е-мейл активности "Создать инцидент" - у меня создалась Активность с типом Задача. А мне нужно создать именно Инцидент. Подскажите, пожалуйста, где ошибка ?

ВСЕ!!! ПОЛУЧИЛОСЬ!!!!

Еще вопрос: Не подскажете, как сделать так, чтобы при нажатии на ОК в созданным таким образом Инциденте, закрывалось не только окно Инцидента, но и окно Е-мейл Активности (из к-го и был создан этот Инцидент)

Нет, простыми средствами такое невозможно.

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

Доброго дня!
Надо добавить мультивалютное поля как в заявках в карточку своего раздела. В документах не могу найти как. Поделитесь ссылской плиз.

Нравится

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

http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/MultiCurre…

Данное решение для версии 760. Если у Вас версия ниже, то ничего не получится.

Вопрос в этой же теме.
Есть у нас мультивалютное поле Стоимость в заявке. Мне надо создать новый тип. Когда я создаю все поля скидываются. Задача восстановить это поле. Как это сделать? В конфигурации я к примеру не нашел RequestsPageV2. По сути создавать его же не надо, оно уже есть. Вопрос как его добавить на новую страницу.

Добрый день!

Не совсем понятно, что значит – создать новый тип, все поля скидываются.
Опишите, пожалуйста, задачу подробней:
- как будет выглядеть конечный результат
- детальная последовательность ваших действий
- с какими трудностями столкнулись

Как это происходит:
1. Купили bpm
2. Смотрим на коробочный раздел контакты. Радуемся полям
3. Заходим в дизайнер раздела.
4. Ставим галочку что хотим использовать отдельную страницу для каждого типа(ведь поля у разных типов должны быть разные, иначе смысл?)
5. Сохраняем.
6. Смотрим, и не понимаем а где все поля которые были в п2?

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

Их добавит только опытный разработчик.

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

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

Для добавления мультивалютного поля Вы можете воспользоваться статьей.

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

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

Здравствуйте! У меня проблема в загрузке изображений после добавления стандартного функционала Примечаний.
Примечания добавлены в деталь. Для детали создан собственный объект. Примечания добавляется в схему карточки детали следующим образом... текст сохраняется, изоражения даже не загружаются. ставил точку останова на методе insertImagesToNotes. он не выполняется. хотя должен, как он делает на стандартных страницах. почему?

        {
                "operation": "insert",
                "name": "UsrNotes",
                "values": {
                        "contentType": 4,
                        "layout": {
                                "column": 0,
                                "row": 0,
                                "colSpan": 24
                        },
                        "labelConfig": {
                                "visible": false
                        },
                        "controlConfig": {
                                "imageLoaded": {
                                        "bindTo": "insertImagesToNotes"
                                },
                                "images": {
                                        "bindTo": "NotesImagesCollection"
                                }
                        }
                },
                "parentName": "NotesControlGroup",
                "propertyName": "items",
                "index": 0
        }

 

Нравится

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

Посмотрите в соседнюю тему:
http://www.community.terrasoft.ru/forum/topic/11374

Примечания, это по сути, строка неограниченной длины с доп. атрибутом
contentType: Terrasoft.ContentType.RICH_TEXT,

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

У меня такая панель появляется. Прописал
contentType: Terrasoft.ContentType.RICH_TEXT
ничего не изменилось.
Может какие-то зависимости нужно указать для модуля или еще что-то?

Зависимость на странице редактирования раздела, только на сам объект в котором хранятся данные раздела.
Ведь данные детали примечания, не хранятся в каком-то отдельном объекте. Они хранятся в отдельной колонке объекта раздела.

Вот смотрите, пошагово, я создал новый раздел мастером разделов, называется он UsrTestSection, в объекте я добавляю новую колонку "UsrNotes"

Создал новую вкладку для моей детали, все так же, в мастере, в схеме появился контейнер для нее "UsrTestSectionPage3Tab"
строчкой ниже, я добавляю в него поле с типом RICH_TEXT и ссылкой на колонку объекта раздела (!).
Вот итоговый код всей замещающей схемы страницы редактирования раздела.

define('UsrTestSectionPage', ['UsrTestSectionPageResources', 'GeneralDetails'],
function(resources, GeneralDetails) {
	return {
		entitySchemaName: 'UsrTestSection',
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"name": "UsrName",
		"values": {
			"layout": {
				"column": 0,
				"row": 0,
				"colSpan": 24
			}
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "GeneralInfoTab",
		"values": {
			"caption": {
				"bindTo": "Resources.Strings.GeneralInfoTabCaption"
			},
			"items": []
		},
		"parentName": "Tabs",
		"propertyName": "tabs",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "UsrTestSectionPage3Tab",
		"values": {
			"items": [],
			"caption": {
				"bindTo": "Resources.Strings.UsrTestSectionPage3TabCaption"
			}
		},
		"parentName": "Tabs",
		"propertyName": "tabs",
		"index": 2
	},
	{
		"operation": "insert",
		"parentName": "UsrTestSectionPage3Tab",
		"propertyName": "items",
		"name": "UsrNotes",
		"values": {
			contentType: Terrasoft.ContentType.RICH_TEXT,
			"layout": {column: 0, row: 0, colSpan: 24},
			"labelConfig": {
				"visible": false
			},
			"controlConfig": {
				"imageLoaded": {
					"bindTo": "insertImagesToNotes"
				},
				"images": {
					"bindTo": "NotesImagesCollection"
				}
			}
		}
	}
]/**SCHEMA_DIFF*/,
		attributes: {},
		methods: {},
		rules: {},
		userCode: {}
	};
});

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

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

Из вашего вступления больше всего смущает фраза "Для детали создан собственный объект."
Этого делать не нужно, данная деталь добавляется кодом в схеме редактирования карточки раздела. А данные хранятся в объекте раздела. (см. комментарий выше)

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

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

И когда для этой детали я жму кнопки (добавить/изменить) открывается такая страница

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

В таком случае все верно. У базовой детали от которой наследуются все остальные, просто нет необходимых атрибутов, методов и миксинов. В отличие от страниц которые наследуются от BaseModulePageV2. Но это можно исправить, посмотрев что реализовано в BaseModulePageV2 и воссоздать это у себя в схеме детали. Далее я покажу основные аспекты, и приведу полный код своего примера. В основе всего я создал объект для детали, на основании Base object with notes (Base), но можно наверно и от обычного базового объекта, а потом добавлять строку неограниченной(!) длины (у вас на скриншоте она ограничена). После я создал деталь мастером деталей, и в автоматически созданной схеме "UsrUsrMyDetail1Page", в конфигураторе, добавляю:

1. зависимость на "NotesUtilities" для requirejs;

2. атрибут:

attributes: {
        "NotesImagesCollection": {dataValueType: Terrasoft.DataValueType.COLLECTION}
},

3. миксин:

mixins: {
        NotesUtilities: "Terrasoft.NotesUtilities" 
},

4. методы:

methods: { 
        onNotesImagesUploadComplete: function() {
                this.hideBodyMask(); 
                this.updateFileDetail(); 
        }, 
        onNotesImagesUpload: function() { 
                this.showBodyMask(); 
        },
        init: function(callback, scope) {
                this.callParent(arguments); 
                this.mixins.NotesUtilities.initNotesImagesCollection.call(this);
        } 
}

5. Ну и само поле для наших заметок:

{
        "operation": "insert",
        "parentName": "Header",
        "propertyName": "items",
        "name": "Notes",
        "bindTo": "Notes",
        "values": {
               contentType: Terrasoft.ContentType.RICH_TEXT, 
               "layout" : {column: 0, row: 1, colSpan: 24}, 
               "controlConfig": { 
                      "imageLoaded": { 
                                "bindTo": "insertImagesToNotes" 
                      },
                      "images": { 
                                "bindTo": "NotesImagesCollection" 
                      } 
               } 
         },
         "index": 1 
} 

Полный код схемы карточки детали во вложении. Итог работы:

Добрый день!

Не нашла вложения, где есть полный код страницы.. И еще - что нужно сделать в этом пункте конкретно? 

1. зависимость на "NotesUtilities" для requirejs;

Речь о коде в начале:

mixins: {
	NotesUtilities: "Terrasoft.NotesUtilities"
},

 

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

Создаю стандартный раздел, как описано здесь: http://www.terrasoft.ru/bpmonlinesdk/CreateStandartSection.html

Новый объект наследую от Базового объекта.

Все проходит нормально, однако стандартные кнопки элементов реестра ("Изменить", "Просмотр" и т.п.) не работают. Открывается страница редактирования с пустыми полями.

При этом в консоли браузера 500 ошибка при запросе на DataService/json/SyncReply/SelectQuery с сообщением "Элемент коллекции с именем Notes не найден".

Анализ выявил, что на указанный URL уходит запрос с перечислением столбца Notes в параметрах. Но мой объект не содержит данного столбца.

Подскажите, в чем может быть проблема?

Upd. Проблема решена. Извините за беспокойство.

Нравится

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

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

Не работает запланированный процесс. Вот выдержка из schedule.log:

2015-11-18 02:50:09,833 [BPMonlineQuartzScheduler_Worker-2] INFO  ... Terrasoft.Core.Scheduler.RunProcessJob Execute - ProcessFail [processSchemaName:AccrualProcess, processElementUId , userName:Supervisor, workspaceName:Default, Exception:System.ArgumentNullException: Value cannot be null.
Parameter name: appConnection
   at Terrasoft.Core.UserConnection..ctor(AppConnection appConnection)
   at Terrasoft.Core.Scheduler.JobUserConnection..ctor(AppConnection appConnection)
   at Terrasoft.Core.Scheduler.RunProcessJob.GetUserConnection(String userName, String sessionId)
   at Terrasoft.Core.Scheduler.RunProcessJob.Execute(IJobExecutionContext context)]

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

7.2.0.1530

Нравится

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

Здравствуйте, Юрий.

Данное поведение системы действительно возникает из-за простоя.
В качестве решения можно использовать один из сервисов мониторинга облачных ресурсов, который будет выступать в роли пинговалки:
http://www.servermom.org/useful-free-uptime-monitoring-services-server/…

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

Александр, совершенно верно!
Если же это on-site, подойдет утилита для локального пингования.

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

Каким образом можно поместить элемент аналитики в карточку?
Например, в карточку контрагента индикатор "Сумма счетов за текущий год"

Нравится

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

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

мда... работы на неделю :(

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

Добрый день.

Добавляю кнопку для каждого элемента грида в разделе. Код следующий:

define('UsrSvcCatSection', ['ext-base', 'terrasoft', 'sandbox', 'UsrSvcCat',
        'UsrSvcCatSectionStructure', 'UsrSvcCatSectionResources'],
        function(Ext, Terrasoft, sandbox, entitySchema, structure, resources) {
        structure.userCode = function() {
                this.entitySchema = entitySchema;
                // ...
                // add sync button
                this.methods.syncThis = function() {
                        this.showInformationDialog("Bla-bla-bla!");
                };
                var baseGridConfig = this.methods.modifyGridConfig;
                this.methods.modifyGridConfig = function(gridConfig) {
                        if (baseGridConfig) {
                                baseGridConfig.call(this, gridConfig);
                        }
                        var syncButtonConfig = {
                                className: "Terrasoft.Button",
                                caption: "Bla-bla",
                                enabled: true,
                                style: "blue",
                                visible: true,
                                tag: 'sync'
                        };
                        var gConfig = gridConfig;                      
                        gConfig.activeRowActions.push(syncButtonConfig);
                        return gConfig;
                };
                var baseOnActiveRowAction = this.methods.onActiveRowAction;
                this.methods.onActiveRowAction = function(buttonTag, primaryColumnValue) {
                        switch (buttonTag) {
                                case "sync":
                                        this.syncThis();
                                        break;
                                default:
                                        baseOnActiveRowAction.call(this, buttonTag, primaryColumnValue);
                                        break;
                        }
                };
        };
        return structure;
});

Код на моей кнопке отрабатывает корректно, однако не работает код на стандартных кнопках "Просмотр", "Копировать" и т.п.

Также пытался выполнить

default:
        this.callParent(arguments);
        break;

Результат аналогичен - стандартные кнопки не отрабатывают.

Подскажите пожалуйста, в чем моя ошибка?

Нравится

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

Вероятно вы не вызываете родительский код метода при его переопределении (callParent).
Посмотрите в соседнюю тему http://www.community.terrasoft.ru/forum/topic/11933

Максим, спасибо за ответ. Однако в теме, на которую вы ссылаетесь, добавление кнопки происходит отличным от моего способом.

Я пробовал вызывать callParent - результат аналогичен. Стандартные кнопки не работают.

Проблема решена. Возможно кому-то поможет:

this.methods.onActiveRowAction = function(tag, id, parentOnActiveRowAction) {
    switch (tag) {
        case 'sync':
             this.syncThis();
             break;
        default:
             parentOnActiveRowAction.call(this, tag, id);
             break;
    }
}

Вопрос...а такое применимо для кнопок в редактируемом реестре.
Столкнулся что добавив к стандартным кнопкам свои...стандартные кнопки не работают.

onActiveRowAction: function(buttonTag) {
				var activeRow = this.getActiveRow();
				var position;
				//this.callParent(arguments);
				switch (buttonTag) {
					case "Up":
						position = activeRow.get("Position");
						if (position > 0) {
							position--;
							this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
						}
						break;
					case "Down":
						position = activeRow.get("Position");
						position++;
						this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
						break;
					default:
						break;
				}
			},
Показать все комментарии

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

Нравится

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

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

"Мотков Илья" написал:написать в принципе что угодно

это понятно, что что угодно можно.
Но в bpm как-то система уже отображает "нет данных", следовательно, эта информация уже где-то подсчитана.
Вопрос - как её добыть

Попробовали this.getGridData().collection.length

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

Проще будет на init или еще где-то написать запрос esq к объекту детали. (только не забыть фильтр по родительской записи).
В this.getGridData().collection.length не всегда будет храниться правильная информация,т.к. в деталь записи тянуться постранично. В указанном параметре будут храниться количество уже загруженных данных.

"Пащенко Александр Сергеевич" написал:только не забыть фильтр по родительской записи

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

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

Тогда есть смысл посмотреть в сторону атрибута IsGridEmpty и метода initIsGridEmpty.
Подробнее в GridUtilitiesV2

"Пащенко Александр Сергеевич" написал:Тогда есть смысл посмотреть в сторону атрибута IsGridEmpty и метода initIsGridEmpty.
Подробнее в GridUtilitiesV2

Спасибо!

Всё заработало!

"Пащенко Александр Сергеевич" написал:Тогда есть смысл посмотреть в сторону атрибута IsGridEmpty и метода initIsGridEmpty

Эх, я поторопился. Заработало только в том случае, если деталь развёрнута.
А когда деталь свёрнута, то IsGridEmpty не определяется (undefined).

В bpm для свёрнутой детали вообще не подчитываются никакие записи?

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

Для увеличения быстродействия данные на свернутую деталь действительно не загружаются. Загрузка данных осуществляется в момент разворачивания детали.
За загрузку данных отвечает метод loadGridData. Этот метод вызывается в момент разворачивания детали.

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

Важно! Не рекомендуется переопределять метод loadGridData, так как это замедлит быстродействие.

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

Добрый день.
При выполнении sql запроса возникает ошибка, если в условии указать поле, которое является справочником. К примеру вот такая - http://prntscr.com/93q94f
Из за чего может быть?

Нравится

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

Виктор, добрый день!

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

Спасибо!

DELETE FROM SFProperty WHERE SFProperty.City != 'Новосибирск';

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

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

У хочу удалить все записи SFProperty у которых поле(справочник) не равно Новосибирск

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

delete from SFProperty
where SFProperty.CityId <> '....' --тут должен быть Id записи

Не получается. Вот пример:

DELETE FROM SFProperty WHERE SFProperty.CityId = 'e2c98aa7-8d75-4c91-8e90-531ffd704779';

e2c98aa7-8d75-4c91-8e90-531ffd704779 - это айди именно этого города.

А какая ошибка у вас выдается?

В данном случае ваш запрос
DELETE FROM SFProperty WHERE SFProperty.CityId = 'e2c98aa7-8d75-4c91-8e90-531ffd704779'

должен удалить все записи из таблицы SFProperty, у которых поле CityId равно
'e2c98aa7-8d75-4c91-8e90-531ffd704779'

"Татаровская Дарья" написал:должен удалить все записи из таблицы SFProperty, у которых поле CityId равно
'e2c98aa7-8d75-4c91-8e90-531ffd704779'

да все верно

"Татаровская Дарья" написал:А какая ошибка у вас выдается?

http://prntscr.com/94ftse
Как узнать какая именно?

а что за таблица SFProperty?
Возможно есть ссылки из других таблиц на записи в таблице SFProperty, которые вы как раз пытаетесь удалить - и из-за этого удаление не происходит ( срабатывает условие ссылочной целостности)

Ясно, буду разбираться.

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