Всем доброго времени суток.

Версия 7.9 sales.

Ситуация такая: имеется деталь с редактируемым реестром. При добавлении новой записи на деталь необходимо копировать туда часть значений из колонок основной страницы (на которой расположена деталь).

Если у детали есть стандартная страница добавления, то обычно делал такое следующим образом: в карточке объекта детали внутри метода onEntityInitialized делал запрос по объекту связывающей колонки, и вытаскивал нужные мне данные.

У детали с редактируемым реестром onEntityInitialized не срабатывает. render и init - тоже. Как правильно поступить в этом случае?

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

Нравится

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

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

"UsrProduct": {
    lookupListConfig: {
     columns: ["Price", "Currency"]
    },
    dependencies: [
     {
      columns: ["UsrProduct"],
      methodName: "setProductPrice"
     }
    ]
   },

Таким образом, при изменении Продукта, будет вызван метод setProductPrice в котором вы можете делать this.set любых других колонок, и эти изменения вы увидите до сохранения строки.
Так же всегда есть колонка, которая изменяется наверняка, это колонка связи с разделом где размещена детали, она всегда заполняется при добавлении новой строки, можете тригериться на её изменения.

Максим, здравствуйте.

Попробовал воспользоваться Вашим методом - сама деталь расположена на странице Счёта (фактически - это замена детали Продукт в счёте), соответственно для связи используется колонка Invoice объекта InvoiceProduct. В схеме InvoiceProductPageV2 добавил атрибут

"Invoice":{
				dependencies: [
					{
						columns: ["Invoice"],
						methodName: "setCurrency"
					}
				]
			},

Метод не срабатывает. Как я понимаю, эта колонка Invoice заполнена по умолчанию, и её изменения не происходит.

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

Вам подойдет паттерн с событием-запросом и событием-ответом,

1)В основной карточке объявляете событие-запрос (подписку), событие-ответ (публикация) и осуществляете подписку на событие-запрос, в обработчике которого генерируете событие ответ передавая туда все необходимые поля и данные из текущего контекста.
2)В схеме детали, наборот: событие-запрос (публикация), событие-ответ (подписка) и осуществляете подписку на событие-ответ, в обработчике которого реализуете Вашу логику.
(Если вам необходимо прервать асинхронный процесс, то можете его заместить его в вашей схеме, где в chain вызвать функцию событием, и this.callParent)
3)По событию сохранения из детали публикуете событие запрос.

Как-то так...
На бумаге выглядит замысловато, но по факту очень лаконично.

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

Можете немного подробнее пояснить?

Например, в карточке детали UsrInvoiceProductDetail я добавляю публикацию сообщения, переопределив для этого метод addRecord. По идее это именно то, что надо, осталось только передать это куда-то...

На это сообщение я могу, например, подписаться из общей карточки страницы InvoicePageV2, на которой размещена деталь. А как подписаться на него же внутри InvoiceProductPageV2 - карточки объекта, на основе которого создана деталь? init не работает.

Примерно представляю вариант с подпиской на сообщение из общей карточки страницы InvoicePageV2. И далее записывать нужный параметр напрямую в объект InvoiceProduct запросом. Других вариантов точно нет?

"Смородинов Денис" написал:- карточки объекта, на основе которого создана деталь? init не работает.

В данном случае трюк сработает только если пользователь "прошел" через карточку объекта в карточку на которой размещена деталь.
(В таком случае схема InvoiceProductPageV2 будет предварительно загружена, подписчики объявлены и событие будет поймано).
Если же пользователь может попасть в карточку с деталью минуя загрузку страницы объекта. - У вас остается только один способ манипуляции с данными - это работа с базой через ESQ.

Илья, а других способов, как я понимаю, нет?

Так, чтобы в InvoiceProductPageV2 отловить момент добавления новой строки, аналог onEntityInitialized для детали с редактируемым реестром.

"Смородинов Денис" написал:Илья, а других способов, как я понимаю, нет?

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

