Добрый вечер, подскажите, пожалуйста, как можно реализовать задачу с помощью бизнес-процессов: допустим, если активность была создана в чт после 17:00, то установить время завершения активности и запуск блока “Изменить данные” на след. день на в 11:00.

Нравится

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

Мария, добрый день!
Для решения задачи вам помогут такие свойства:
https://msdn.microsoft.com/ru-ru/library/system.datetime.dayofweek(v=vs…
https://msdn.microsoft.com/en-us/library/system.datetime.minute(v=vs.11…
Можно разделить Дату создания на составляющие и записать результат в параметры процесса.
1. Первый параметр (условно CreatedOnDayOfWeek) будет хранить день недели, когда создана активность.
Примечание! Можно получить день недели в виде числа: Convert.ToInt32(currentDateTime.DayOfWeek), где вместо currentDateTime - подставить параметр с датой создания активности
2. Второй параметр (условно Hour) будет хранить час.

Дизайен процесса:
1. Стартовый сигнал по добвлению активности.
2. Читать данные в активности, где Id = Пункт 1. Id
После пунтк 2 добавить условный поток. В условном потоке проверять: (CreatedOnDayOfWeek ==4) && (Hour> 17)
3. Изменить данные в активности, где Id = Пункт 2. Id. Установить новую дату завершения

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

Добрый день, как добавить аудиоплеер на страницу для прослушивания записей звонков из bpm . bpm 7.7

Нравится

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

Здравствуйте.
Возможность прослушивать записи звонков зависит от используемой интеграции. Поддерживается в Oktell и Webitel. Плеер там уже присутствует. Подробнее описано здесь: https://academy.terrasoft.ru/documents/sales-team/7-9/zapis-i-proslushi…

Попробуйте:

var element = document.createElement("audio");
element.addEventListener("click", function(e) { e.stopPropagation(); }, false);
element.autoplay = true;
element.controls = true;
element.src = /**сюда url ссылку на сурс(пр.: запись звонка в wav формате)**/;
element.style.marginLeft = "5px";
element.type = "audio/mpeg";
var actionsDiv = Ext.get("AudioContainer").dom;
var lastChild = actionsDiv.children[actionsDiv.childElementCount - 1];
if (lastChild) {
	actionsDiv.removeChild(lastChild);
}
actionsDiv.appendChild(element);

контейнер для элемента

{
	"name": "AudioContainer",
	"operation": "insert",
	"parentName": "Detail",
	"propertyName": "tools",
	"index": 2,
	"values": {
		"id": "AudioContainer",
		"items": [],
		"itemType": Terrasoft.ViewItemType.CONTAINER
	}
}

"Варфоломеев Данила" написал:

Попробуйте:

var element = document.createElement("audio");

element.addEventListener("click", function(e) { e.stopPropagation(); }, false);

element.autoplay = true;

element.controls = true;

element.src = /**сюда url ссылку на сурс(пр.: запись звонка в wav формате)**/;

element.style.marginLeft = "5px";

element.type = "audio/mpeg";

var actionsDiv = Ext.get("AudioContainer").dom;

var lastChild = actionsDiv.children[actionsDiv.childElementCount - 1];

if (lastChild) {

        actionsDiv.removeChild(lastChild);

}

actionsDiv.appendChild(element);

контейнер для элемента

{

        "name": "AudioContainer",

        "operation": "insert",

        "parentName": "Detail",

        "propertyName": "tools",

        "index": 2,

        "values": {

                "id": "AudioContainer",

                "items": [],

                "itemType": Terrasoft.ViewItemType.CONTAINER

        }

}


Данил не могли бы Вы выслать полный код

"Варфоломеев Данила" написал:

Попробуйте:

var element = document.createElement("audio");

element.addEventListener("click", function(e) { e.stopPropagation(); }, false);

element.autoplay = true;

element.controls = true;

element.src = /**сюда url ссылку на сурс(пр.: запись звонка в wav формате)**/;

element.style.marginLeft = "5px";

element.type = "audio/mpeg";

var actionsDiv = Ext.get("AudioContainer").dom;

var lastChild = actionsDiv.children[actionsDiv.childElementCount - 1];

if (lastChild) {

        actionsDiv.removeChild(lastChild);

}

