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

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

Проблема возникает с миникарточкой. Когда работник пытаюсь завершить Активность из мини-карточки, у нее ответственный подставляется ответственным из объекта, к которому Активность привязана, например, Контакт.

Есть несложный способ побороть это? Или надо городить свою мини-карточку, обработку Ответственного и т.д.?

Нравится

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

Добрый день.

При нажатии на «Завершить задачу» в мини карточке активности «ActivityMiniPage» вызывается метод «onChangeStatusButtonClick». Можете его заместить и добавить свою логику.

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

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

Базовая цена, плюс скидки:

За объём +3%

За удалённость +1%

За самовывоз +10% и т.д.

Чтобы менеджер, на на калькуляторе её считал, а выбирал значения, т.к. прайс-листами это делать не удобно.

Нравится

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

Вы хотите эти скидки делать на уровне продукта в счёте или на уровне счёта?

Хороший вопрос... Нет, наверное на уровне в счёте лучше!

Добрый день, Алексей!

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

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

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

https://community.terrasoft.ru/questions/ctenie-dannyh-rezultiruusaa-ko…

Получаю ошибку на этапе скрипт-таска

System.NullReferenceException: Object reference not set to an instance of an object.
   at Terrasoft.Core.Process.UsrCollectionOfSmthMethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

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

Подскажите, в какую сторону идти и что править.

Нравится

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

Добрый день.

Скорее всего вы неправильно читаете данные.

Код который работает:

EntityCollection entities = Get<EntityCollection>("ReadDataUserTask1.ResultEntityCollection");
Set("Param1", entities);

Параметр "Param1" имеет тип - "Коллекция объектов (EntityCollection)".

ReadDataUserTask1 - имя элемента (выберите элемент – расширенный режим (три точки вверху справа) - имя)

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

VladKapitanchyk,

А как в вашем случае использовать результирующую коллекцию?

Пытаюсь получить список записей по условию, чтобы записать их в Notes или в тело письма.

ZAN,