Так... я немного потерял суть:
InvoiceProductPageV2 - это схема
UsrInvoiceProductDetail - это деталь с реестром на ней
так ?
Вам при добавлении записи в деталь необходимо получать некие значения из карточки (InvoiceProductPageV2) ?

Да. Колонки ему необходимо заполнить. Сделать это можно в InvoiceProductPageV2, но событие добавления новой строки можно словить в UsrInvoiceProductDetail, вот и выходит что писать код нужно и там и там, в UsrInvoiceProductDetail ловить событие добавление записи, пушить сообщение, в InvoiceProductPageV2 слушать это сообщение, деать esq к объекту карточки, и заполнять колонки через this.set(...

"Севостьянов Илья Сергеевич" написал:Вам при добавлении записи в деталь необходимо получать некие значения из карточки (InvoiceProductPageV2) ?

Да, всё верно. Вопрос в том, как в этом случае

"Максим Шевченко" написал:в InvoiceProductPageV2 слушать это сообщение

Обычно подписывались через init, который здесь не срабатывает.

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

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

То есть подписаться на такое сообщение в InvoiceProductPageV2 в случае детали с РР нельзя?

И добавление происходит без открытия страницы или миникарточки ?

"Севостьянов Илья Сергеевич" написал:И добавление происходит без открытия страницы или миникарточки ?

Да, это деталь с редактируемым реестром.

Есть в типовой поставке пример такой детали ? Чего-то с наскока не найти.
Детали с редактируемым реестром, как раз зачастую, при добавлении записи - открывают карточку ("например Продукты в Счетах" или "Адреса" в "Контрагентах") или миникарточку (например "Контакты контрагента" в "Контрагенты"), это РЕДАКТИРУЮТСЯ уже добавленные записи без открытия карточек, так чтобы совсем без карточки я что-то не найду просто примера даже.
Если есть пример я быстро отдебажу событийную модель, и скажу ченго куда пихать.

Илья, сейчас попробую найти, по моему, были.

Речь идёт вот о такой детали: https://academy.terrasoft.ru/documents/technic-sdk/7-8/sozdanie-detali-…

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

Для примера - хотя бы добавление пункта в типовой справочник.

Вот например, справочник Типы договоров - жмём "Добавить", появилась строчка. Это конечно не совсем то, но близко.

"Смородинов Денис" написал:то конечно не совсем то, но близко.

Визуально - да, по факту - совсем не то.
Ну если у вас есть схема с реализацией Вашей детали - дайте MD файл и редакцию на которой разрабатываете.
"Смородинов Денис" написал:Но хотелось бы уж разобраться, возможно ли вообще такое.

Мне тоже интересно, давайте разберемся.

"Севостьянов Илья Сергеевич" написал:Ну если у вас есть схема с реализацией Вашей детали - дайте MD файл и редакцию на которой разрабатываете.

Сделайте любую деталь, мастером детали, разместите в любом разделе, и после внесите следующие доработки:

- Добавить зависимости от модулей ConfigurationGrid (Конфигурационный реестр), ConfigurationGridGenerator, ConfigurationGridUtilities;
- Подключить "миксин" ConfigurationGridUtilites;
- Установить атрибут IsEditable в значение true;
- Базовому реестру указать свойства:
className: "Terrasoft.ConfigurationGrid",
generator: "ConfigurationGridGenerator.generatePartial",
generateControlsConfig: {bindTo: "generateActiveRowControlsConfig"},
changeRow: {bindTo: "changeRow"},
unSelectRow: {bindTo: "unSelectRow"},
onGridClick: {bindTo: "onGridClick"},
initActiveRowKeyMap: {bindTo: "initActiveRowKeyMap"},
для добавления действий активной записи добавить:
activeRowActions: [...],
activeRowAction: {bindTo: "onActiveRowAction"}

Итоговый код простейшей редактируемой детали будет выглядеть следующим образом:

define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator",
   "ConfigurationGridUtilities"], function() {
   return {
      entitySchemaName: "Contact",
      attributes: {
         "IsEditable": {
            dataValueType: Terrasoft.DataValueType.BOOLEAN,
            type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
            value: true
         }
      },
      details: {},
      diff: [
         {
            "operation": "merge",
            "name": "DataGrid",
            "values": {
               "className": "Terrasoft.ConfigurationGrid",
               "generator": "ConfigurationGridGenerator.generatePartial",
               "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
               "changeRow": {"bindTo": "changeRow"},
               "unSelectRow": {"bindTo": "unSelectRow"},
               "onGridClick": {"bindTo": "onGridClick"},
               "activeRowActions": [
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "save",
                     "markerValue": "save",
                     "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "cancel",
                     "markerValue": "cancel",
                     "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "remove",
                     "markerValue": "remove",
                     "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                  }
               ],
               "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
               "activeRowAction": {"bindTo": "onActiveRowAction"},
               "multiSelect": false
            }
         }
      ],
      mixins: {
         ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
      },
      methods: {}
   };
});