actionsDiv.appendChild(element);

контейнер для элемента

{

        "name": "AudioContainer",

        "operation": "insert",

        "parentName": "Detail",

        "propertyName": "tools",

        "index": 2,

        "values": {

                "id": "AudioContainer",

                "items": [],

                "itemType": Terrasoft.ViewItemType.CONTAINER

        }

}


Данил не могли бы Вы выслать полный код

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

Добрый день.
Задача: при сохранении карточки контрагента производить проверку - а не существует ли уже в системе контрагента с таким же значением поля UsrParametr1.
Я переопределила метод save() в карточке контрагента. Произвожу поиск с помощью EntitySchemaQuery - если в качестве результата мне вернулось кол-во записей > 1, значит запись с таким UsrParametr1 существует и я просто вывожу сообщение и не сохраняю карточку контрагента.
Но если же же записей 1, то я должна вызвать базовый метод save, который произведет сохранение карточки. При вызове this.callParent(arguments); появляется ошибка и карточка не сохраняется.
Подскажите, как решить данную проблему?

Переопределенный метод save():

save: function() {
        var param = this.get("UsrParametr1");
        var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: "Account"
        });
        esq.addColumn("UsrParametr1", "UsrParametr1");
        var filter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrParametr1", param);
        esq.filters.add("filter", filter);
        esq.getEntityCollection(function(result) {
                if (!result.success) {
                        this.showInformationDialog("Ошибка");
                        return;
                }
               
                if (result.collection.collection.items.length > 1)
                {
                        this.showInformationDialog("Нельзя сохранить");
                        return;
                }
                this.callParent(arguments); // не отрабатывает, появляется ошибка
        }, this);
}

Нравится

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

Добро пожаловать в мир асинхронных вычислений!
Для наглядности:

esq.getEntityCollection(callback, scope);

т.е программа заходит в функцию save, бежит до esq.getEntityCollection, и после него функция save завершается. Далее спустя некоторое время приходит callback, вызывается функция с параметром result

function(result) {
                if (!result.success) {....

Беда в том, что внутри неё ни о каком callParent() и речи быть не может. (ибо вы находитесь внутри самописной функции, у неё нет родителя для вызова).

В качестве дико кривого варианта:

save: function(parameter) {
if (!parameter) {this.checkField()}
else {this.callParent(arguments)}
}
 
checkField: function() {
//тут esq запрос и в callback-е, если все условия сходятся (записей < 1 в вашем случае), вызываете this.save(true);
}

или

сделать по-умному: в объекте создать событийный подпроцесс (перед сохранением или проверка записи, тут надо примеры в конфигурации посмотреть), в подпроцессе проверять условия и в зависимости от них принимать решение... Но это все скучно, к тому же придется кодить на C#.

Как-то так. Костыли - наше все.

Лучше в Validation это делать, наверное

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

getParentMethod: function() {
	var method,
		superMethod = (method = this.getParentMethod.caller) && (method.$previous ||
			((method = method.$owner ? method : method.caller) &&
			method.$owner.superclass[method.$name]));
	return superMethod;
},
 
 
save: function() {
		var parentSave = this.getParentMethod();
		var parentArguments = arguments;
 
        var param = this.get("UsrParametr1");
        var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: "Account"
        });
        esq.addColumn("UsrParametr1", "UsrParametr1");
        var filter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrParametr1", param);
        esq.filters.add("filter", filter);
        esq.getEntityCollection(function(result) {
                if (!result.success) {
                        this.showInformationDialog("Ошибка");
                        return;
                }
 
                if (result.collection.collection.items.length > 1)
                {
                        this.showInformationDialog("Нельзя сохранить");
                        return;
                }
                //this.callParent(arguments); // не отрабатывает, появляется ошибка
				parentSave.apply(this, parentArguments);
        }, this);
}

Елена, в Вашем первоначальном коде, достаточно в коллбэкке esq-запроса, вызывать не this.callParent(argumеnts); а непосредственный метод "save" у контекста. При необходимости сохранив в текущем контексте аргументы изначально передаваемые в метод, и установив специальный флаг реагируя на повторный вызов.

