Я пытался переопределить кнопку копирования в разделе 

следующим образом , как показано тут https://community.terrasoft.ru/questions/pereopredelit-knopku-kopirovat

 getCopyRecordMenuItem: function() {
              return this.getButtonMenuItem({
                Caption: {"bindTo": "Resources.Strings.CopyMenuCaption"},
                Click: {"bindTo": "copyOrder"},
                Enabled: true,
                Visible: true
              });
            },

но при нажатии все равно вызывается стандартное поведение

Нравится

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

getCopyRecordMenuItem судя по всему относится в действию "копировать в детали". Вам же нужно изменить кнопку копировать в разделе. Лучше всего заместить метод:

copyRecord: function(primaryColumnValue) {

//ваш код

 },

getCopyRecordMenuItem судя по всему относится в действию "копировать в детали". Вам же нужно изменить кнопку копировать в разделе. Лучше всего заместить метод:

copyRecord: function(primaryColumnValue) {

//ваш код

 },

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

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

Можно как то в таком случае добавить в общий раздел действие по запуску БП и как это сделать

В данный момент пытаюсь запустить через 2(скрин), но если не получится то через 1

Изображение удалено.

Нравится

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

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

P.S

не, он выдал ошибку в моем коде, я ее поправил и снова процесс перестал реагировать.

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

Если процесс запускается по стартовому сигналу, то при запуске его вручную (нажав кнопку «Запустить») ни один элемент выполнятся не будет. Это входит в базовую логику системы, и в логику нотации BPMN.

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

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

 

Уже есть планы разъяснить этот момент в документации.

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

Добрый день, когда пытаюсь в разделе активность вывести все записи с типом Email, то ничего не отображается, хотя если произdодить поиск тем же способом через справочник, то все нормально выводитИзображение удалено.

 

Нравится

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

Добрый день.

В разделе [Активности] отображаются все активности, кроме email.

Для работы с письмами на маркетплейсе реализованы дополнительные разделы. Например, Email extension for Creatio.

Добрый день.

В разделе [Активности] отображаются все активности, кроме email.

Для работы с письмами на маркетплейсе реализованы дополнительные разделы. Например, Email extension for Creatio.

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

У меня есть деталь, она находится на странице заявки, мне нужно переопределить кнопку добавления на детали, что успешно сделал, но для моей логики мне надо отследить с какого именно раздела она была нажата и получить id, такое возможно?

Нравится

2 комментария
addRecord: function() {
              	var defaultValues = this.get("DefaultValues");
 
              	this.console.log("Данные")
              	this.console.log(defaultValues);
			 	this.showInformationDialog("Select All not implemented yet...");
 
 
			// 	//this.callParent(arguments);
 
			 },

Случайно нашел, в дефолт валуис =) содержится необходимая нам информация , айди и представление

Dima Avdoshin,

Все правильно там оно и лежит. Можете еще вывести console.log(this); там в values и не только можно найти интересные значения.

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

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

Добрый день

Имеется ли в црм облаке , способ получать файл напрямую к примеру document.docx

или это можно сделать только с помощью прикрепления на файлы и примечания

Если все таки только файлы и примечания, то как я могу прикрепить туда файл

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

Нравится

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

Если на карточке раздела есть деталь файлы и ссылки обычно это объект {SectionName}File. К примеру для активностей это ActivityFile. 

Вот пример создания записи на детали Файлы и ссылки. Вам необходимо получить поток с файлом и записать его в поле Data.

 

Stream stream = new MemoryStream(byteArray);

var size = Convert.ToInt32(stream.Length);

 

var insertActivityFile = new Terrasoft.Configuration.ActivityFile(context.UserConnection);

        insertActivityFile.Id = Guid.NewGuid();

        insertActivityFile.SetDefColumnValues();

        insertActivityFile.Name = "Name.txt";

        insertActivityFile.SetStreamValue("Data", stream);

        insertActivityFile.Size = size;

        insertActivityFile.TypeId = new Guid("529BC2F8-0EE0-DF11-971B-001D60E938C6");

        insertActivityFile.Version = 1;

        insertActivityFile.ActivityId = activityId;

        insertActivityFile.Save();

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

 

Если на карточке раздела есть деталь файлы и ссылки обычно это объект {SectionName}File. К примеру для активностей это ActivityFile. 

Вот пример создания записи на детали Файлы и ссылки. Вам необходимо получить поток с файлом и записать его в поле Data.

 