Почистить кеш, перезайти, и все, деталь редактируемая.
Дальше можете эксперементировать со страницей редактирования, которая конечно открыватся не будет. Но часть логики с нее работать будет ;) О чем я писал выше.

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

Подскажите, пожалуйста, в итоге мы можем заполнить поля объекта детали с редактируемым реестром значениями полей записи,в которой расположена деталь?
почитала здесь обсуждение и не поняла, к чему в итоге пришли :smile:
у меня есть объект UsrObj, его деталь UsrUsrObjDetail на странице продаж, его страница UsrUsrObj1Page1. деталь с ред. реестром. я добавляла публикацию сообщения в UsrUsrObjDetail на addRecord и подписку UsrUsrObj1Page1 в методе initEntity. но initEntity срабатывает позже, чем addRecord и у меня выходила след.ошибка в консоли
UnsupportedTypeException: Message addRecordOOP cannot be subscribed in DetailModuleV2 (CardModuleV2_66ac4481-f753-41fd-bd33-80df01c99ed1_OpportunityPageV2_detail_UsrUsrObjDetailcb3382b4ICLIndButch), message direction set as publish

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

Всем доброго времени суток.

Версия 7.9 sales.

Стоит задача - при создании счёта из лида автоматически подставлять в поле Клиент значение Контакта связанного лида, если есть конечно.

Делается это стандартным запросом:

var $this = this;
var leadEsq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Lead"});
                                       
                                        leadEsq.addColumn("QualifiedContact");
                                        leadEsq.addColumn("QualifiedAccount");
                                       
                                        leadEsq.getEntity(this.get("UsrLead").value, function(result) {
                                                if (!result.success) {
                                                        console.log("Ошибка запроса данных");
                                                        return;
                                                }
                                               
                                                if (result.entity.get("QualifiedContact")){
                                                        $this.set("Contact",result.entity.get("QualifiedContact"));
                                                } else {
                                                        if (result.entity.get("QualifiedAccount")){
                                                                $this.set("Account",result.entity.get("QualifiedAccount"));
                                                        }
                                                }
                                               
                                                $this.updateDetail({
                                                        detail: "Client"
                                                });
                                               

                                        }, this);

Данные приходят, но подстановки именно в поле клиента не происходит. Обновление по типу обновления детали тоже не помогло.

$this.set("Client",result.entity.get("QualifiedAccount")); - то же самое.

Как автоматически подставлять значение Клиента?

Нравится

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

Заметил, что какая-то подстановка всё же происходит - в частности, меняется иконка у поля Клиента.

Но сохранить страницу всё равно нельзя.

Здравствуйте,
Как при программной установке обычного лукапа, что бы узнать какую структуру должен иметь объект второго параметра this.set("колонка", значение), достаточно в init закешировать скоуп, и в консоли сделать this.get("имя-колонки"), и Вы узнаете правильную структуру, вроде этой:
{ value: "a7c4c271-22e4-44b0-b037-00045bd579ae", displayValue: "Name 1" }
Так и для мультилукапа можно его значение получить через this.get к примеру клиент из продажи это мультилукап, и структура будет следующей:
{ Name: "Name 1", Email: "", Id: "a7c4c271-22e4-44b0-b037-00045bd579ae", Photo: "", value: "a7c4c271-22e4-44b0-b037-00045bd579ae", displayValue: "Name 1", column: "Contact" }

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