save: function() {
    //Проверка на повторный вызов из асинхронной функции запроса.
    if (this.saveRecallFlag) {
        //сбросим флаг повторного вызова
        this.saveRecallFlag = false;
        //стандартное сохранение
        this.callParent(arguments);
    } else {
        //Если нет - выполняем логику:
        var param = this.get("UsrParametr1");
        var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: "Account"
        });
        esq.addColumn("UsrParametr1", "UsrParametr1");
        var filter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrParametr1", param);
        esq.filters.add("filter", filter);
        //Перед асинхронным вызовом, сохраним набор аргументов с которым был вызван метод в текущем контексте
        //Мы именно клонируем массив, т.к. в момент вызова асинхронной функции, псевдомасив arguments будет
        //содержать параметры вызова коллбэка.
        this.saveArgumentsRecallBuff = _(arguments).clone();
        //Установим в текущий контекст специальный флаг, который позволит проигнорировать логику проверки
        //при повторном вызове
        this.saveRecallFlag = true;
        esq.getEntityCollection(function(result) {
                if (!result.success) {
                        this.showInformationDialog("Ошибка");
                        return;
                }
 
                if (result.collection.collection.items.length > 1)
                {
                        this.showInformationDialog("Нельзя сохранить");
                        return;
                }
                this.save(this.saveArgumentsRecallBuff); // не отрабатывает, появляется ошибка
        }, this);
    }
}
Показать все комментарии

Здравствуйте!
В версии 3.4.0.38 появилась задача почистить дубли по контрагентам и контактам, их очень много. Читала, что в BPMonline есть возможность поиска дублей, но здесь только ручной поиск и ручное объединение записей, так как системная функция поиска находит только несколько записей (наименование у дублей могут быть на разных языках, а полное наименование заполнены по разному у одних и тех же КА например)

Подскажите пожалуйста как лучше решить данный вопрос.

Нравится

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

Здравствуйте, Светлана!

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

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

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

Здравствуйте, Светлана!

Для того, чтобы установить причину, проверьте следующее:

1) подключили ли Вы свою хранимую процедуру (проверить можно в окне настройки правил поиска дублей), так как если Вы внесли изменения в базовую процедуру поиска дублей, то они могли перезаписаться назад, например, при пересохранениии таблицы.
2) запустите SQL Profiler и посмотрите, какая хранимая процедура отрабатывает и какой у неё текст.

Спасибо! Эту часть уже сделала, нужно было изменить фильтры для связи. Незнаю как здесь удалить опубликованные(( Тормознулась на подсчете количества, Вы мне ответили в другом топике http://www.community.terrasoft.ru/forum/topic/24760.

Здравствуйте, Светлана!

Относительно Вашего вопроса, попробуйте установить точку останова в функции PrepareSearchResults() скрипта wnd_ViewSearchResultScript и выполнить пошаговую отладку именно этой функции.

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

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

Версия 7.9.

На странице контрагента (также контакта и т.д.) есть деталь Адреса. При добавлении адреса открывается страница добавления. Её же можно открыть и при изменении адреса.

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

Как в этом случае войти в дизайнер, или как ещё можно добавить поле (только через diff в схеме, или ещё какие-то способы есть?)

Нравится

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

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

Нравится

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

Здравствуйте, Михаил.

Вам необходимо:

1) Заместить схему карточки на которой выведена данная деталь.
2) Добавить в секции diff для данной детали свойство visible ссылающееся виртуальный атрибут булевого типа имеющий значение по умолачанию true.
3) Заместить схему детали и добавить обработчик события изменения атрибута GridData

init: function() {
   this.callParent(arguments);
   this.on("change:GridData", function(){
      //some code
   }, this);
}

4) В обработчике (пункт 3) проверять количество элементов в GridData. Если больше нуля - публиковать сообщение.

5) В схеме карточки основываясь на сообщении изменять значение виртуального атрибута.

Сообщения sandbox подробно обсуждались тут.

"Мотков Илья" написал:

Здравствуйте, Михаил.

Вам необходимо:

1) Заместить схему карточки на которой выведена данная деталь.

2) Добавить в секции diff для данной детали свойство visible ссылающееся виртуальный атрибут булевого типа имеющий значение по умолачанию true.

