Уважаемые коллеги!

Подскажите пжл. - Как выделить в реестре активностей просроченные задачи красным цветом?

Нравится

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

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

Пример описан по ссылке:
https://academy.terrasoft.ru/documents/technic-sdk/7-8/kastomizaciya-ot…

В условии необходимо сравнивать значение поля Due с текущей датой/временем. Эту логику необходимо реализовать в схеме ActivitySectionV2.

Спасибо, Илья!

К сожалению, я не программист...
Не могли бы Вы помочь с кодом?

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

Юрий, вопрос не только в написании для вас кода, но и в том, чтобы вы его корректно применили не навредив приложению.
Именно поэтому, я рекомендую:
1. Изучить материал по разработке.
2. Рассмотреть вариант прохождения обучения по разработке.

На точечные вопросы готов ответить и оказать помощь.

Спасибо, Илья!

Я так и делаю... И даже курс разработки прошел...
Только, вот, попробуйте возьмите любой пример по программированию и увидите,ЧТО ДАВНО НАДО БЫЛО ПОМЕНЯТЬ ТЕКСТ РУКОВОДСТВА ПО ОБУЧЕНИЮ (см. материал в Академии)...

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

Здравствуйте.
Инструкция https://academy.terrasoft.ru/documents/technic-sdk/7-8/kastomizaciya-ot…
корректна для версии, для которой она и написана.
Вот код, который раскрасит все активности у которых дата\время завершения меньше текущей даты\времени:

define("ActivitySectionV2", [], function() {
	return {
		entitySchemaName: "Activity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			prepareResponseCollectionItem: function(item) {
					this.callParent(arguments);
					item.customStyle = null;
					var dueDate = item.get("DueDate");
					if (dueDate <= new Date()) {
						item.customStyle = {
							"color": "darkgrey",
							"background": "#FF8A8A"
						};
					}
				}
		}
	};
});
Показать все комментарии

Добрый день.

Хочу получить лид, который изменил определенный контакт, но почему то в БП при выборе

условий как в скриншоте появляется какая то сумма, что это такое и как от этого избавиться?
Заранее спасибо.

сумма

Нравится

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

Здравствуйте. Вы просто считываете из объекта "Контакт", а нужно из объекта "Лид", а после в фильтрах выбрать колонку "Изменил" и выбрать нужный контакт.

А если я хочу узнать фамилию этого контакта?
Логично считывать за 1 ход.
Если считывать за 2 хода, всегда появляется такая ошибка, при сохранении.
а

"Калёнов Дмитрий Алексеевич" написал:

А если я хочу узнать фамилию этого контакта?

Логично считывать за 1 ход.

Если считывать за 2 хода, всегда появляется такая ошибка, при сохранении.

а

В лиде мы должны считать колонку "Изменил", а в чтении контакта ее надо сравнивать с Id контакта.
И да, это нужно делать в 2 этапа.

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

Немного не понятна ценность такой задачи.
Есть два варианта решения:
1) Прочитать первую запись лида, которая была изменена определенным контактом (можно сделать в одну итерацию)
2) Прочитать, кто изменил лид (делается в два чтения данных).

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

Здравствуйте!
В sales enterprice 7.8 в организационной структуре добавляю на деталь Руководители руководителей для подразделения (перед этим проставив галку "Существует роль руководителей") https://yadi.sk/i/4h8HGHABykvEL, но пользователи, которых добавляю на эту деталь, после этого не могут войти в систему, возникает ошибка: https://yadi.sk/i/jddtLtGrykugX

Нравится

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

Добрый день, Анастасия!

Просьба уточнить:
1. Вы используете сборку с демо-наполнением или softkey версию, т.к. судя по 1 скриншоту это демка с ограничением на создание пользователей и работу с лицензированием пользователей?
Рекомендации:
1. Выполнить действие по актуализации ролей после любой работы в организационной структуре;
2. Скомпилировать конфигурацию и обновить структуру БД;
Если рекомендованные действия не помогут, то просьба указать ссылку на сайт, о котором идет речь для более детального анализа.

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

Здравствуйте! Мы удалили не нужные для нас состояния обращений (Отменено и Закрыто). Теперь у нас нету "Закрыто". Его роль исполняет Решено, хотя оно не имеет конечного состояния, так как обращение может быть переоткрыто после нового входящего письма содержащего в теме номер обращения.

Суть вороса: В разделе Обращения есть чекпоинт Отображать закрытые. Нужно его перенастроить чтобы он отображал или не отображал обращения со статусом "Решено".

Для решения єтого вопроса проделел шаги:

1. В конфигурации добавляю замещающий клиентский модуль
2. В качестве родительского обекта выбрал Section page schema - Cases
3. Добавил код:
define("CaseSection", ["BaseFiltersGenerateModule"],
function(BaseFiltersGenerateModule) {
return {
entitySchemaName: "Case",
contextHelpId: "1001",
mixins: {},
attributes: {},
diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
messages: {},
methods: {

initQueryFilters: function(esq) {
this.callParent(arguments);
var isActive = this.get("IsActive");
if (isActive) {
esq.filters.removeByKey("FilterStatus");
} else {
esq.filters.add("FilterStatus", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Status.IsResolved", 0));
}
}
}
};
});
4. Нажимаю сохранить и выбрасывает ошибку. Не пойму что не так. Подскажите что сделал не так?

Нравится

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

Задачу закрываю. Вот робочий код. Спасибо!
define("CaseSection", [],
function() {
return {
entitySchemaName: "Case",
messages: {},
attributes: {},
diff: /**SCHEMA_DIFF*/[

]/**SCHEMA_DIFF*/,
methods: {
initQueryFilters: function(esq) {
var isActive = this.get("IsActive");
if (isActive) {
esq.filters.removeByKey("FilterStatus");
} else {
esq.filters.add("FilterStatus", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Status.IsResolved", 0));
}
}
}
};
});

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

Коллеги, добрый день.

Есть такая задача: на карточке клиента есть поле (к примеру Ответственный), которое нужно менять массово по нескольким карточками (количество неограниченно, может быть и по 100-200). Клиенты, по которым нужно поменять поле, выбираются с применением фильтра - настраивается динамический список. Как можно поменять массово это поля по нажатию на кнопку/действие, без необходимости выделения клиентов по отдельности. Может кто сталкивался с такой задачей?

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

С уважением,
Дмитрий

Нравится

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

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

Попробуйте реализовать это процессом.
Используйте элемент "Изменить данные" для:
1) Построения фильтра
2) Задания новых значений полям.

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

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

Это скорее всего нужно будет сделать, усложнив код по кейсу, который описан в SDK, но может кто уже делал похожее и сможет поделиться или есть варианты попроще.

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

Самым оптимальным способом реализации данной задачи будет вызов esq из раздела. К примеру, Вы можете в секции раздела добавить кнопку. При нажатии вызывать примерно следующий код:

var filters = this.getFilters();
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
   rootSchemaName: "Имя таблицы"
});
esq.filters.addItem(filters);
esq.addColumn("Name");
esq.execute(function(response){
  // обработка результата выборки
});

Строка var filters = this.getFilters(); вернет все фильтры, примененные к реестру раздела, которые затем применяются к esq.

Вместо Terrasoft.EntitySchemaQuery, Вы также можете воспользоваться Terrasoft.UpdateQuery для изменения записей.

Подскажите, пожалуйста, с чём может быть связано возникновение ошибки 'Collection item with Id "{AC47705B-A2C3-4D04-BBC6-26D7D66DB833}" not found' при выполнении execute UpdateQuery такого вида:

var update = Ext.create("Terrasoft.UpdateQuery", {
rootSchemaName: "BTSampInShipment"
});
update.setParameterValue("BTStatus", "5f382609-a175-411c-a603-7507a050214a", Terrasoft.DataValueType.GUID);
update.setParameterValue("BTSampleStatus", "24807e44-e2c6-4af3-b61a-00e1e0b4629d", Terrasoft.DataValueType.GUID);
update.filters.addItem(update.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Id", result1.collection.getByIndex(0).get("Id")));

Значение поля "{AC47705B-A2C3-4D04-BBC6-26D7D66DB833}" в самом update не фигурирует.

Где можно посмотреть откуда 'ноги растут'?

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

Тяжело предоставить однозначное решение, т.к. сообщение об ошибке может быть косвенно связанным с запросом на обновление.

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

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

Если задача по массовому изменению полей постоянная, как у нас, то можно решить ее через вынесение необходимых полей в реестр раздела.
Например, добавляете поле Ответственный в реестр. После этого через фильтры или кнопку Выбрать несколько записей/Выбрать все выделяете нужные записи, затем вносите значение в поле и нажимаете кнопку Сохранить. В результате значение поля Ответственный меняется на новое во всех выделенных записях.

Павел,

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

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


Данное решение не помогло устранить ошибку.

Какие есть ещё возможные варианты решения - отладка невозможна, так как мы используем приложение on-demand?

В консоли такой текст ошибок:
1) POST https://[название сайта]/0/DataService/json/SyncReply/UpdateQuery 500 (ItemNotFoundException)