var val = {
Id: "bb7442b1-c8a1-43fc-b5b0-004bcc91fa5b",
value: "bb7442b1-c8a1-43fc-b5b0-004bcc91fa5b",
displayValue: "Name 3",
column: "Contact"
}
document.testscope.set("Client", val);

где document.testscope переменная в которой закеширован скоуп карточки. Для вас это просто this.set("Client", val); если Вы пишете код в методах карточки.
При чем, в этот момент установится и значение для колонки «Contact».

Ну или если проставляете аккаунта, то column: "Account".
Вот таким нехитрым способом можно установить програмно значение мультилукапа, чем клиент и является.

Максим, спасибо!

Помогло.

Короче, подстановка делается таким же способом, как и для обычной справочной колонки, только добавляется параметр column.

Максим, спасибо!

Помогло.

Короче, подстановка делается таким же способом, как и для обычной справочной колонки, только добавляется параметр column.

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

Доброго времени суток!
Существует лендинг с помощью которого создается в системе лид.
Так же есть бизнес-процесс в котором сигнал срабатывает на создания лида с помощью лендинга.
Этот БП не отрабатывает. Каким образом следует указать сигнал, что отлавливать момент создания лида с помощью лендинга в системе?
Так же пытались вешать сигнал на изменения поля "Лендинг" в самом Лиде. Так же 0 эффекта, БП не запускается.

Нравится

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

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

При создании лида с лендинка справочное поле “Как зарегистрирован” по умолчанию заполняется значением “Лендинг”.
Для ращения задачи необходимо в стартовом сигнале указать:
- объект Лид, после добавления записи
- условие: Как зарегистрирован = Лендинг

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



2022-02-14 09:09:36,024 ERROR NT AUTHORITY\SYSTEM ProcessEngine RunProcesses - Error while running process [b82822ff-3b39-447d-8658-c57fe5f807bf] for Lead (Id: [f2a32245-c0fa-4756-b6d0-a5049583c651])

System.InvalidOperationException: Failed to get the context for the background operation. For services without authorization it is necessary to call Terrasoft.Web.Common.SessionHelper.SpecifyWebOperationIdentity.

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

Здравствуйте, коллеги.

У меня непонятная проблема с Мастером Детали. Не удается создать новую деталь.
Сделал так:
1. Создал объект. Отнаследовал его от "Базовый объект". Разметил колонки.
2. Открыл мастер деталей. Указал название и выбрал этот объект. Настроил Страницу.
3. Нажал сохранить и.. все повисло на "регистрация страниц".

В консоли браузера:

 message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Argument with name is either null or empty; argumentName: query
 stack: undefined

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

SysModuleEntity_SysModuleEntityManager_69b321a985044103944f31db7bfc135a

Как это разрулить?

Нравится

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

Добрый день, Евгений.

Скорей всего ошибка возникает по причине неправильной зависимости пакетов или же некорректно установленной системной настройки "Текущий пакет". Также Вам стоит скомпилировать конфигурацию что бы проверить наличие ошибок.

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

Добрый день, Илья.

Компиляция не возвращает ошибок.

У меня вообще полный кейс, это создание страницы редактирования записи справочника с деталью (типа "Каналы Лида").

Евгений, здравствуйте!

Обратите внимание в каком пакете был добавлен объект для детали и какой пакет указан в системной настройке "Текущий пакет". Также, проверьте корректные зависимости данного пакета.
Вероятно, что в текущем пакете у Вас указан Ваш пакет, у которого не корректная зависимость.
Для того, чтобы это проверить установите текущий пакет "Custom", перезайдите в систему(через кнопку "Выйти") и повторите процесс создания детали. Если ошибка не будет воспроизводится, то проблема в зависимостях пакета, который сейчас указан в системной настройке "Текущий пакет".

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

В исходных кодах часто встречается использование свойства initMethod, например