3) Заместить схему детали и добавить обработчик события изменения атрибута GridData

init: function() {

   this.callParent(arguments);

   this.on("change:GridData", function(){

      //some code

   }, this);

}

4) В обработчике (пункт 3) проверять количество элементов в GridData. Если больше нуля - публиковать сообщение.

5) В схеме карточки основываясь на сообщении изменять значение виртуального атрибута.

Сообщения sandbox подробно обсуждались тут.


А есть явный какой-то пример в исходниках чтобы на него акцент делать?

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

К примеру атрибут можно jобьявить следующим образом:

attributes: {
	IsEmailVisible: {
		dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
		type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		value: true
	}
},

Пример привязки видимости детали Email к атрибуту:

{
	"operation": "merge",
	"name": "Email",
	"values": {
		"visible": {
			bindTo: "IsEmailVisible"
		}
	}
},

"Мотков Илья" написал:

4) В обработчике (пункт 3) проверять количество элементов в GridData. Если больше нуля - публиковать сообщение.


А проверять DataGrid по средствам esq или как-то иначе можно? Или можно как то читать то, что находится на самой детали, чтобы каждый раз в базу не ходить?

GridData это атрибут схемы детали. Получить его можно через код:

var gridData = this.get("GridData");

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

В целом GridData отвечает за реестр детали.

"Мотков Илья" написал:

GridData это атрибут схемы детали. Получить его можно через код:

var gridData = this.get("GridData");

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

В целом GridData отвечает за реестр детали.

init: function() {
	this.callParent(arguments);
	var gridData = this.getGridData();
	this.reloadGridColumnsConfig(true);
	if (gridData && gridData.getCount() > 0) {
		this.sandbox.publish("MessageGridCount", {
			stateObj:
				{
					valuePairs: [{name: "DataGridCount", value: gridData.getCount()}]
				}
		});
	}
}

Поле gridData в консоли указывает что undefined. Как с этим бороться? За пример брал реализацию в BaseGridDetailV2.
Так же ваш пример (var gridData = this.get("GridData");) тоже самое выдает в консоли.

Попробуйте получать GridData в методе после его загрузки:

afterLoadGridData: function() {
this.callParent(arguments);
var gridData = this.get("GridData");
},

"Максим Шевченко" написал:

Попробуйте получать GridData в методе после его загрузки:

afterLoadGridData: function() {

this.callParent(arguments);

var gridData = this.get("GridData");

},


Попробовал, но тоже никак.
http://prntscr.com/dy1c0z

Получить значение GridData можно обратившись к атрибуту Collection (this.get("Collection")) или же вызвав метод getGridData который в свою очередь обратится к атрибуту Collection и вернет результат.

Получать актуальное количество записей в GridData возможно заместив обработчик события dataLoaded атрибута Collection. Пример:

onGridLoaded: function() {
this.callParent(arguments);
var count = this.getGridData().collection.items.length;
}

Прошу прощения за неточность. Публиковать сообщение не нужно, по скольку логика добавления записи (как собственно и кнопка +) расположена в BaseGridDetalV2 (элемент AddRecordButton).

"Мотков Илья" написал:

Прошу прощения за неточность. Публиковать сообщение не нужно, по скольку логика добавления записи (как собственно и кнопка +) расположена в BaseGridDetalV2 (элемент AddRecordButton).


Спасибо, но я заодно и с песочницей разобрался, на будущее.

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

Добрый день.
Пишу: Если в справочном поле OriginEdit выбрали значение с ИД ceb02546-179e-4c11-b959-df488f53f799 , то справочное поле SRTypeEdit должно автоматически заполниться значением с ИД dc284b1f-be17-402b-9134-1836d4b1f21f . Не пойму , как написать на С#, не получатся так: (Guid)Page.SRTypeEdit.Value = SRTypeId;

Guid sost = new Guid("ceb02546-179e-4c11-b959-df488f53f799");
var sost1 = (Guid)Page.OriginEdit.Value;

var SRTypeId = new Guid("dc284b1f-be17-402b-9134-1836d4b1f21f");

string s = "ИД Задачи ";
if (sost1 == sost)
{
Page.SymptomsEdit.Value = s;
//(Guid)Page.SRTypeEdit.Value = SRTypeId;

}

