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

Подскажите, пожалуйста, существует ли какое-нибудь описание как можно добавить деталь "Продукты в Новая сущность>"?

Я сейчас пробую добавить такую деталь в Проекты, даже нашёл в пакете Project Объект ProjectProduct, но детали "Продукт в Проекте" нет. А если я её создаю на базе объекта ProjectProduct, то при попытке сохранить простую связь Проект - Продукт ловлю ошибку типа "Неизвестная колонка PriceListId". Нашёл, что эта ошибка идёт из "Базового вхождения продукта", но вот побороть её не получилось...

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

Нравится

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

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

Проблема в том, что поле PriceList добавляется в пакете ProductCatalogue, от которого не наследуется пакет Project, в котором создан объект ProjectProduct.

Решение: заместить объект ProjectProduct в пакете Custom. В результате колонка PriceList будет подтянута.

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

Добрый день!

1. В академии есть хороший материал по добавлению вычисляемых полей https://academy.terrasoft.ru/documents/technic-sdk/7-9/dobavlenie-vychis...
Но можно ли маленький пример как можно обратится к полю из другого объекта. Например: я хочу чтобы в поле объекта Заказ "Затраты" суммировались все поля "Затраты" объекта "продукты в заказе", которые в данном заказе. По аналогии с тем как сейчас меняется Итого заказа при добавлении продуктов в нем.

2. Еще на эту тему вопрос, мне необходимо чтобы в Заказе поле рассчитывалось в зависимости от другого поля в этом же разделе (тут понятно) но и от поля в карточке контрагента. Как обратиться к данному поле при добавлении атрибутов. this.get("Amount") обращаюсь к полю Итого текущего объекта, то к контрагенту необходимо так - Account.get("мое поле") ?

Нравится

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

"Калушка Д." написал: как можно обратится к полю из другого объекта

Скорее всего только через esq запрос. Либо (для данного примера) можно сделать простенький бп, который обновляет поле "затраты" при добавлении/изменении/удалении связанных продуктов.
Или можно сделать вьюшку, и, опять же, через esq оттуда подтягивать данные. Много вариантов.
"Калушка Д." написал: от поля в карточке контрагента

Через сообщения (sandbox.publish). Или можно вообще запилить сервис, который будет пересчитывать поле в зависимости от кучи факторов, и тогда уже вызывать его при изменении поля. Снова, есть варианты

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

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

Нравится

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

только если модифицировать момент "считать элемент выполненным, если"

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

только если модифицировать момент "считать элемент выполненным, если"


А есть конкретный пример?

"Кисловский Михаил Андреевич" написал:А есть конкретный пример?

Мы реализовывали так: в объект добавляли булево поле, в бп оно переводилось в состояние true, соответственно при открытии карточки можно узнать, что она открыта из бп.
При нажатии сохранить/отмена/{любая логика} переводим поле в состояние false, далее this.save({isSilent: true}).
В бп стоит условие "считать элемент выполненным, если" моё поле == fasle.
Соответственно бп в любом случае продолжит выполнение

По умолчанию:
а) экземпляр БП переходит к выполнению следующего элемента после того, как предыдущий элемент считается выполненным. В случае с “Открыть страницу редактирования” – элемент считается выполненным только после того как пользователь нажал кнопку “Сохранить”
б) в свойствах элемента “Открыть страницу редактирования” есть режим “Когда считать элемент выполненным?”. С помощью этого режима можно настроить доп. условия, при которых экземпляр БП продолжит выполнение (пункт Б не отменяет обязательного условия из пункт А – нажать “Сохранить”)

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

Добрый день.

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

Если ли возможность добавить поля для вложения документов в объект?
Если нет, то как это можно сделать?

Нравится

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

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

