Здравствуйте!
Есть объект, одно из полей которого обязательно для заполнения на уровне приложения.
Доступа на изменение к этому объекту нет. Пробовал замещать объект, но не понимаю, каким образом можно изменить обязательность поля. На клиентской стороне особых проблем не возникло

if (...) {
        this.entitySchema.getColumnByName("MiddleName").isRequired = false;
        this.set("MiddleName", null);
        $('#MiddleNameControlLabel').removeClass('required-caption');
}
else {
        this.entitySchema.getColumnByName("MiddleName").isRequired = true;
        $('#MiddleNameControlLabel').addClass('required-caption');
}

Но серверная валидация не проходит. Что можно сделать?

Версия 7.2

Нравится

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

Юрий, при обращении к "entitySchema" данный способ не сработает.
Как вариант для проставления обязательности колонки необходимо заместить объект и проставить соответствующий признак (Рис. 1)

Про свойства колонок объекта можно ознакомиться на Academy - http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/ObjectColu…

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

Доброго времени суток всем.
Объясните, пожалуйста, что такое mixin в Java Script в BPMonline 7.6? Зачем он нужен? Объясните чайнику.

Нравится

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

Евгений, миксин это часть класса и в bpm’online ни чем не отличаются от других миксинов. Про миксин можете прочитать здесь.
Как пример можете посмотреть в схеме GridUtilitiesV2.

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

Не могу справится с проблемой. Необходимо в БП отловить событие утверждения или отклонения визы. Делаю по аналогии с базовыми процессами визирования - ставлю промежуточный обрабатывающий сигнал, но получаю ошибку с заголовком: "Невозможно получить значение колонки Objective, так как она не была загружена"

На элементе создания визы указываю Цель визы и остальные колонки. Виза успешно создается.

Прилагаю скриншот отрезка БП с параметрами элементов.
БП

А также страницу журнала БП с ошибкой.
журнал БП

Почему на момент создания визы система успешно записывает данные в колонку Objective а на момент обрабатывания сигнала - ошибка?

Версия 7.5.0.1422

Нравится

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

Вячеслав,

Я думаю, что проблема в том, что вы выбираете не "Добавить одну запись", а "Добавить результат выборки".
Но при этом в сигнале пытаетесь поймать параметр, который отвечает за добавление одной записи.

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

Здесь есть несколько вариантов:

1) Указанный Дмитрием выше.
Решение: создать функциональную роль и объединить всех визирующих в нее. Визу создавать только одну - на эту функциональную роль.

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

3) В элементе "Чтение данных" читаются только отдельные колонки, а дальше происходит попытка использовать данные непрочитанной колонки.
Решение: читать все данные.

Да. Дмитрий всё правильно сказал. Как я сразу не подумал об этом! Спасибо! Чуть переработал логику, всё вышло, спасибо!

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

Скажите, пожалуйста, что пишется в секции mixins в файле исходного текста на Java Script страницы, если для создания страницы в конфигурации выбирается: Добавить/Расширенные/Схема модели представления карточки ?

Нравится

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

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

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

Примером миксина может служить класс Terrasoft.GridUtilities, который используется и в базовом разделе, и в базовой детали.

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

Добрый день.
Столкнулись с таким странным поведением в bpm'online версии 7.2 - есть процесс, который запускается на изменение поля у объекта, потом кое-что меняется и запускается таймер для задержки, и после этого читается измененный объект и проверяем его поля, после чего выходим. И почему-то код отрабатывает только до таймера, а после этого ничего не происходит. Сужу по логам и по тому какой результат ожидаю.
При этом на другом сайте аналогичный процесс отрабатывает корректно.
Можете подсказать в чем может быть дело, куда копать, куда смотреть?
Схема процесса:

Нравится

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

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

Поищите причину в логах сервера. По умолчанию они хранятся в C://Windows/Temp/bpmonline.

Вам необходимы логи Quartz.

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

2015-09-29 10:53:21,562 [15264] INFO  USER Quartz.Impl.AdoJobStore.JobStoreTX Instantiate - JobStoreTX initialized.
2015-09-29 10:53:21,578 [15264] INFO  USER Quartz.Core.QuartzScheduler Initialize - Scheduler meta-data: Quartz Scheduler (v2.1.2.400) 'BPMonlineQuartzScheduler' with instanceId 'auto'
  Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with 3 threads.
  Using job-store 'Quartz.Impl.AdoJobStore.JobStoreTX' - which supports persistence. and is clustered.
 