Stream stream = new MemoryStream(byteArray);

var size = Convert.ToInt32(stream.Length);

 

var insertActivityFile = new Terrasoft.Configuration.ActivityFile(context.UserConnection);

        insertActivityFile.Id = Guid.NewGuid();

        insertActivityFile.SetDefColumnValues();

        insertActivityFile.Name = "Name.txt";

        insertActivityFile.SetStreamValue("Data", stream);

        insertActivityFile.Size = size;

        insertActivityFile.TypeId = new Guid("529BC2F8-0EE0-DF11-971B-001D60E938C6");

        insertActivityFile.Version = 1;

        insertActivityFile.ActivityId = activityId;

        insertActivityFile.Save();

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

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

update SysPackage set InstallType = 0, IsChanged = 1, IsLocked = 1, Maintainer = 'Customer' where Name = 'CargoVR'Изображение удалено.

Нравится

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

Если полноценно, то скрипт разблокировки таков (!!!PackageName!!! заменяете названием своего пакета):

 

UPDATE "SysPackage"
SET "InstallType" = 0,
    "Maintainer" = (SELECT
      "TextValue"
    FROM "SysSettings"
    JOIN "SysSettingsValue"
      ON "SysSettingsValue"."SysSettingsId" =
        "SysSettings"."Id"
    WHERE "Code" = 'Maintainer'
    AND "SysSettingsValue"."SysAdminUnitId" = 'A29A3BA5-4B0D-DE11-9A51-005056C00008')
WHERE "Name" = '!!!PackageName!!!'
AND "SysWorkspaceId" IN (SELECT
  "Id"
FROM "SysWorkspace"
WHERE "Name" = 'Default')

 

Здравствуйте, Дима! А Вам, вероятно, нужен скрипт разблокировки для postgres.

Синтаксис на PostgreSQL немного отличается от mssql.

В вашем случае достаточно обернуть названия таблиц и колонок в кавычки.

update "SysPackage" set "InstallType" = 0, "IsChanged" = 1, "IsLocked" = 1, "Maintainer" = 'Customer' where "Name" = 'CargoVR'

Если полноценно, то скрипт разблокировки таков (!!!PackageName!!! заменяете названием своего пакета):

 

UPDATE "SysPackage"
SET "InstallType" = 0,
    "Maintainer" = (SELECT
      "TextValue"
    FROM "SysSettings"
    JOIN "SysSettingsValue"
      ON "SysSettingsValue"."SysSettingsId" =
        "SysSettings"."Id"
    WHERE "Code" = 'Maintainer'
    AND "SysSettingsValue"."SysAdminUnitId" = 'A29A3BA5-4B0D-DE11-9A51-005056C00008')
WHERE "Name" = '!!!PackageName!!!'
AND "SysWorkspaceId" IN (SELECT
  "Id"
FROM "SysWorkspace"
WHERE "Name" = 'Default')

 

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

Добрый день всем!

Можно ли в детали с редактируемым реестром сделать возможность вывода значения в процентах? То есть в БД будет лежать значение 0.2. А выводиться будет 20% (со знаком процента).

Пока в голову только пришла идея с добавлением строкового значения в таблицу в БД, в которой будет лежать строка "20 %" и соответственно её выводом, но такое решение некрасивое

Нравится

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

Линар, наверное, так будет действительно проще. Ещё можно смотреть в сторону доработки схемы ConfigurationGridUtilities, отвечающей за такой реестр: добавления там проверки на конкретное поле конкретного объекта и преобразовании в нужный вид при открытии в функции generateActiveRowControlsConfig и при сохранении в saveDataRow. Вопрос модификации редактируемого реестра с другой целью описан тут.

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

Добрый день, я сделал справочное поле мульти справочным

вот так

attributes: {
           "qrtClientAccountSigner": { // поле, в котором создаем мультилукап
              "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
              "multiLookupColumns": ["qrtContact", "qrtCounterparty"]  // перечисляем созданные нами колонки, которые будет содержать мультилукап
          }
        },

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

Нравится

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

Дмитрий, мультисправочное поле отображается только на карточке, реально данные хранятся не в поле, по которому назван компонент, а в одном из двух или более указанных в свойстве multiLookupColumns. Следовательно, в реестр нет смысла выводить пустое поле объекта, а нужно вывести те два справочных поля.

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

т.е вывести результат этого поля в реестре не выйдет?

и решение таковое, что выводим поля , по которым оно сформировано, а значения этих полей формируем при создании записи в мультисправочном поле

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

 