return true;

Нравится

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

Для установки значения в справочное поле используется метод SetValueAndText.
Где найти примеры его использования — вы знаете.

Подскажите, как вытащить наименование SRType, зная SRTypeId?

Page.SRTypeEdit.SetColumnValueAndText(SRTypeId, SRType.Name);

Для этого есть функция GetEntityTypedColumnValue.

В карточке Инцидента в обработчике события (по факту выбора в поле OriginEdit выбрали значение с ИД ceb02546-179e-4c11-b959-df488f53f799) мне нужно, чтобы автоматически заполнилось поле SRTypeEdit значением, соответствующим ИД dc284b1f-be17-402b-9134-1836d4b1f21f. Пишу:

Guid dir = new Guid("ceb02546-179e-4c11-b959-df488f53f799");
var dir1 = (Guid)Page.OriginEdit.Value;

Guid SRTypeId = new Guid("dc284b1f-be17-402b-9134-1836d4b1f21f");
string SRTypeName = Terrasoft.Configuration.CommonUtilities.GetEntityTypedColumnValue(UserConnection, "Incident", "SRType", SRTypeId);

string s = "ИД Задачи ";
if (dir1 == dir)
{
Page.SymptomsEdit.Value = s;
Page.DataSource.ActiveRow.SetColumnValue("SRTypeId", SRTypeName);

}

return true;

Опубликовывает без ошибок. При выборе в карточке Инцидента в поле OriginEdit - ошибка :

Date: 25.01.2017 11:54:53
Date (UTC): 25.01.2017 8:54:53

Exception Message: Элемент с именем "Incident" не найден
Exception Type: Terrasoft.Common.ItemNotFoundException
Exception Source: Terrasoft.Core

Пожалуйста, подскажите, как исправить эту ошибку. Заранее спасибо

Это значит, что в базе нет таблицы с указанным именем.

"Зверев Александр" написал:

Это значит, что в базе нет таблицы с указанным именем.


заменила Incident на ServiceRequest

в итоге - Опубликовывает без ошибок. Но при выборе в карточке Инцидента в поле OriginEdit - ничего не подставилось

Используйте отладку.

а нужно использовать SetColumnValue или SetValueAndText ? Если SetValueAndText - то пишет ошибку "не содержит определение для SetValueAndText . Пропущена директива using или ссылка на сборку"

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

Guid dir = new Guid("ceb02546-179e-4c11-b959-df488f53f799");
var dir1 = (Guid)Page.OriginEdit.Value;

Guid SRTypeId = new Guid("dc284b1f-be17-402b-9134-1836d4b1f21f");
string SRTypeName = Terrasoft.Configuration.CommonUtilities.GetEntityTypedColumnValue(UserConnection, "ServiceRequest", "SRType", SRTypeId);

string s = "ИД Задачи ";
if (dir1 == dir)
{
Page.SymptomsEdit.Value = s;
Page.DataSource.ActiveRow.SetColumnValue("SRTypeId", SRTypeId);
Page.SRTypeEdit.SetValueAndText(SRTypeId, SRTypeName);

}

return true;

В итоге: опубликовало без ошибок. Но: когда я открываю карточку Инцидента и выбирают определенный Origin (происхождение инцидента), то в поле авт-ки не подтягивается нужный мне SRType (Тип обращения). А вот при сохранении этой карточки Инцидента и открытии ее на изменение - в поле SRType отображается нужный мне тип обращения. Для сравнения - если я беру другой Origin , сохраняю карточку Инцидента и открываю ее вновь - поле SRType не заполнено. Т.е., в принципе-то, алгоритм работает. Подскажите, пожалуйста, как сделать так, чтобы поле SRType заполнялось сразу же при выборе опред.Origin, а не после повторного открытия карточки. Заранее спасибо

Попробуйте провести отладку и посмотреть, какое значение в какую переменную попадает.
Затем исправьте ошибки в своём коде.

Не попадает в переменную string SRTypeName.

Не пойму, как взять именно наименование SRTypeName, если известен SRTypeId?

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

У меня все получилось:

Guid dir = new Guid("ceb02546-179e-4c11-b959-df488f53f799");
var dir1 = (Guid)Page.OriginEdit.Value;