2015-09-29 10:53:21,579 [15264] INFO  USER Quartz.Impl.StdSchedulerFactory Instantiate - Quartz scheduler 'BPMonlineQuartzScheduler' initialized
2015-09-29 10:53:21,579 [15264] INFO  USER Quartz.Impl.StdSchedulerFactory Instantiate - Quartz scheduler version: 2.1.2.400
2015-09-29 11:17:37,676 [8480] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ObtainLock - Lock 'TRIGGER_ACCESS' is desired by: 
2015-09-29 11:17:37,796 [8480] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ExecuteSQL - Lock 'TRIGGER_ACCESS' is being obtained: 
2015-09-29 11:17:37,799 [8480] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ExecuteSQL - Lock 'TRIGGER_ACCESS' is being obtained: 
2015-09-29 11:17:37,800 [8480] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ObtainLock - Lock 'TRIGGER_ACCESS' given to: 
2015-09-29 11:17:40,027 [8480] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ReleaseLock - Lock 'TRIGGER_ACCESS' returned by: 
2015-09-29 11:20:00,889 [BPMonlineQuartzScheduler_Worker-1] INFO  USER Terrasoft.Core.Scheduler.RunProcessJob Execute - ProcessStart [processSchemaName:ContactProcess, processElementUId , userName:USER, workspaceName:Default]
2015-09-29 11:21:03,648 [BPMonlineQuartzScheduler_Worker-1] INFO  USER Terrasoft.Core.Scheduler.RunProcessJob Execute - ProcessFinish [processSchemaName:ContactProcess, processElementUId , userName:USER, workspaceName:Default]
2015-09-29 11:21:51,604 [10724] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ObtainLock - Lock 'TRIGGER_ACCESS' is desired by: 
2015-09-29 11:21:51,606 [10724] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ExecuteSQL - Lock 'TRIGGER_ACCESS' is being obtained: 

Если про процесс ничего не указано в данной таблице, то необходимо проверить доходит ли процесс до элемента "Таймер".

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

Здравствуйте, Александр. Процессы, запускающиеся по расписанию и содержащие таймер, записываются в таблицу qrtz_triggers.

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

2015-09-30 16:40:40,227 [BPMonlineQuartzScheduler_Worker-2] INFO  user Terrasoft.Core.Scheduler.RunProcessJob Execute - ProcessStart [processSchemaName:, processElementUId 743f3d6f-802f-4d9d-9fe5-3064f62a35ed, userName:userName, workspaceName:Default]
2015-09-30 16:40:44,816 [BPMonlineQuartzScheduler_Worker-2] INFO  user Terrasoft.Core.Scheduler.RunProcessJob Execute - ProcessFinish [processSchemaName:, processElementUId 743f3d6f-802f-4d9d-9fe5-3064f62a35ed, userName:userName, workspaceName:Default]

И в списке по запросу  select distinct TRIGGER_NAME from qrtz_triggers если судить из названий, то я не вижу своего процесса. Может быть есть какая-то иная таблица, или проблема в том, что судя по логу не установлено поле processSchemaName, но как его установить? Откуда его берет процесс?

Поставьте журналируемый элемент "Чтение данных" перед таймером. Запустите процесс повторно. Процесс дошел до чтения данных?

Не понял, что имеется ввиду под "журналируемый элемент "Чтение данных""?
Если речь о элементе загрузки объекта, то на мой взгляд это не корректно. Так как за время задержки по таймеру, объект может измениться. Замечу, что без таймера процесс отрабатывает и на сервере, где с тамером не работает. Т.е. вся проблема когда добавляем таймер.
Для проверки наличия джобов, сделал ветку в которой с задержкой по Sleep опрашивалась таблица qrtz_triggers, но своей джобы я там не увидел. Процесс выглядит так:
Что еще можно сделать, для понимая ситуации?

1) Добавьте "Чтение данных" перед таймером. У элемента "Чтение данных" должен быть установлен признак "Журналировать" (в свойствах элемента)
2) Запустите процесс
3) Сделайте скриншот диаграммы процесса в журнале процессов и опубликуйте его здесь, пожалуйста.

Сейчас сделаю, и .. возникла проблема. Журнал процессов не работает. При переходе на закладку в Инструментах - "Журнал процессов", выдается пустая страница с ошибкой "В работе приложения BPMonline возникла ошибка. Приносим извинения за неудобства."
В логах появляется следующая ошибка:

Exception Message: Элемент с идентификатором "0d4daf80-dbef-4fef-9c8d-2e942b0a9965" не найден
Exception Type: Terrasoft.Common.ItemNotFoundException
Exception Source: Terrasoft.Core
 