При выборе контрагента в мульти-поле Инвестор, контрагент сохраняется и в инвесторе и

Дублируется в поле Контрагент.

При выборе контакта в мультиполе Инвестор, Контакт заполняется в поле Контрагента, но сразу исчезает с детали

Из поля Инвестор, но в карточке детали в поле Инвестор отображается.

В другом объекте системы на подобной детали все наоборот. Сохраняются контракты в мультиполе на детали.

 

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

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

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

Изображение удалено.

Нравится

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

Посмотрите BaseOpportunityPage в пакете Opportunity поле OpportunityClient

 

 

"Client": {
	"caption": {"bindTo": "Resources.Strings.Client"},
	"dataValueType": this.Terrasoft.DataValueType.LOOKUP,
	"multiLookupColumns": ["Contact", "Account"],
	"isRequired": true
}
....
 
{
	"operation": "insert",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"name": "OpportunityClient",
		"values": {
	    	"bindTo": "Client",
			"layout": {"column": 0, "row": 1, "colSpan": 24},
			"tip": {
				"content": {"bindTo": "Resources.Strings.ClientTip"}
			},
			"controlWrapConfig": {
				"classes": {"wrapClassName": ["client-edit-field"]}
			},
			"controlConfig": {
				"enableLeftIcon": true,
				"leftIconConfig": {"bindTo": "getMultiLookupIconConfig"}
			}
		},
		"alias": {
			"name": "Client",
			"excludeProperties": ["layout"],
			"excludeOperations": ["remove", "move"]
		}
	}





 

Посмотрите BaseOpportunityPage в пакете Opportunity поле OpportunityClient

 

 

"Client": {
	"caption": {"bindTo": "Resources.Strings.Client"},
	"dataValueType": this.Terrasoft.DataValueType.LOOKUP,
	"multiLookupColumns": ["Contact", "Account"],
	"isRequired": true
}
....
 
{
	"operation": "insert",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"name": "OpportunityClient",
		"values": {
	    	"bindTo": "Client",
			"layout": {"column": 0, "row": 1, "colSpan": 24},
			"tip": {
				"content": {"bindTo": "Resources.Strings.ClientTip"}
			},
			"controlWrapConfig": {
				"classes": {"wrapClassName": ["client-edit-field"]}
			},
			"controlConfig": {
				"enableLeftIcon": true,
				"leftIconConfig": {"bindTo": "getMultiLookupIconConfig"}
			}
		},
		"alias": {
			"name": "Client",
			"excludeProperties": ["layout"],
			"excludeOperations": ["remove", "move"]
		}
	}





 

Владимир Соколов,

Хорошо я вроде понял щас попробую

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

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

 

Нравится

7 комментариев
var userConnection = Get<UserConnection>("UserConnection");
var esq = new EntitySchemaQuery(userConnection.EntitySchemaManager, <SchemaName>);
esq.AddAllSchemaColumns();
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, <FieldName>, fieldValue));
var enitites = esq.GetEntityCollection(userConnection);
ver entity = enitites.FirtsOrDefault();

Примерно так.

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

Правильнее будет перед этим дописать:

esq.RowCount = 1;

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

Дмитрий, а почему такие крайности, от 20000 к 1? Что именно Вы получаете и что потом с этими данными делаете? Может, подобрать оптимальный размер порции для обработки за раз?

Как пропустить часть записей с начала и выбрать следующие несколько, см. в теме.

Александр, спасибо за уточнение. Нашёл еще один подход.

public Entity GetEntity(UserConnection userConnection)
{
    var entitySchema = userConnection.EntitySchemaManager.GetInstanceByName(name);
    var esq = new EntitySchemaQuery(entitySchema);
    esq.AddAllSchemaColumns();
    return esq.GetEntity(userConnection, primaryColumnValue);
}

 

Тут всё зависит, сколько реально записей отфильтруется по такому условию. Если всегда 0 или 1, то можно и первым, и вторым Вашим способом. А если есть риск получить 100500 результатов, то лучше перестраховаться, ограничив количество в запросе.

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

у нас логи по 1с пишутся в системе, куда отправили , что отправили , также получаем данные из 1с, из-за этого логов за один проход чуть больше 100 получается каждые пол часа

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


Соответственно он не сможет дальше писать ничего , если при записи лога взял пулом 20 тыс записей разом

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

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

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

esq.RowCount = 1; // 20_000 - максимальный лимит

 

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