Доброго дня,

Creatio має вбудований функціонал, який розрізняє основні проекти і під-проекти (робота) і відкриває для них різні сторінки редагування з різними схемами, як сказано тут:

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

Нравится

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

Делал такое через обновление данных в напрямую в БД. Таблица SysModuleEdit

Делал такое через обновление данных в напрямую в БД. Таблица SysModuleEdit

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

Добрый день!

 

Реализовали функционал копирования деталей при копировании записи частично на примере существующего дополнения:

- в методе onSaved если режим  isCopy мы вызываем БП, в который отправляем конфиг с id старой\новой записи, название схемы и тд. Бизнес-процесс на основе заполненного справочника с колонками деталей создает новые связи с новой (скопированной записью).

 

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

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

Нравится

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

А данное дополнение не подошло под ваши задачи? https://marketplace.terrasoft.ru/app/copy-detail-records-creatio

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

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

Если это единичный случай, то я делал по другому:

Для страницы раздела переделать вызов метода copyRecord, в нем вызывать процесс, который делать поэтапно сначала делает копирование основной записи, а потом копирование записей деталей. К сожалению в БП нету элемента "сделать копию". Поэтому приходилось делать Читать данные - Добавить данные (режим одна запись) - Сохранить в id новой записи в переменную - Добавить данные в деталь (результат выборки) - открыть запись.

		methods: {
			copyRecord: function(primaryColumnValue) {
				this.runCustomCopyProcess(primaryColumnValue);
			},
 
			runCustomCopyProcess: function(primaryColumnValue){
				var args = {
					sysProcessName: "UsrCopySpecificationCustomer",
					parameters: {
						specificationsId: primaryColumnValue
					}
				};
				ProcessModuleUtilities.executeProcess(args);
			},
		}

Это все можно сделать и через isCopy, но там надо отловить момент, когда основная запись уже сохранилось и тогда запускать копирование детали, пример есть в InvoiceSection, правда код крайне замороченный, плюс там еще и вьюшки задействованы. По мне так проще через БП сделать, как у меня, пусть и не очень "красиво".

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

В плане копирования связей проблем нет -- сделали БП, там все работает. Проблема скорее в отлавливании момента, когда запись копии основной страницы уже создалась. Казалось бы, у нас для этого есть onSaved -- бери и делай. Но нет, не всегда в момент срабатывания onSaved запись уже создана в бд видимо...

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

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

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

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

Нравится

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

на страницу, в секцию атрибутов добавить, если надо вкл/выкл по условию