...
"Recommendation": {
        dataValueType: this.Terrasoft.DataValueType.MAPPING,
        type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
        caption: resources.localizableStrings.RecommendationCaption,
        initMethod: "initProperty",
        isRequired: false,
        doAutoSave: true
},
...

Но не совсем понятен смысл, и как его использовать в пользовательских атрибутах
(и можно ли вообще ?)
По идее этот метод должен вызываться при первичном инициализации значения аттрибута или нет ?

PS: Здравый смысл показывает что можно бы забиндить "value" атрибута на метод, для первичной инициализации - но

"value": {bindTo: "MyMethod"}

не приводит к вызову метода, и установке значения.
Я начал искать альтернативы и нашел вот этот initMethod, но сдается мне это тоже не то... установив для своих атрибутов initMethod он тоже так и не был вызван.

Нравится

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

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

Пример реализации и вызова функции указанного в атрибуте можете посмотреть в схеме ProcessFlowElementPropertiesPage.

Пример кода:

initParameters: function(element) {
	this.initDesignerType();
	Terrasoft.each(this.columns, function(columnConfig, columnName) {
		if (columnConfig.initMethod) {
			var parameter = element.findParameterByName(columnName);
			this[columnConfig.initMethod](parameter);
		}
	}, this);
},

Пример реализации метода:

initProperty: function(parameter) {
	var parameterName = parameter.name;
	this.set(parameterName, this.getParameterValue(parameter));
},

Метод initParameters вызовется в момент создании экземпляра схемы/модуля.

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

Имеется ли все таки возможность установить инлайновые стили на этапе объявления элемента в схеме ?
В исходных кодах найдено неоднократное использование аттрибута конфигурационного элемента "styles"
В который передается дочерний объект содержащий стили в виде ассоциативного массива.

...
        styles: {
                textStyle: {
                        margin: '0px 10px 0px 0px'
                }
        },
...
        styles: {
                wrapStyles: {
                        margin: "18px 0px 0px " + (35 * index) + "px"
                }
        },
...
        styles: {
              wrapperStyle: {
                        'float': 'right'
              }
         },

Причем ключ дочернего объекта мне по встречался 3-х вариантов:
wrapperStyle
wrapStyles
textStyle
Судя по всему в этом есть смысл...
А началось собственно все с найденного в исходниках модуля Switcher:
/**
* Объект для спецификации inline-стилей компонента указанных в шаблоне.
* Если в {@link #tpl шаблоне} указано имя стиля, то в объекте стилей должно быть свойство с таким же имененм.
* Если свойство со стилями не будет найдено, то атрибут со стилями будет удален из шаблона. Специфицировать
* стили компонента можно в любом из двух методов {@link #getTpl getTpl()} и {@link #getTplData getTplData()}.
* @overridden
* @type {Object}
*/

styles: {
wrapStyles: {},
innerWrapStyles: {},
trueValueStyle: {},
falseValueStyle: {}
},

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

Подскажите найденные в исходных кодах примеры - это какие-то частные случаи ?
Или я что-то делаю не так ?
Существует ли штатный способ добавления инлайновых стилей к врапперам объектов, на этапе объявления их конфигурационных объектов в схемах ?

Нравится

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

Вы про это?

{
	"operation": "insert",
	"name": "HeaderContainer",
	"parentName": "MainContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.CONTAINER,
		"generateId": false,
		"styles": {
			"padding-bottom": "3em",
			"min-height": "3.2em",
			"margin-left": "-8px"
		},
		"items": []
	}
}

Вроде как в styles у элемента можно что угодно прописать. Но это не точно)
Лучше смотреть, какой у элемента wrapper, добавлять в него класс, а класс описывать в отдельном модуле.
Отдельный привет ребятам из терика, по конфигурации разбросаны: wrapClass, wrapperClass, wrapClasses, wrapClassName и т.п.
У - Унификация

"Варфоломеев Данила" написал:Вроде как в styles у элемента можно что угодно прописать. Но это не точно)

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