EntityCollection это класс, который наследуется от LinkedList<Entity> (базовый C# класс), поэтому содержит базовые методы для работы с коллекцией. https://msdn.microsoft.com/en-us/library/kb834fyk(v=vs.110).aspx

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

Добрый день!

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

Идея такая: в платежных реквизитах Контрагента (нашей компании) сохраняем скан подписей с печатями для счета, при печати счета на оплату подставляем этот скан.

Нравится

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

Борис, здравствуйте!

 

Вывод изображений происходит по аналогии с другими полями. Вы выводите поле с типом «Изображение».

Данный вопрос уже ранее обсуждался - https://community.terrasoft.ru/questions/pecatnye-formy.

Добрый день!

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

Уменя все получилось после ознакомления инфы по ссылке в комментарии Дмитрия.

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

Коллеги, здравствуйте!

Возник вопрос: Как скрыть базовую цену продукта и оставить только для руководителей? 

Заранее спасибо!

Нравится

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

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

Учтите, что если на значение поля завязана какая-то логика, она может начать работать неправильно из-за отсутствия доступа. Лучше сначала проверить на тесте, допустимо ли такое разграничение прав.

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

можно скрыть только доступ к записи, объекту или колонке. А есть ли возможность скрыть доступ к справочному значению?

Можно раздать права доступа по записям на объект справочника. Но это как раз не поможет, поскольку первичное поле записи (то есть название) видится независимо от наличия прав.

Разве что прикрутить на уровне карточки фильтрацию на справочное поле.

Зверев Александр, а каким образом можно установить фильтрацию на справочник?

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

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

Коллеги, доброго времени суток!

Подскажите пожалуйста:

В разделе "Счета" при изменении количества/цен продуктов идет автоматический пересчет "Суммы" счета. Как я понял код, отвечающий за изменение находится в пакете Invoice => схеме объекта InvoiceProduct => подпроцессе SubProcessScriptAmountChange => внутри скрипта ScriptAmountChange, который отрабатывает при получении сообщения события InvoiceProductSaved или InvoiceProductDeleted. Поиск по сообществу показал, что видимо просто так переопределить код внутри скрипта нельзя, если он не вынесен в метод. Чтобы заменить логику его работы нужно создать свой подпроцесс с входами через те же сообщения (но со своими названиями) и в конце вызываемого скрипта перед return вписать

ActivatedEventElements.Remove("InvoiceProductSaved");

ActivatedEventElements.Remove("InvoiceProductDeleted");

что я и сделал, создал подпроцесс по образу и подобию с родительским (два входных сообщения через исключащее "ИЛИ" по безусловной связи идут в скрипт), однако после сохранения, публикации и обновлении стурктуры БД дополнительная логика не отрабатывает, из чего я делаю вывод, что до скрипта почему-то дело не доходит.

У моих входных событий совпадают с родительскими поля "Сообщение" (InvoiceProductSaved и InvoiceProductDeleted), но отличаются "Название" (иначе компилятор предупреждает, что override неправильно делаю, и получается только hide.. ну и всё равно не работает), поле "Условие" в связи от исключащего ИЛИ пустое, судя по "Исходному коду" это как раз то, что нужно, т.к. в этом случае функция всегда возвращает true.

Пытался и напрямую оба события на скрипт завязать - всё равно не работает.

Вопрос соответственно - что я делаю не так?

Нравится

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

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

Описанное решение выглядит правильно. 

Для перекрытия логики по родительскому сигналу, необходимо в дочернем БП объекта подписаться на аналогичное событие объекта и в скрипте перед return true  вставить:

if (ActivatedEventElements.Contains("InvoiceProductSaved")) {

&nbsp;&nbsp;&nbsp;&nbsp;ActivatedEventElements.Remove("InvoiceProductSaved")

}

Проверьте, что БП в дочернем объекте помещен в "Событийный подпроцесс".

Так же, вы хотите удалить сразу два сигнала. Поэтому, советую выполнять проверку какой сигнал пришел и удалять его( как в примере выше).

Спасибо!

Попробовал в другом объекте (OrderProduct) проверить. Создал в процессе замещающего объекта событийный подпроцесс, в него поместил одно начальное событие (сообщение OrderProductSaved) из него прямой переход на скрипт, в котором три строчки:

global::Common.Logging.ILog _Logger = global::Common.Logging.LogManager.GetLogger("Client");

_Logger.Info("Order product saved event test");

return true;

Одновременно в переопределенный метод RecalculateOrderAmount вписываю в начале:

global::Common.Logging.ILog _Logger = global::Common.Logging.LogManager.GetLogger("Client");

_Logger.Info("Order product saved event test 2, "+GetPropertiesData());

Метод вызывается только в родительском процессе по цепочке от сообщений OrderProductSaved или OrderProductDeleted.

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

Что может быть не так или может быть есть какая-то статья или инструкция для чайников как правильно создавать дополнительные обработчики стандартных событий в процессах замещающих объектов?

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

Добрый день!

Проверила ваш кейс у себя, всё получилось.

Вот как я делала:

Событийный подпроцесс - http://prntscr.com/jhpu81

Задание-сценарий - http://prntscr.com/jhpuoz

Добавила продукты в счете - http://prntscr.com/jhpuz6

Сумма не считается - http://prntscr.com/jhpv9a

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

Не могу установить параметр БП типа EntityCollection с именем ActualPOAs. Делаю в коде:

var esq = new EntitySchemaQuery(context.UserConnection.EntitySchemaManager, "UsrPowerOfAttorney");
esq.AddAllSchemaColumns();
EntityCollection ActualPOAs = esq.GetEntityCollection(context.UserConnection);
// Упадет в следующей строке
Set<EntityCollection>("ActualPOAs", ActualPOAs);

После чего получаю исключение (ниже). Что я делаю не так?

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: The best overloaded method match for 'Terrasoft.Core.Process.IProcessParameterStore.SetParameterValue(System.Guid, string, string)' has some invalid arguments at CallSite.Target(Closure , CallSite , IProcessParameterStore , Guid , String , Object ) at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid4[T0,T1,T2,T3](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3) at Terrasoft.Core.Process.ProcessParameterInfoComposer.UpdateParameterInfoValue[T](Guid processUId, ProcessParameterInfo parameterInfo, String parameterPath, T value) at Terrasoft.Core.Process.ProcessModel.SetParameterValue[T](FoundParameterData result, T value) at Terrasoft.Core.Process.ProcessModel.TrySetValue[T](ProcessSchema processSchema, String propertyPath, T value) at Terrasoft.Core.Process.ProcessModel.Set[T](String propertyPath, T value) at Terrasoft.Core.Process.PowerOfAttorneyPackCheckMethodsWrapper.ScriptCheckPOAExecute(ProcessExecutingContext context) at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Нравится

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

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

Необходимо параметру ActualPOAs просто присвоить полученную коллекцию:

ActualPOAs = esq.GetEntityCollection(context.UserConnection);

На элементе задание-сценарий перейти в расширенный решим и снять галочку "Для интерпретируемого процесса".

В настройках процесса установить галочку "Компилировать".

Demchenko Olha,

к сожалению, я не могу сделать процесс компилируемым, т.к. он запускается по таймеру, а на версии 7.11 таймер и компилируемый процесс - вещи не совместимые.

Извините, откуда у вас такая информация, что БП с таймером нельзя сделать компилируемым? 

В функционале БП во-первых, не предусмотрено присваивание коллекций методом Set в интерпретируемых процессах, во-вторых, таймеру все равно компилируемый процесс или интерпретируемый.

Золотарев Артем Андреевич,

https://community.terrasoft.ru/questions/startovyi-taimera-v-bp - отсюда, ответ Логвин Андрей Витальевич: "Запуск компилируемых процессов по стартовому таймеру реализован в версии 7.11.3 и выше."

Правильно я понимаю,что 

ActualPOAs = esq.GetEntityCollection(context.UserConnection); будет работать в интерпретируемом процессе?

 

Алексей-Карягин,

Попробуйте сделать, как написала Demchenko Olha и протестируйте работу БП.

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

А вот для 7.11.3 точно нормально работает и для компилируемого БП.

Алексей-Карягин,

ActualPOAs = esq.GetEntityCollection(context.UserConnection); - работает только для компилируемого задания-сценария

Золотарев Артем Андреевич,

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

https://academy.terrasoft.ru/documents/technic-bpms/7-12/element-proces…, добавьте, что не методы Get и Set не работают для коллекций объектов. Иначе до этого догадаться, мягко говоря, непросто и отсюда начинаются бодания с ТП, которая просит денег (более дорогой пакет поддержки) за объяснение где ваша документация не соответствует реальности. А это уже просто не лезет ни в какие ворота!

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

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

Было много вопросов на эту тему, но создаю еще, т.к. версия 7.12.

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

Нравится

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

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

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

Собственно деталь загружается после выполнения метода onGridDataLoaded.

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

Всем привет, подскажите как решить задачу:

Воронка строится на основании кейсов конкретного раздела, а мне нужно построить воронку продаж по 3-м сущностям: лид(его стадии)+контрагент(его стадии)+продажа(ее стадии).

Подскажите, можно ли это реализовать?

Нравится

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

Добрый день, Роман!

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

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

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

Возникла идея прикрутить получение данных об организации по ИНН, как в 1С.

Варианты реализации вижу такие:

1. на странице AccountBillingInfo делаем обращение к веб-сервису, специально для этого созданному, веб-сервис обращается к стороннему сервису за данными и выдает результат.

2. на странице AccountBillingInfo на JS городим запросник, всю логику в этом запроснике реализуем.

Какие еще могут быть способы и как идеологически верно?

Нравится

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

Реализаций может быть много.

В 7.12 появился элемент БП для работы с сервисами. Можно написать процесс, который получает данные из внешнего источника, заносит в нужное поле и сохраняет запись. Но если хотите не хранить в базе, а показывать прямо со стороннего сервиса на ходу, то придётся всё клиентским JS, тут готовых решений нет.

Также можно посмотреть, как устроено обогащение информации о контрагенте, возможно, стоит реализовать что-то похожее.

Адреса и параметры веб-сервисов, с которыми работает 1С, можно посмотреть в исходниках её конфигурации.

 

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

В базе хочу хранить, но потом, после получения данных.

За ссылку на пример с БП большое спасибо.

Сам процесс получения информации от сервиса и записи в базу в простейшем случае будет выглядеть так:

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