Guid SRTypeId = new Guid("dc284b1f-be17-402b-9134-1836d4b1f21f");

var SRTypeName =Terrasoft.Configuration.CommonUtilities.GetEntityTypedColumnValue(UserConnection, "SRType", "Name", SRTypeId);

string s = "ИД Задачи ";
if (dir1 == dir)
{
Page.SymptomsEdit.Value = s;

Page.DataSource.ActiveRow.SetColumnValue("SRTypeId", SRTypeId);
Page.SRTypeEdit.SetValueAndText(SRTypeId, SRTypeName);

}

return true;

И что?

все подставляется, как надо.

Мне кажется, что и без строки, где вызываете SetColumnValue, будет работать.

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

Добрый день!

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

Нравится

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

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

Доступ к справочникам ограничивается системной операцией с кодом CanManageLookups. Для решения задачи необходимо предоставить доступ к этой операции для нужной роли.

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

"Демьяник Алексей" написал:

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

Доступ к справочникам ограничивается системной операцией с кодом CanManageLookups. Для решения задачи необходимо предоставить доступ к этой операции для нужной роли.

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

Спасибо большое!

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

1) Хочу разработать модуль для bpmonline. Модуль не сложный, нужно ли мне разворачивать MSSQL локально, Visual Studio и т.д. или я смогу обойтись разделом "конфигурация"?

2) Не понимаю как писать "серверный код", создаю я в конфигурации объект "Исходный код", а дальше что? Где взять примеры? Например мне нужно сделать insert запрос к БД, нашел примеры тут на форуме на c# как работать с БД, но не нашел пример какой нужно создать класс, как его вызывать, где?

Нравится

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

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

1) Вы можете создавать схемы непосредственно в конфигурации приложения. Однако отладку серверной логики возможно произвести только подключившись к потоку IIS, используя Visual Studio.

2) Работа с CRUD операциями описана по ссылке:
https://academy.terrasoft.ru/documents/technic-sdk/7-9/crud-operacii-na…

Пример работы с данными вы можете найти в схеме AdministrationService.

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

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

Интересует следующий вопрос: к примеру, на страницу нужно подключить какой-либо jQuery плагин. Если точнее, речь идёт вот об этом сервисе https://dadata.ru/suggestions/usage/#address но это сейчас не важно.

Суть вот в чём: допустим, необходимо привязать действие к какому-либо элементу (например, полю) по id в DOM. Но страница генерится динамически, соответственно, подключать привязку нужно после того, как она загружена. Есть ли какой-либо метод, отслеживающий полное завершение инициализации, то есть момент, когда уже все элементы на странице загружены и доступны (поля, кнопки и т.д.) ? init, onEntityInitialized в этом случае, насколько я замечал, не подходят.

Версия 7.9, если что.

Нравится

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

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

Отловить момент полной загрузки карточки невозможно. Данное поведение связано с тем, что, начиная с версии 7.8, часть элементов карточки загружается асинхронно (табы, детали) отдельно от самой карточки. В целом, наиболее подходящим методом будет замещение метода onEntityInitialized и добавления логики после вызова this.callParent(arguments); В данный момент основные элементы страницы (edit-ты итд) уже загружены и доступны через document.getElementById

Илья, спасибо! Уже сам более-менее отследил, что onEntityInitialized всё же работает :)

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

Ну то есть, если я например, создам модуль вида:

define("UsrPlugin", ["jQuery"], function() {
	//Текст плагина из js файла, вроде этого https://cdn.jsdelivr.net/jquery.suggestions/16.10/js/jquery.suggestions.min.js
});

и добавлю jQuery в dependecies модуля, смогу ли я подключить потом этот модуль, и добавлять скрипт к нужному полю по id?

Денис, если правильно понял, то клиентские библиотеки подключаются как обычные JS модули, созданием в конфигурации схемы модуля на языке javascript. С описанием там логики через define, и использованием в других схемах через require. Пример в конфигурации, схема jQuery.

Также поищите в топиках:
- http://www.community.terrasoft.ru/forum/topic/20454
- http://www.community.terrasoft.ru/forum/topic/22101

Илья, спасибо.

Пока сделали немного по другому.

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