attributes: {
            
            "ButtonEnabled": {
                "dataValueType": Terrasoft.DataValueType.BOOLEAN,
                "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                "value": false
            }

Вызов функции на кнопке

  onButtonClick: function(){ 
                this.SomeFunc();

Сама кнопка в DIFF            

    {
                "operation": "insert",
                "name": "Button",
                "values": {
                    "itemType": 5,
                    "caption": {
                        "bindTo": "Resources.Strings.ButtonCaption"
                    },
                    "click": {
                        "bindTo": "onButtonClick"
                    },
                    "style": "blue",
                    "enabled": {
                        "bindTo": "ButtonEnabled"
                    },
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 0,
                        "layoutName": "Tab72b43268TabLabelGridLayoutfb645753"
                    }
                },
                "parentName": "Tab72b43268TabLabelGridLayoutfb645753",
                "propertyName": "items",
                "index": 0
            },

В LocalizableString
ButtonCaption    - Текст на кнопке

Если расположение кнопки не имеет значения, то можно использовать меню в "Действиях" 

 

			getActions: function() {
				var actionMenuItems = this.callParent(arguments);
				actionMenuItems.addItem(this.getButtonMenuItem({
					"Caption": {"bindTo": "Resources.Strings.MyButtonCaption"},
					"Click": {"bindTo": "onMyButtonClick"}
				}));
				return actionMenuItems;
			},

 

на страницу, в секцию атрибутов добавить, если надо вкл/выкл по условию

attributes: {
            
            "ButtonEnabled": {
                "dataValueType": Terrasoft.DataValueType.BOOLEAN,
                "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                "value": false
            }

Вызов функции на кнопке

  onButtonClick: function(){ 
                this.SomeFunc();

Сама кнопка в DIFF            

    {
                "operation": "insert",
                "name": "Button",
                "values": {
                    "itemType": 5,
                    "caption": {
                        "bindTo": "Resources.Strings.ButtonCaption"
                    },
                    "click": {
                        "bindTo": "onButtonClick"
                    },
                    "style": "blue",
                    "enabled": {
                        "bindTo": "ButtonEnabled"
                    },
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 0,
                        "layoutName": "Tab72b43268TabLabelGridLayoutfb645753"
                    }
                },
                "parentName": "Tab72b43268TabLabelGridLayoutfb645753",
                "propertyName": "items",
                "index": 0
            },

В LocalizableString
ButtonCaption    - Текст на кнопке

Oleg,

Кнопка добавилась, и даже отображается в инспекторе, но при этом она  абсолютно невидима. В enabled установлено true.
В вашем коде изменил только родительский контейнер и, соответственно, layoutName. У других элементов на странице тот же родитель

Гусейн Гулиев,

В LocalizableStrings добавили? 

Oleg,

Спасибо большое, Олег. Хотел ответить "захардкодил", потом заметил, что захардкодил неправильно, но оставлю тут этот неправильный пример, на случай если кто столкнется в будущем.

{
	"operation": "insert",
	"name": "Button",
	"values": {
		"itemType": 5,
		"caption": {// Правильно: "caption" :"Check out",
			"bindTo": "Check out" // неправильное использование bindTo
		},
		"click": {
			"bindTo": "onButtonClick"
		},
		"style": "blue",
		"enabled": true,
		"layout": {
			"colSpan": 8,
			"rowSpan": 1,
			"column": 16,
			"row": 6,
			"layoutName": "Tab84fbfd75TabLabelGridLayout489fb6f3"
		}
	},
	"parentName": "Tab84fbfd75TabLabelGridLayout489fb6f3",
	"propertyName": "items",
	"index": 6
},

 

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

В новой версии (7.18) в столбчатых диаграммах с накоплением отображаются нулевые значения. Причем сами секторы графика не рисуются, а вот нули в виде подписей есть. Это баг? Можно как-то исправить? Нужной настройки для этого не нашли.

Нравится

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

Неужели нет комментариев по данному вопросу :(

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

Спасибо за детальное описание данного кейса!

 

На основании данной информации, в департаменте разработки зарегистрирована соответствующая задача:

- На графике с признаком Stacked не отображать пустые серии.

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

Необходимо, чтобы пустая серия не отображалась.

 

Исправления запланированы в версии 7.18.2.

Спасибо за то, что помогаете делать наш продукт лучше!

Жмурко Сергей,

Ждем с нетерпением! Спасибо за ответ

Жмурко Сергей,

Судя по всему, не исправили в 7.18.2?

Добрый день,
Мы связались с разработчиками и они нам сообщили, что сроки сдвинулись.
На данный момент нам не известны сроки решения данной проблемы.

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

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

Например, в контрагенте я выбираю Контакт, но могу нажать Добавить. В карточке контакта, в init или как-то еще можно определить Id контрагента, из которого вызвалось добавление?

Нравится

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

При открытии карточки контрагента, класть id контрагента в кэш. В карточке контакта считать значение из кэша.

Альтернативный вариант посылать на карточку контрагента сообщение, но карточка может не ловить сообщение.

Здравствуйте. Если не ошибаюсь, sandbox.id содержит гуид

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

Добрый день, 

 

Вопрос следующий:
Объект Обращения, есть вкладка "Test", она выводиться когда на странице в поле "Направление" стоит значение "Sales". И вот, кроме "Sales" эта вкладка еще и нужна для "Transport". 

 

Где можно найти настройку, которая выводит табку "Test" для "Sales", если в бизнес-процессах такой настройки нет. Просто нет. 

Может быть табка привязана не к полю, а к диаграмме статуса?
Диаграмма статусов для "Sales" тоже особенная.

 

Памагите.

Нравится

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

Отображение вкладки можно настроить через бизнес-правила раздела. Поищите бизнес-правило и добавьте условие видимость по направлен = Sales или Направление = Transport.  Бизнес-правило может не отображаться из-за иерархии пакетов - если изменения сделаны в пакете выше, чем сейчас установлен текущий пакет. Если текущим сделать пакет Custom, то все бизнес-правила будут отображаться.

Второй вариант - отображение вкладки реализовано напрямую в коде самой странички CasePage. В этом случае надо просто изменить скрипт и добавить туда второе условие видимости вкладки.

Ирина, из постановки вопроса неясно, речь о платформе 7.Х, более старых версиях или вообще не о продуктах Terrasoft.

Логику элементов интерфейса обычно реализуют не в бизнес-процессах или кейсах, а в JS-коде схем страниц или в бизнес-правилах, как написали в комментарии выше.

В карточке раздела обращений стандартно нет поля «Направление», его могли самостоятельно добавить.

В таком случае нужно смотреть схему этой страницы CasePage (или CasePageV2) пакета Custom, где размещаются пользовательские доработки.

Спасибо за информацию!!
Ответ оказался неожиданным, эта настройка находилась в Справочнике Service Catalog. Видно это специфическая настройка, а не стандарный функционал. 

Но, на будущее эти знания точно пригодятся. 

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

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

В указанном справочнике страница редактирования "OpportunityStagePageV2", работает она понятно как, но как она вызывается не понятно.

Может у кого есть опыт с данным типом справочника?

Нравится

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

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

https://prnt.sc/vo7c2d

Если мне не изменяет память, делал так, создал деталь со страницей редактирования(через мастер раздела) и привязал ее к объекту справочника. Попробуйте так.

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

https://prnt.sc/vo7c2d

Если мне не изменяет память, делал так, создал деталь со страницей редактирования(через мастер раздела) и привязал ее к объекту справочника. Попробуйте так.

Через мастер деталей только.

Спасибо за ответы! Сам бы не за что не догадался

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

Добрый день, имеется развернутый локально Creatio. Хочу добавить лэндинг(чтобы можно было к примеру перейти на localhost/landing/index.aspx) с формой, у которой есть поле phone и данные введенные в поле будут попадать в контакты -> мобильный телефон уже к имеющемуся контакту.
Что уже сделал?
Сейчас контакт выглядит следующим образом

Как описано в документации добавил лэндинг. Сжато он выглядит так:

После чего в папке ../0/Nui/ создал папку Landing с файлом index.aspx в котором лежит следующий код:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <!--ШАГ 2-->
    <!--Эту часть необходимо скопировать из поля ШАГ 2 страницы редактирования лендинга-->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/track-cookies.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/create-object.js"></script>
    <script>
 
    var config = {
        fields: {
            "Subject": "#subject-field",
            "Email": "#email-field",
            "Name": "#name-field",
            "MobilePhone": "#phone-field",
        },
        landingId: "54a57d16-e7b6-4c7d-9c38-237cfcf6512d",
        serviceUrl: "http://localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData",
        redirectUrl: "yandex.ru"
    };
 
    function createObject() {
        landing.createObjectFromLanding(config)
    }
    </script>
    <!--ШАГ 2-->
</head>
<body>
<h1>Landing web-page</h1>
<div>
    <h2>Case form</h2>
    <form action="localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData" method="POST" class="mainForm" name="landingForm" onSubmit="createObject(); return false">
        Subject:<br>
        <input type="text" name="subject" id="subject-field"><br>
        Email:<br>
        <input type="text" name="Email" id="email-field"><br>
        Name:<br>
        <input type="text" name="Name" id="name-field"><br>
        Phone:<br>
        <input type="text" name="Phone" id="phone-field"><br><br>
        <input type="submit" value="Submit">
        </font>
    </form>
</div>
</body>
</html>

Если я правильно понял для того чтобы POST запрос прошел корректно должен отработать файл GeneratedObjectWebFormService.svc. Нужно ли его создавать по документации или он является дефолтным? При попытки отправки запроса возникает 403 ошибка. Как сделать это рабочим и какие ошибки я совершил?

Нравится

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

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

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

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

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

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

Добрый день, подскажите как разрешить службу? Так полагаю что это что-то связанное с настройками приватности функции или что-то вроде того.

Нет, дело не в этом. Посмотрите второй абзац прошлого ответа.

Зверев Александр,
исправил без /0/ теперь следующую проблему не могу побороть 

политика CORS дефолтная и выглядит так:

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

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

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

Есть страница редактирования PageEdit1 в Package1, которая наследуется от базовой в некотором пакете, также есть PageEdit2 (наследник от PageEdit1) в Package2 и PageEdit3 (наследник от PageEdit2) в Package3.

Пакеты наследуются от верхнего к нижнему в такой последовательности: Package1 -> Package2 -> Package3.

Нужно удалить PageEdit2.

Интересует последовательность действий, что нужно сгенерировать и скомпилировать, чтобы система поняла, что PageEdit3 нужно наследоваться от PageEdit1.

Нравится

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

Только удалить PageEdit2, и пересоздать PageEdit3, указав нового родителя.

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

Если мы говорим о JS схемах, то нужно почистить кеш.
Если это страницы разделов, тогда нужно еще подставить UID новой страницы в таблицу SysModuleEdit. Если это страница справочника, выполненная в C#, то нужно компилироваться. Также нужно поправить таблицу Lookup, чтобы при открытии справочника открывалась новая страница, а не базовая страница редактирования значений справочника.

А вообще схемы лучше не удалять.

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

Добрый день!

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

Нравится

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

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

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

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

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

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

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

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

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

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

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

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

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