Exception Stack Trace:
   at Terrasoft.Core.ManagerItemCollection`1.GetByUId(Guid uid)
   at Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid)
   at Terrasoft.WebApp.MainPageEventsProcess`1.InitScriptTaskExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.OnExecuted(ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message)
   at Terrasoft.UI.WebControls.PageSchemaUserControl.ThrowEvent(String message)
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadFromAssembly()
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadUserControl()
   at Terrasoft.UI.WebControls.Controls.PageContainer.OnInit(EventArgs e)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

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

Александр, смотреть нужно в SysProcessLog. Очень сложно понять в чем проблема. Предлагаю Вам зарегистрировать обращение, оправив письмо по адресу support [at] terrasoft.ru, приложив логи сервера для более детального анализа.

Спасибо за ответы. К сожалению в таблице SysProcessLog никакой ценной информации не обнаружил :'(
И после обсуждения и обдумывания пришлось отказаться от таймера, и реализовать это через потоки с задержкой. По крайней мере, это работает. Жаль только, что приходится столько времени тратить на "борьбу" с bpm.

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

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

Нравится

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

В версиях BPMonline 7.2 и 7.5 есть библиотечный модуль на Java Script, который называется jQuery. Не может ли кто сказать - изменилось ли определение этого модуля в версии BPMonline 7.5 относительно версии 7.2 ? Дело в том что я взял готовый модуль на Java Script (в зависимостях которого был объявлен только jQuery) в версии 7.2 и перенёс его в приложение, которое делаю в версии 7.5. При сохранении перенесённого модуля в 7.5. появляется сообщение: "Похоже, исполняемый на этой странице сценарий занят или не отвечает. Вы можете остановить его сейчас, открыть сценарий в отладчике или позволить сценарию продолжить свою работу." В окне ошибок первым появляется следующее сообщение "Function declarations should not be placed in blocks. Use the function expression or move the statement to the top of the other function." Ниже привожу код на который "жалуется" система:

define("JqueryInputMask", ["jQuery"],
                function(jQ) {
                        (function($) {
                                if ($.fn.inputmask === undefined) {
                                        //helper functions
                                        function isInputEventSupported(eventName) {
                                                var el = document.createElement("input"),
                                                                eventName = "on" + eventName,
                                                                isSupported = (eventName in el);
                                                if (!isSupported) {
                                                        el.setAttribute(eventName, "return;");
                                                        isSupported = typeof el[eventName] == "function";
                                                }
                                                el = null;
                                                return isSupported;
                                        }    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
});

Система жалуется на объявление функции внутри оператора if ($.fn.inputmask === undefined) . Что здесь сделано неправильно? Из-за чего возникает данная ошибка. Ведь этот код работал в BPMonline 7.2, а в 7.5 не хочет!

P.S. В окне структуры указал в депенденсах jQuery. В свойствах всё прописал как положено (посмотрел как это было сделано в 7.2).

Нравится

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

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

С версии 7.2 до версии 7.5 изменилась структура создания замещающего клиентского модуля. Вы можете посмотреть на новую схему в любой странице редактирования в 7.5. Например, можете посмотреть код ActivityPageV2.

В двух словах, базовый код замещающей клиентской схемы пишется так:

image2014-9-29_13-9-31.png (прикреплен)

image2014-9-29_13-11-1.png (прикреплен)

Методы пишутся в объекте methods, который собирается по иерархии.

Я вообще зелёный новичок в Java Script. Получается, что в версии 7.5 определять функцию внутри блока оператора if(){} нельзя? Скажите мне русским языком. По крайней мере, в ActivityPageV2 нет определения функций внутри блоков оператора if(){}. И вообще, ActivityPageV2 создана как простой модуль или как схема модели представления карточки ? Потому что свой модуль я создавал как простой модуль, т.е. зашёл на вкладку "Конфигурация", там выбрал нужный мне пакет и выполнил Добавить/Расширенные/Модуль. Покажите, пожалуйста, как мне нужно переписать код в моём случае, что бы он работал?

Евгений, попробуйте заменить объявление функции

function isInputEventSupported(eventName) {...}

на следующее выражение:

var isInputEventSupported = function(eventName) {...}

Дальнейшее использование функции отличаться не должно.

Да, похоже таким образом проблема с определением функций решается. Спасибо.

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

Здравствуйте! Интересует вопрос как связанные поля, которые зависят от того, что было выбрано в предыдущем поле?
Например, в карточке контрагента есть тип. Допустим там два варианта гостиница и ресторан. Если мы вибираем гостиница, то должны появится 2 поля для заполнения из справочников "количества звезд" и "количество номеров". Если вибираем ресторан, то дожно появится поле из справочником "количество посадочных мест". Как я могу это реализовать.

Нравится

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

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

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

Примеры топиков:
http://www.community.terrasoft.ru/forum/topic/10813
http://www.community.terrasoft.ru/usr/video/10673 (видео недоступно)
http://www.community.terrasoft.ru/forum/topic/11997

Как вариант для подобной реализации Вы можете использовать бизнес-правила.
Более подборная информация есть на SDK.
Например, настройка полей страницы редактирования с помощью бизнес-правил - http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/AddBusines…

А можна ли создать связанные справочники в bpmonline sales omni по примеру как созданы страны и города. И каким образом это сделать?

Бизнес-правила работаю для всех типов колонок (Рис. 1).


Рис. 1

А как мне в справочнике создать привязку. Например у меня есть поле Тип клиента, и там возможны два значения Клиент и Партнер. Есть еще одно поле, которое называется Категория. И в Категории значения должны выпадать из справочника, но эти значения разные для Клиента и Партнера.

Для Клиента: Столовая Супермаркет Пекарня;
Для Партнера: Архитектор Технолог Стротитель.

Нужно сделать, чтоб если я выбрал Клиент, то в поле Категория я мог выбирать только Столовая Супермаркет Пекарня. Как это реализовать?

Николай, как написал Александр, используйте для этого бизнес-правила.
Пример реализации можете посмотреть на странице адрес контакта/контрагента. Например, поле «Город». Данное поле фильтруется по колонке «Страна» (Рис. 1-3).



С правилом мне понятно. Как создать связанный справочник? Так же как в справочнике городов я вписываю и город и страну. Если создавать справочник, то там одномерное наполнение...

Николай, добавьте новую колонку в объекте (справочник А), который необходимо фильтровать, с типом "Справочник" ссылающийся на другой справочник объект (справочник Б).
Реализуйте по аналогии колонки «Город» (CityEditPage).
Продублирую картинку.

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

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

И еще. Вот на странице городов есть в колонке данных Страны
[url=http://pixs.ru/showimage/3jpg_1830269_18963951.jpg][img]http://i11.pixs.ru/thumbs/9/5/1/3jpg_1830269_18963951.jpg[/img][/url]

А когда я создаю свое поле Категория, то где мне нужно добавить чтото, чтобы у меня появлялась в колонке данних Категория.
[url=http://pixs.ru/showimage/31jpg_9545447_18964042.jpg][img]http://i11.pixs.ru/thumbs/0/4/2/31jpg_9545447_18964042.jpg[/img][/url]

Николай, вызывается в разделе «Справочники» (туториал - https://www.youtube.com/watch?v=-tPQbQPcCbc)
У Вас добавлено поле текстового типа а не лукапное.
Вам просто необходимо сделать аналогично (City, CityPage, CityEditPage), заполнить справочники и отобразить на странице. Все.

Вот я создаю страницу по аналогу к CityEditPage. Называется она UsrClientEditPage. В качестве родительской страницы выбираю Базовая страница редактирования справочника (Base).
В секции MainControlLayout добавляю поле "Поле со списком" CategoryEdit по аналогу к полю CountryEdit. Заполняю поле название CategoryEdit, Заполняю подпись Категория, Источник данных DataSource. А вот в поле Колонка данных мне нужно выбрать колонку Категория, которую я добавил в файл UsrClientType по аналогу к файлу City.
[url=http://pixs.ru/showimage/3jpg_7620539_18972594.jpg][img]http://i10.pixs.ru/thumbs/5/9/4/3jpg_7620539_18972594.jpg[/img][/url]
Но его тут нет.
[url=http://pixs.ru/showimage/3jpg_7410834_18972643.jpg][img]http://i11.pixs.ru/thumbs/6/4/3/3jpg_7410834_18972643.jpg[/img][/url]
Что мне нужно сделать? Помогите пожалуйста!

Вот в поле Колонки у Города стоит объект Город
[url=http://pixs.ru/showimage/3jpg_8725396_18973248.jpg][img]http://i11.pixs…]
А у меня стоит Базовый справочник.
[url=http://pixs.ru/showimage/3_1jpg_8783380_18973271.jpg][img]http://i11.pi…]
Как его поменять на свой справочник?

Николай, как конфигурировать в старом интерфейсе можно посмотреть это видео - https://youtu.be/1-GzbhNAjtM

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

Добрый день.
В процессе разработки на бандле Sales+Marketing выявлена такая ошибка:
При замещении схемы "EventTargetPageV2", перестаёт работать кнопка "Сохранить".
Проблема оказалась в строке

this.superclass.save.apply(this, initialArgs);

в методе save родительской схемы.
Дело в том, что при наличии замещаемых схем метод this.superclass.save переопределяется и ссылается на на самого себя, что приводит к рекурсии.
Исправил переопределением метода save в замещающей клиентской схеме и заменой строки
this.superclass.save.apply(this, initialArgs);

на
this.superclass.superclass.save.apply(this, initialArgs);

Может есть другой (более правильный) вариант решения этой проблемы? Буду признателен за предложения.

Нравится

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

Добрый день, Игорь.

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

"E.Podkovka" написал:Вообще, правильным решением является использование callParent.

callParent не помог.

"Коновалов Игорь" написал:

callParent не помог.

Тогда используйте superclass.superclass.

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

Добрый день!
В ITIL есть поле "Решение" - которое представляет собой строку неограниченной длины
и на странице выглядит таким образом:

Как можно сделать такое поле обязательным по какому-либо условию ( например, при состоянии "разрешено" требовать обязательность его заполнения)

Обычное бизнес-правило для обязательности поля
ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
// Правило регулирует свойство REQUIRED поля.
property: BusinessRuleModule.enums.Property.REQUIRED,
conditions...

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

Нравится

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

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

Для того, чтобы поле "Решение" в карточке обращения стало обязательным, Вы можете воспользоваться мастером раздела, для этого:

1. Перейдите в "Обращения" и нажмите кнопку "Вид"-->"Открыть мастер раздела"
2. Выбрав пакет для редактирования, перейдите на страницу редактирования обращения, потом на детали "Решение", выбрав колонку "Решение" нажмите кнопку "Изменить" и Вы сможете в открывшемся окне поставить признак "Является обязательным"

Спасибо за обращение в поддержку Terrasoft.

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

Мой вопрос звучал так: Как можно сделать такое поле обязательным по какому-либо условию
( например, при состоянии "разрешено" требовать обязательность его заполнения)

причем обычное бизнес-правило для обязательности поля
ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
// Правило регулирует свойство REQUIRED поля.
property: BusinessRuleModule.enums.Property.REQUIRED,
conditions...

здесь не срабатывает

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

Александр, как я уже писала, конкретно для этого поля не работает подобное бизнес-правило.
"Solution: {
"Rule1": {
ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
property: BusinessRuleModule.enums.Property.REQUIRED,
conditions: [{
leftExpression: {
type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
attribute: "Status",
attributePath: "IsResolved"
},
comparisonType: this.Terrasoft.ComparisonType.EQUAL,
rightExpression: {
type: BusinessRuleModule.enums.ValueType.CONSTANT,
value: true
}
}]
}
}

}

Любое другое поле из карточки напишу вместо "Solution" - будет работать.
Для поля же "Решение" (Solution) не работает - с ошибкой вылетает.
Возможно дело в том, что само поле на карточке отображается не так, как все остальные поля - а как кусок текста

Попробуйте использовать свойство элемента "isRequired", напрямую добавив его операцией "merge" к элементу

Попробуйте использовать свойство элемента "isRequired", напрямую добавив его операцией "merge" к элементу

Если добавить
{
"operation": "merge",
"name": "Solution",
"values": {
"caption": {
"bindTo": "Resources.Strings.SolutuinCaption"
},
"isRequired": true
}
}
то возле поля появляется красная звездочка, но обязательным оно не становится.
И в любом случае это же необязательность по условию...

поле "Решение" в карточке отображается как структурированный текст.
Может быть в том случае как-то по-другому надо проверять заполненность?

В таком случае, Вы можете переопределить метод Save и провести валидацию в нем, например вот так:
save: function () {
if (this.get("Solution")) {
this.callParent(arguments);
} else {
this.showInformationDialog("Необходимо заполнить поле решение");
}
}

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

Произвели анализ изменений, которые требуются для решения Вашей задачи.
И получили результат:
HTML - контролл типа RICHTEXT, которым является данное поле «Решение» не поддерживает данную функциональность..

Понятно, спасибо

Добрый день.

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

Татаровская Дарья, вы ссылаетесь на справочное поле (статус) это объект, вам надо получить его GUID и сравнить его. 

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