2) Error while sending request
response status: 500 (ItemNotFoundException)
request url: ../DataService/json/SyncReply/UpdateQuery
method: POST
request data: {"rootSchemaName":"BTSampInShipment","operationType":2,"filters":{"items":{"89f74119-40cf-4668-83a5-9ae17d387abd":{"filterType":1,"comparisonType":3,"...

3) Uncaught i {errorCode: "ItemNotFoundException", message: "Collection item with Id "{AC47705B-A2C3-4D04-BBC6-26D7D66DB833}" not found.", stackTrace: undefined, errors: Array(0)}

В продолжении темы...

Описанная выше проблема заключалась в том, что ранее из entity schema была удалена колонка, а потом добавлена повторно новая, но с другим UId. Данная колонка использовалась в бизнес-процессе, который запускался по сигналу изменения записи в этой таблице.

Решение оказалось простым - из тестовой базы выгрузила старый вариант entity schema и загрузила на прод.

Надеюсь, кому-то решение поможет в будущем быстро решить проблему.

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

Уважаемые коллеги!

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

Нравится

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

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

Как закрыть фильтр я отлично понимаю...

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

"Ифутин Юрий Борисович" написал:мы видим начальную страницу, которая отображает всех без исключения контрагентов.

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

Уважаемые коллеги!

Еще раз повторюсь...

По сути, под заказ своих коллег, я сделал необходимое им для работы ПРЕДСТАВЛЕНИЕ...
ПРЕДСТАВЛЕНИЕ представляет собой набор моих телодвижений в области применения групп и фильтров... (см. вложенный файл)...

Моим коллегам очень лень "идти" до этого ПРЕДСТАВЛЕНИЯ... То есть, нажали на "Контрагенты", затем нажали на фильтр, затем в фильтре выбрали группы, затем развернули целевую папку... И только после всех этих нажатий попали в необходимое им ПРЕДСТАВЛЕНИЕ...

Задача стоит в том, чтобы при нажатии на раздел "Контрагенты" открывалось это ПРЕДСТАВЛЕНИЕ сразу, то есть как начальная страница "Контрагенты".

Добрый день!

Тогда задача немного меняется.
При нажатии на кнопку "Показать группы" (ShowFoldersMenuItemCaption) вызывается метод showFolders().
При открытии раздела вызывается метод init(), который загружает данные в раздел, отрисовывывает фильтры и отсальные элементы.

Ваша задача сводится к тому, чтобы переопределить метод init(), добавив вызов метода showFolders().
Тогда при открытии раздела будут отображаться все группы раздела.

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

Подскажите пожалуйста, как сделать свою картинку в формате svg. Которая отображалась корректно. Я добавил свою картинку формата svg, но она отображается только при наведении на нее (прикрепил рисунок).
Сылка на картинку:
http://www.flaticon.com/free-icon/right-arrow_137624#term=next&page=1&po...

Нравится

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

Уважаемые коллеги!

Подскажите пжл., как показать или скрыть деталь в разделе в зависимости от условий?

Нравится

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

В диффе прописываем к детали

"values": {
            "visible": {bindTo: "myFunc"}
}

В методах

myFunc: function() {
           ......
           return true; //пишем кучу условий. возвращаем true/false
}

Спасибо!

А можно тоже самое только для дилетанта (поподробнее и понятнее), который первый раз пробует настраивать программу...

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

В версии 7.8.0+ смотрите в сторону детали Email на странице ContactPageV2 - видимость этой детали в системе зависит от типа контакта, например.

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

Добрый день, уважаемые коллеги!

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

Нравится

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

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

Рекомендую посмотреть пример реализации в детали OrderProductPageV2.

Значение поля PrimaryPrice устанавливается методом calculatePrimaryValues:

"PrimaryPrice": {
	dependencies: [
		{
			columns: ["Price", "Amount", "DiscountAmount", "TaxAmount", "TotalAmount"],
			methodName: "calculatePrimaryValues"
		}
	]
}

Сам метод реализован в блоке методов.

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

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

Нравится

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

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

Видимость кнопки печать определяется значением параметра IsCardPrintButtonVisible. Этот параметр задается в методе getCardPrintButtonVisible().

Вам необходимо переопределить указанный метод.

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

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

Видимость кнопки печать определяется значением параметра IsCardPrintButtonVisible. Этот параметр задается в методе getCardPrintButtonVisible().

Вам необходимо переопределить указанный метод.


А можно пример пожалуйста? Кусок кода если Вас не затруднит.

Добрый день, Максим!
Код данного метода приведен ниже. Свою логику можете указать любую, вплоть до return true;

getCardPrintButtonVisible: function() {
  var cardPrintFormsCollection = this.get(this.moduleCardPrintFormsCollectionName);
  var result = MenuUtilities.getMenuVisible(cardPrintFormsCollection, this);
  this.set("IsCardPrintButtonVisible", result);
  return result;
}

"Мотков Илья" написал:getCardPrintButtonVisible: function() {
  var cardPrintFormsCollection = this.get(this.moduleCardPrintFormsCollectionName);
  var result = MenuUtilities.getMenuVisible(cardPrintFormsCollection, this);
  this.set("IsCardPrintButtonVisible", result);
  return result;
}

Большое Вам спасибо. :-)

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