Предположим речь идет о продаже (объект Продажа) и 3 документах в продаже (объект Файл и ссылка продажи). Наличие документов получится определить только по названию вложенных файлов.
Подход к решению:
1. Читать данные в “Продажа”, где Id = Id целевой продажи
2. Читать кол-во записей в “Файл и ссылка продажи”, где (Продажа = Пункт 1. Id) && (Название содержит “Первый документ” || Название содержит “Второй документ”…)
От пункт 2 условный поток: Пункт 2. Кол-во записей = 3. В таком случае изменить стадию продажи.

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

Здравствуйте. Возникла проблема обновления счётчика отфильтрованных записей.
Добавлены аттрибуты и подписка на события их изменения.
Были реализованы фильтры в initQueryFilters.
Решение было реализовано на основе https://community.terrasoft.ru/forum/topic/18631 ( #7 Демьяник Алексей 21 июня 2016 – 13:46 ).
Всё работает отлично за исключением индикатора записей (Quantity).
Вызов метода this.reloadGridData() не обновляет значение.
Был найден модуль, в котором реализуется данный индикатор - SummaryModuleV2.
Но не понятно, как вызвать его методы или может методы другого класса, чтобы обновить значение.
Может кто встречался с данной ситуацией?

Нравится

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

"Лапшин Павел Александрович" написал:Были реализованы фильтры в initQueryFilters.

Попробуйте перенести все свои фильтры из initQueryFilters в метод getFilters.

Спасибо, сейчас попробую.

Данила, спасибо за подсказку.
Перенёс все в фильтры в перегруженный getFilters. И дополнительно, в обработчике изменения атрибутов к this.reloadGridData добавил вызов this.loadSummary().
Заработало!

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

Добрый день, коллеги!

Понадобилось реализовать следующий кейс - При добавлении участника встречи необходимо проверять, не задействован ли он в это время на другой встрече. Поскольку добавление участника - вставка записи в объект ActivityParticipant, решено было добавить в этот объект событийный подпроцесс, запускающийся по сигналу ActvityParticipantSaving. В событийном подпроцессе после сигнала идет скрипт, который будет делать запросы в базу и проверять пересечения с другими активностями нужного типа, после чего будет возвращать Id активности, в которой задействован этот участник, если нашелся конфликт, или просто null, если конфликтов не найдено. После этого встает несколько подзадач:
1) Как запретить при нахождении конфликта дальнейшее сохранение записи в базу;
2) Как вывести пользователю окно с ссылкой на активность, которая вызывает конфликт;
3) Как продолжить сохранение в нормальном режиме, если конфликт не найден.

Нашел переменную IsProcessModeSave, думал попробовать присваивать ей значение false.
Все темы, которые я нашел были устаревшими или не раскрывали сути вопроса.

Система sales enterprise 7.9.2

Нравится

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

Добрый день, Олег!

Подобный кейс обсуждался еще здесь:
http://www.community.terrasoft.ru/forum/topic/9994#comment-43946
Не смотрите, что скрин из пятерки, логика ровно та же - если активностей в указанное время не найдено - сгенерировать событие, если нет - передать id встречи на клиент, и там уже сформировать ссылку на проблемную активность. Пример создания ссылки можно подсмотреть в createLink из GridUtilitiesV2, либо же просто захардкодить. После чего показать данную ссылку.

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

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

Буду очень благодарен за подробные ответы, потому как по этой задаче информации мало, а решение интересное и полезное.

Олег, по Вашим вопросам:

1) Да, то же событие
2) Да, не будет сохранена, так как фактически Вы заместите логику обработки сообщения
3) Да, есть отличный класс MsgChannelUtilities, у которого есть такие методы:

public static void PostMessage(UserConnection userConnection, string senderName, string messageText)
 
public static void PostMessageToAll(string senderName, string messageText)

Итого, в C# отправляем сообщение:

MsgChannelUtilities.PostMessage(UserConnection, "LimitBudget", accountId.ToString());

В JS на клиенте подписываемся на него и обрабатываем:

init: function(callback, scope) {
    this.Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onMessage, this);
},
 
onMessage: function(scope, message) {
if (message.Header.Sender === "LimitBudget") {
// do something
     }
},
 
destroy: function() {
    this.Terrasoft.ServerChannel.un(Terrasoft.EventName.ON_MESSAGE, this.onMessage, this);
    this.callParent   (arguments)
}

Добрый день!

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

Процесс "ActivityEventProcess" остановлен. Превышено максимальное количество повторений элемента "Activity Saving". Если я правильно понимаю, то генерация такого же сообщения, по которому запускается подпроцесс, зацикливает его. Я точно правильно понял, какое сообщение нужно генерировать?

Здравствуйте, вашу задачу проще и корректней сделать на уровне JS, там же и выводить сообщение пользователю, а запросы в БД делать асинхронно. Данный алгоритм с асинхронной валидацией обсуждался в этой теме:
http://www.community.terrasoft.ru/forum/topic/25300#comment-67748

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

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

Добрый день.
На данный момент загрузка изображений происходит в табличку SysImage. В таблицах же храниться id картинки. При загрузке изображения в карточку, оно сразу же попадает в БД. При сохранении карточки id сохранённой картинки привязывается к карточке. А в случае если пользователь отменил сохранение то картинка висит бесхозная в SysImage, до каких пор она там будет висеть? Нужно ли каким либо образом чистить данную табличку?
Подскажите возможно ли сохранять изображения в самом объекте с которым я работаю? Настроить отображение мне удалось, а вот с загрузкой нового изображения возникли затруднения. Может кто подсказать где искать?

Нравится

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

Картинку в объекте хранить можно, вот статья:
https://academy.terrasoft.ua/documents/technic-sdk/7-6-0/kak-dobavit-na…
Но базовые механизмы без перезаротки позволят хранить только одну такую картинку.

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

Дополню ответ Максима - проверили, действительно, в коробочной версии продукта при отмене сохранения запись в SysImage остается. При необходимости можно эту таблицу чистить, однако чтобы она возникла, необходимо данное действие выполнить очень большое количество раз. Информация о проблеме передана разработчикам ядра для исправления в последующих релизах.

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

Добрый день.
Подскажите в каких таблицах должна быть зарегистрирована страница редактирования объекта?

У меня есть справочник, для него создаётся страница редактирования. Я понимаю что можно создать деталь для объекта а затем использовать её для справочника. Меня интересует вопрос как выполнить действия самостоятельно через sql.
Для своего справочника я зарегистрировал страницу в SysModuleEntity и SysModuleEdit а где ещё?

Нравится

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

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

Для созданного справочника регистрировать страницу редактирования необходимо только в таблицах SysModuleEntity и SysModuleEdit.

Так же Вы можете зарегистировать по принципу описанному в статье Академии: https://academy.terrasoft.ru/documents/technic-sdk/7-9/sozdanie-detali-…

Добрый день.
Страницу я зарегистрировал но она не открывается. в консоли получаю ошибку: Uncaught Terrasoft.ItemNotFoundException: Элемент с ключом null Не существует.

В процессе поиска столкнулся с тем что entityStructure не содержит объекта с которым я работаю. Может подскажете где искать?

Видимо не все колонки заполнили корректно, вот вам более подробное описание таблиц SysModuleEntity и SysModuleEdit, а так же посмотрите по примеру и подобию значения этих таблиц для других сущностей:

Таблица SysModuleEdit:
Данная таблица описывает связь объектов конфигурации со страницами их редактирования.
К примеру, будь то деталь или раздел. К примеру объекта, «Активность», у неё может быть одна или несколько страниц редактирования, вот они как раз описываются в этой таблице. То есть тут задается связь «Вот объект» - «А вот схема страницы, которая будет отображать содержимое этого объекта».
Основные колонки этой таблицы это:
SysModuleEntityId – Ссылка на развязочную таблицу SysModuleEntity о которой будет ниже. По сути, в ней (в развязочной таблице SysModuleEntity) будет описана ссылка на конкретно объект «Активность» (на схему объекта активности). А все схемы, это таблица SysSchema.
TypeColumnValue – если колонка пуста, значит страниц редактирования у этого объекта одна. Если TypeColumnValue заполнена, то это Id типа по которому идет разграничение страниц редактирования. К примеру, разграничение страниц редактирования Активности может быть по колонке Тип (ActivityType), тогда Id именно этой таблицы (ActivityType) будут записаны в TypeColumnValue. Разграничение может быть по любой ссылочной колонке объекта, но только по одной в один момент времени. Обычно это все же «Тип».
CardSchemaUId – ссылка на UId таблицы SysSchema, а именно на схему страницы редактирования. К примеру, на UId схемы ActivityPageV2, но обязательно на ту строчку SELECT * FROM SysSchema WHERE Name = 'Activity' где AND ExtendParent = 0 Тоесть самая базовая, самая родительская схема карточки. То же касается любых ссылок на SysSchema, всегда ссылаются на самую родительскую схему (ExtendParent = 0), что бы работало наследование.
Ну и оставшиеся текстовые колонки, всего лишь текстовые представления карточек и действий.
SysPageSchemaUId ссылка на устаревшие aspx карточки (SysSchema), на данный момент для новых сущностей не используются.
MiniPageSchemaUId нужна только для создания мини-карточек, о чем написано в соответствующей статье:
https://academy.terrasoft.ru/documents/technic-sdk/7-8/sozdanie-mini-ka…

Таблица SysModuleEntity:
Просто развязочная таблица для SysModuleEdit, итоговая связь выглядит так
SysSchema (схема объекта) – SysModuleEntity – SysModuleEdit - SysSchema (схема(ы) карточек)
Основные колонки этой таблицы это:
SysEntitySchemaUId – ссылка на таблицу SysSchema, а именно на схему объекта, к примеру, на UId вот этой записи: SELECT * FROM SysSchema WHERE Name = 'Activity' AND ExtendParent = 0
TypeColumnUId – заполняется для тех случаев, когда собственно есть много страниц редактирования для одного объекта, именно тут указывается UId колонки из метаданных объекта по которому идет разграничение, тесно связана идеологически с колонкой TypeColumnValue таблицы SysModuleEdit.

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

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

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

Нравится

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

Здравствуйте,
К сожалению, без доступа к БД сложно что-то подсказать, напишите данную проблему на поддержку: support@terrasoft.ru

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

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

Версия 7.10.

Возникла задача: на странице Обращения существует справочная колонка Контрагента. Если необходимого контрагента в списке нет, то мы его можем сразу создать через миникарточку. Однако у контрагента есть поле ИНН, которое хотелось бы заполнять автоматически данными из аналогичного поля в Обращении (см. скриншот).

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

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

Нравится

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

Решали уже такую задачу, но немного с другого конца. Из лида вызывалась миникарточка продажи:

this.openAddMiniPage({
	entitySchemaName: "Opportunity",
	valuePairs: this.getAddMiniPageDefaultValues()
});
 
getAddMiniPageDefaultValues: function() {
	var defaultValues = [];
	if (this.get("QualifiedAccount")) {
		defaultValues.push({
			name: "QualifiedAccount",
			value: this.get("QualifiedAccount").value
		});
	}
	return defaultValues;
},

Так что можно попробовать отрыть, где вызывается функция открытия окна контрагента и немного модифицировать.
Или как вы написали - через sandbox. В карточке обращения подписаться на событие и возвращать значение поля(если он, конечно, заполнено). В миникарточке контрагента в onEntityInitialized пытаться получить и установить значение поля.

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

Пока решили проблему грубым путём - просто по id вытаскиваю значение нужного inputа в DOM и подставляю его куда надо.

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