С классами - все ясно, но блин создавать целый модуль отдельный чтобы на 2 пикселя паддинг поправить, это как-то "из пушки по воробьям".
А добиться к элементу через Ext.select().setStyle - по какому ни будь Ready Event ну уж как-то "пахнет костылями"
Кстати штатные браузерные "window.onload" и "document.addEventListner('DOMContentLoaded'..." - почему-то фейлятся, штатный Ext.onReady почему-то стартует еще до отрисовки
Так что приходится подбирать подходящий метод из событийной модели самго BPMOnline.

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

Немного про style && class: При создании шаблона и использования в верстке тегов style и class надо использовать свойства styles и classes. styles - это объект в котором можно задавать набор свойств стилей для тегов style шаблона. classes - объект, свойства которого - массивы.
Например:

tpl: [
    '<div style = "{wrapStyle}" class = "{wrapClass}">',
        '<span id = "{id}" class = "{labelClass}" style = "{labelStyle}">{text}',
        '</span>',
    '</div>'
],
classes: {
    wrapClass: ['wrap', 'wrap-important', 'top-element'],
    labelClass: ['wrap-el', 'label', 'caption-el']
},
styles: {
    wrapStyle: {
        backgroundImage: this.image
    },
    labelStyle: {
        font: this.font,
        whiteSpace: this.getWrapStyle(this.wrap)
    }
}

wrapStyle, labelStyle - объекты задающие стили для конкретных елементов шаблона (напр. div, span, p, ...)
Также, при создании собственного шаблона рекомендуется указать шаблон id="{id}".
Пример: ' id="{id}">...'
В указанных случаях в объекте tplData устанавливать эти свойства не надо, перед формированием шаблона стили и классы анализируются и подменяются актуальными значениями из соответствующих свойств. Если в компоненте не будут указаны стили, атрибут style будет автоматически удален из шаблона.

Так же рекомендую почитать статью.

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

Добрый день, подскажите, пожалуйста можно ли реализовать, чтобы для записи в реестре детали можно было вызвать действие “изменить” при двойном клике на строке детали?

Нравится

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

Коллеги, добрый день! На дев площадке добавили колонки в разделы Контрагенты, Конфигурации и Обращения. После добавления разделы отображались корректно. После фиксации изменений, обновления пакета из хранилища на прод площадку и последующей компиляции конфигурации, разделы Конфигурации и Обращения стали отображаться некорректно. В разделе Конфигурации при открытии существующей записи отображается окно новой записи: https://yadi.sk/d/kHsdJtiL3Gg3Wd , в консоли появляются следующие ошибки https://yadi.sk/d/sXIPRxkn3Gg3eF,приложение ругается на новые колонки (Недопустимое имя столбца) В разделе Обращения при открытии записи не отображается номер обращения https://yadi.sk/d/JuO8WvQ63Gg3sq в консоли также появляются аналогичные ошибки из-за созданных колонок https://yadi.sk/d/slVgPRYq3Gg3z3 Есть способ лечения ошибок с помощью удаления этих колонок с помощью мастера раздела и из конфигурации, последующей фиксации изменений в хранилище и переносе обратно на дев площадку, но это неправильно. Также после обновления пакета из хранилища, возникает ошибка для пользовательского бизнес процесса https://yadi.sk/d/gn6EsdX33Gg6zc
Какова природа данной проблемы?

Нравится

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

Я, конечно, не разработчик, но в почему всё в пакете Custom? Его же, вроде, нельзя корректно перенести.

"Сидоров Александр Валерьевич" написал:всё в пакете Custom?

Разве? всё вроде как в пакете WS_FirstOfd
"Голикова Елена Евгеньевна" написал:Какова природа данной проблемы?

Вы только компилировали? Или делали все 5 шагов? (генерация-компиляция-данные-скрипты-обновление структур)?

"Варфоломеев Данила" написал:Разве? всё вроде как в пакете WS_FirstOfd

Да, Вы правы. На этом скрине мне показалось, что открыт пакет Custom https://yadi.sk/d/gn6EsdX33Gg6zc

"Варфоломеев Данила" написал:
Сидоров Александр Валерьевич пишет:

всё в пакете Custom?

Разве? всё вроде как в пакете WS_FirstOfd

Голикова Елена Евгеньевна пишет:

Какова природа данной проблемы?

Вы только компилировали? Или делали все 5 шагов? (генерация-компиляция-данные-скрипты-обновление структур)?


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

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

Ответ на вопрос "Какова природа данной проблемы?" - различие между тестовой средой и продуктовой среда, на прод вносятся изменения на прямую миную тест.

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

  • Убедитесь в корректности зависимостей пакетов и их соответствие между тест и прод средой
  • Откройте все объекты участвующие в разделе, убедитесь, что все поля заполнены корректно, после чего пересохраните и опубликуйте. Все возникшие конфликты устраните
  • Переоткройте каждую схему/модуль раздела и пересохраните/скомпилируйте
  • Откройте процесс и выполните его пересохранение, возникшие ошибки устраните

Не забудьте все исправления внести тестовую среду.

Обратите внимание на системную настройку SchemaNamePrefix на прод среде, она должна совпадать с настройкой на тест среде.

"Терещук Павел" написал:

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

Ответ на вопрос "Какова природа данной проблемы?" - различие между тестовой средой и продуктовой среда, на прод вносятся изменения на прямую миную тест.

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

  • Убедитесь в корректности зависимостей пакетов и их соответствие между тест и прод средой
  • Откройте все объекты участвующие в разделе, убедитесь, что все поля заполнены корректно, после чего пересохраните и опубликуйте. Все возникшие конфликты устраните
  • Переоткройте каждую схему/модуль раздела и пересохраните/скомпилируйте
  • Откройте процесс и выполните его пересохранение, возникшие ошибки устраните

Не забудьте все исправления внести тестовую среду.

Обратите внимание на системную настройку SchemaNamePrefix на прод среде, она должна совпадать с настройкой на тест среде.


Помогла пошаговая компиляция и сохранение всех объектов и схем. Префиксы названий объектов были настроены на обоих площадках корректно. Спасибо

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

Здравствуйте, необходимо, чтобы после изменения данных контакта менялся ответственный на пользователя, который совершил изменения,
создали бизнес-процесс:

Сигнал – изменение записи любого поля контакта
Изменить данные контакта, где id = сигнал.Id записи, установить ответственный = контакт текущего пользователя

Однако БП уходит в бесконечный цикл, если добавить условие  |ответственный не равно контакт текущего пользователя| в блок “Изменить данные”, то БП в цикл не уходит, но и ответственный не меняется.
Подскажите, пожалуйста в чем ошибка?

Нравится

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

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

В процессе добавлен сигнал по изменению любого поля в объекте, при этом в рамках этого же процесса происходит изменение поля. В результате процесс зацикливается.
Для решения задачи измените режим в стартовом сигнале Ожидать изменения = Любого поля из выбранных (вместо любого поля). Выберите все поля, кроме Ответственный.

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

Добрый день, подскажите, пожалуйста, как можно реализовать sql запрос на удаление данных в элементе "Задание- сценарий" БП или же в схеме карточки:

DELETE FROM [dbo].[Lead] WHERE [Id] = 'c6deb935-c86e-44f6-9101-eec17473c1df'

В БП в сценарии таким способом не выходит подключить userConnection:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using Terrasoft.Common;
using Terrasoft.Core;
using Terrasoft.Core.DB;
using Terrasoft.Core.Entities;
var delete = new Delete(userConnection)
.From("Lead")
.Where("Id").IsEqual(Column.Parameter("{c6deb935-c86e-44f6-9101-eec17473c1df}"));
return true;

Нравится

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

Добрый день, Мария!

Вы можете получить экземпляр UserConnection следующим образом:

UserConnection UserConnection = Get("UserConnection");

Спасибо, теперь возникает ошибка:

The type arguments for method 'Terrasoft.Core.Process.ProcessModel.Get(string)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

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

"Maria H" написал:пасибо, теперь возникает ошибка:

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

var userConnection = Get<UserConnection>("UserConnection");
Показать все комментарии