Добрый день.
После объединения схем из нескольких пакетов в один, пытаюсь удалить старые пакеты из вкл. "Зависит от пакетов" нового пакета, в который перенес схемы.
Долго крутится загрузка после чего появляется список ошибок вида: "Колонка типа справочник название колонки> зависит от недоступной по связям схемы название объекта> пакета Название пакета>".
При этом все пакеты, по которым есть ошибки, уже добавлены в связи нового пакета.

Нравится

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

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

"Мария Ватулина" написал:

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


Я это и пытаюсь сделать.

Здравствуйте, Игорь.
Попробуйте удалить информацию о том, что от этого пакета кто-то зависит на закладке "Зависимые контакты". После этого повторите попытку удалить "лишний" пакет. Если это не поможет. Можно выполнить это напрямую через базу. Там есть две таблицы "SysPackage" и "SysPackageDependency". В первой таблице содержатся, собственно, пакеты, а во второй - их связи. Так вот, удалите из второй таблицы информацию о том, что от пакета, который нужно удалить, кто-то зависит (в поле DependOnPackageID - ID пакета, который нужно удалить). Потом попробуйте удалить пакет из таблицы "SysPackage".

P.S.: предварительно обязательно сделайте бэкап.

Предоставили Backup базы со схемой зависимости пакетов

Здравствуйте. Вопрос передан соответствующей команде разработки.

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

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

Событие в БП понятно какое - Новая запись в объекте "Сообщение/комментарий". А дальше? Не совсем понятно как через доступные поля с guid (схема и экземпляр объекта) выйти на ответственного. Что вообще означают эти два поля?

Нравится

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

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

Зная, с какого объекта начинать, - сделать первый шаг бизнес процесса.
Схема - UId объекта, в котором оставлен комментарий (по сути это уникальный идентификатор объекта в системе)
Экземпляр объекта - Id записи в объекте.

Теперь Вам необходимо элементом "Задание-сценарий" считать значение OwnerId для определения ответственного за запись (Id которой у Вас есть) в объекте (UId которого у Вас есть) (элемент читать данные не подходит - там нельзя динамически определять объект).

Ну и остался последний шаг:smile: - элементом "Добавить данные" необходимо добавить запись в объект "Уведомления", указав значения полям "Кому" (ответственному), "Объект" (UId объекта), "Уникальный идентификатор записи" (Экземпляр объекта), Время (Текущая дата и время).

Конец процесса.

"Демьяник Алексей Олегович" написал:Зная, с какого объекта начинать, - сделать первый шаг бизнес процесса.
Схема - UId объекта, в котором оставлен комментарий (по сути это уникальный идентификатор объекта в системе)
Экземпляр объекта - Id записи в объекте.

Спасибо! Я правильно понимаю, что если, например, комментарий оставлен в какой-либо задаче, то "Схема - UId объекта" - будет указывать на "Активности", а "Экземпляр объекта - Id записи в объекте" - это GUID конкретной задачи?

"Мамедов Фариз Эльдарович" написал:

Спасибо! Я правильно понимаю, что если, например, комментарий оставлен в какой-либо задаче, то "Схема - UId объекта" - будет указывать на "Активности", а "Экземпляр объекта - Id записи в объекте" - это GUID конкретной задачи?

Да, совершенно верно!

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

Для того, чтобы поставить "тег на пользователя" Вам необходимо записать в объект SocialMention (Упоминания пользователя) Контакт пользователя в поле "Контакт" и Id комментария, в котором пользователь был упомянут, в поле "Сообщение".

сделал, но все равно не появляется уведомление в комм. панели о новом сообщении. Сообщение появляется, но в комм. панели не отражается этот факт.

На коммуникационной панеле есть две кнопки, связанные с лентой:
1) Лента
2) Уведомления ленты

Уведомления ленты пользователь получает, если:
1) Запись пользователя была прокомментирована
2) На записи пользователя нажали "like"

Сообщения в ленту пользователь получает уведомления, если он подписан на ленту. Например, пользователь Шевченко П.Р. подписался в разделе "Contacts" на запись "Иванющенко В.А".
В случае, если другой пользователь Калиниченко С.Т. напишет сообщение в ленте записи контакта Иванющенко В.А. какое-то сообщение, тогда в ленте на коммуникационной панеле пользователь Шевченко П.Р. увидит сообщение, написанное Калиниченком С.Т.

Шевченку П.Р. понравился комментарий написанный Калиниченком С.Т..
Шевченко П.Р. нажал "Нравится" и оставил свой комментарий к записи Калиниченком С.Т.
У пользователя Калиниченко С.Т. количество уведомлений в ленте увеличится на два.

То есть, это нормальное поведение системы.

Я правильно понимаю, что для реализации моего фукнционала, надо помимо того, что я пишу сообщения в ленту Активности, надо еще подписать Автора активности на ленту этой активности?

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

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

Добавляю в рамках БП записи в объекты (пробовал во все)
Упоминание пользователя
Уведомление ленты

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

Добавляю в рамках БП записи в объекты (пробовал во все)
Упоминание пользователя
Уведомление ленты

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

"Демьяник Алексей Олегович" написал:

Ну и остался последний шаг:smile: - элементом "Добавить данные" необходимо добавить запись в объект "Уведомления", указав значения полям "Кому" (ответственному), "Объект" (UId объекта), "Уникальный идентификатор записи" (Экземпляр объекта), Время (Текущая дата и время).

Конец процесса.

Только сама запись не должна находится в конечном состоянии..

"Демьяник Алексей Олегович" написал:

Ну и остался последний шаг - элементом "Добавить данные" необходимо добавить запись в объект "Уведомления", указав значения полям "Кому" (ответственному), "Объект" (UId объекта), "Уникальный идентификатор записи" (Экземпляр объекта), Время (Текущая дата и время).

Конец процесса.

Только сама запись не должна находится в конечном состоянии..

Спасибо, но в этом то как раз и затык. Суть кейса - уведомить автора задачи о том, что ответственный её выполнил. И как раз таки задача находится в конечном состоянии. В этом случае, уведомления не работают. Поэтому хочу добавлять комментарий в ленту задачи (это получается), но надо еще оповестить автора.

Тогда поступим по другому.
1) Добавим в "Сообщение/комментарий" одну запись:

  • Контакт - Автор
  • Сообщение/комментарий - "Выполнение задачи"
  • Схема
  • Экземпляр

2) Добавим в "Сообщение/комментарий" еще одну запись:

  • Контакт - Ответственный
  • Сообщение/комментарий - "Задача выполнена"
  • Родительское сообщение - Id созданной записи с первого пункта
  • Схема
  • Экземпляр

Система создаст уведомление автору, что его запись была прокомментирована ответственным.:smile:

Добрый день!
Скажите, пожалуйста, а как сделать в данном случае в бизнес-процессе не просто сигнал на добавление записи в объект "Сообщение/комментарий", а сигнал на то, что сообщение в ленту было добавлено в привязке к обращению или к контрагенту?
Надо, я так понимаю, в условиях сигнала выбрать то, что сигнал должен соответствовать условиям,
и указать схему - UID объекта, в котором оставлено сообщение в ленте ( т.е. UID объекта обращение/ контрагент). Где посмотреть можно этот UID в конфигурации - какой указать?
Предполагаю, что в метаданных объекта MetaData.Schema.UId? А если объектов несколько для обращения, то смотреть в последнем унаследованном?

"Татаровская Дарья" написал:

Добрый день!

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

Надо, я так понимаю, в условиях сигнала выбрать то, что сигнал должен соответствовать условиям,

и указать схему - UID объекта, в котором оставлено сообщение в ленте ( т.е. UID объекта обращение/ контрагент).

Здравствуйте, Дарья! С этой частью полностью согласен - нужно указать условия в фильтре стартового сигнала.

"Татаровская Дарья" написал:

Где посмотреть можно этот UID в конфигурации - какой указать?

Предполагаю, что в метаданных объекта MetaData.Schema.UId? А если объектов несколько для обращения, то смотреть в последнем унаследованном?

А здесь я бы по другому сделал - добавил бы какой-то уникальный комментарий "АБЫРВАЛГ" к записи в разделе Контрагенты. Далее бы открыл MS SQL и выполнил скрипт

select EntitySchemaUId from SocialMessage where Message = "АБЫРВАЛГ"

И для записи в разделе "Обращения" сделал бы то же самое (только сообщение желательно изменить, чтобы не запутаться).

Добрый день! Через sql я в принципе понимаю как найти... - эта если у меня версия on-site
А если версия on-demand?

Можно бизнес процессом:
1) Чтение данных по объекту "Сообщение/комментарий" с фильтром Сообщение = "АБЫРВАЛГ"
2) Формула - подставить в параметр "Текстовое поле" автогенерируемой страницы, выбрать параметр "Схема" из чтения данных
3) Автогенерируемая страница с одним полем "Текстовое поле".

После запуска процесса откроется автогенерируемая страница и в текстовом поле будет Id...

"Демьяник Алексей Олегович" написал:

Тогда поступим по другому.

-skip-

Система создаст уведомление автору, что его запись была прокомментирована ответственным.:smile:

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

Понятно)) через sql быстрее, конечно.
Спасибо, попробую на клиенте повторить еще эти действия.
А вообще UID разный будет в разных сайтах (версия одна, сборка одна)
? Если у меня есть, например, сайт on-site,и сайт on-demand ( такая же версия, такая же сборка) - то там UID для схемы будет не совпадать?

И еще вопрос: Вы писали, что необходимо элементом "Задание-сценарий" считать значение OwnerId для определения ответственного за запись (Id которой у Вас есть) в объекте (UId которого у Вас есть) (элемент читать данные не подходит - там нельзя динамически определять объект).
Где можно посмотреть пример подобного считывания, скажите, пожалуйста.

Спасибо

Коробочные объекты имеют одинаковый UId, пользовательские - разные.

"Татаровская Дарья" написал:

И еще вопрос: Вы писали, что необходимо элементом "Задание-сценарий" считать значение OwnerId для определения ответственного за запись (Id которой у Вас есть) в объекте (UId которого у Вас есть) (элемент читать данные не подходит - там нельзя динамически определять объект).

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

Спасибо

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

Спасибо
В своем процессе я создавала не уведомление, а уведомление по ленте.
Т.к. на ленте оставляют сообщения пользователи веб-портала, а у них нет прав на уведомления, только на уведомления по ленте.
В принципе, все получилось:
уведомление по ленте создается
использовала элемент Добавление данных
(заполненные поля:
владелец - ответственный из обращения; сообщение - ссылка на сообщение в ленте; прочитанное = false; тип - "опубликовал новое сообщение")
Но для того, чтобы на правой панели в кнопке "уведомления по ленте" появилась цифра "1"( то есть признак того, что появилось новое уведомление), необходимо нажать f5 - обновить страницу.

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

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

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

Спасибо

"Демьяник Алексей Олегович" написал:

Можно бизнес процессом:

1) Чтение данных по объекту "Сообщение/комментарий" с фильтром Сообщение = "АБЫРВАЛГ"

2) Формула - подставить в параметр "Текстовое поле" автогенерируемой страницы, выбрать параметр "Схема" из чтения данных

3) Автогенерируемая страница с одним полем "Текстовое поле".

После запуска процесса откроется автогенерируемая страница и в текстовом поле будет Id...

Добрый день!
С текстовым полем не получается
Возникает
ошибка преобразование типа System.GUID в String невозможно,
т.к. значение идентификатора пытается засунуться в поле типа стринг

А в преднастроенной странице нет поля типа идентификатор...

Как тогда получить значение это на on-demand?

Ну как вариант использовать конструкцию [Параметр].ToString().
Кстати, элемент "Формула" преобразовывает данные в текстовый вид. Его нужно использовать перед элементом "Преднастроенная страница".

формулу использовала как раз до элемента пренднастроенная страница.
[Параметр].ToString() - такая конструкция помогла, спасибо.
Единственное, в параметр надо было помещать не схему из чтения данных, а экземпляр объекта из чтения данных

"Демьяник Алексей Олегович" написал:Ну и остался последний шаг - элементом "Добавить данные" необходимо добавить запись в объект "Уведомления", указав значения полям "Кому" (ответственному), "Объект" (UId объекта), "Уникальный идентификатор записи" (Экземпляр объекта), Время (Текущая дата и время).

Хотела бы добавить уведомление по объекту(обращение) с помощью элеманта "Добавить данные"
у уведомления есть следующие поля
"Кому" - это ответственный
"Объект" - UID схемы объекта, по которому должно прийти уведомление
"Уникальный идентификатор заголовка" - это идентификатор самого объекта
"Время" - текущая дата и время
"Автор" - текущий контакт
SubjectCaption - это наименование уведомления

но есть еще

"SourceId" (Источник) - что такое источник? что необходимо туда вписывать?

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

Здравствуйте, Дарья!

Можно посмотреть в базе данных за что эти поля отвечают. Если я правильно помню, то эти поля не заполняются.

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

var Ownerid1 =
new Select(UserConnection)
.Column("Ownerid")
.From("Opportunity")
.Where("Id").IsEqual(Column.Parameter(RecordId));
return true;

Переменные Ownerid1и RecordId описала в параметрах как уникальные идентификаторы, значение для RecordId передала через кубик Формула.
Кубиком Добавить вставляю ответственного в поле Кому, но значение не передается (посмотрела через SQL запрос). Получается, что неправильно передаю Ownerid1. Подскажите, пожалуйста, как передать Ownerid1 корректно. Спасибо!

Здравствуйте, Юлия!

Используйте элемент "Чтение данных".

Данная задача решается следующим минимальным набором элементов:
1) Стартовый сигнал
2) Чтение данных продажи
3) Чтение данных ответственного
4) Отправить email
5) Конец процесса

Алексей, спасибо за ответ! Похоже я неточно описала задачу... необходимо создать уведомление ответственному в Уведомлениях в Ленте.

Здравствуйте!
Я ренее в этой теме описывал реализацию.

Только в первом сообщении должен быть ответственный, а "комментировать" должен Supervisor.

Алексей, добрый день! У нас задача получается такая, что при изменении ответственного в продаже появляется новое уведомление справа в Уведомлениях, при этом нам не надо создавать задачу ответственному. Вставляю кубиком Добавить в Уведомления ответственного, заголовок. SQL запросом проверили, что это все в таблице Уведомления есть. Добавили в Сообщения/Комментарии ответственного (уведомление необходимо только ответственному). Новое уведомление не появляется, процесс завершается успешно. Подскажите, пожалуйста, что сделали неверно. Спасибо!

Юлия, Вы меня запутали!

В системе есть два объекта "Уведомление" и "Сообщение/комментарий". Они между собой не связаны.

"Юлия Мишутина" написал:

Добавили в Сообщения/Комментарии ответственного (уведомление необходимо только ответственному).

Уведомления по новым сообщениям в ленте не приходят.

Алексей, добрый день!
Перед нами стоит следующая задача: при изменении ответственного по продаже необходимо чтобы пользователю, который стал ответственным, приходило уведомление справа на панели, где уведомления по задачам, в формате «Вы стали ответственным по продаже №…», при этом количество уведомлений также отображалось (т.е. появилось новое, появилась единичка) и была возможность перейти в объект Продажа, как сейчас можно перейти в Активность, при этом никакая задача создаваться не должна, только уведомление на панели.
Мы создали БП, состоящий из следующих действий:
1.Сигнал-Изменили ответственного в Продаже;
2.Читать продажу;
3.Читать ответственного по продаже;
4. Добавить уведомление ответственному по продаже.
В «Добавить уведомление ответственному по продаже» Объект-Справочник.Продажа, Уникальный идентификатор заголовка-ID измененной продажи,Кому-ID ответственного.
При изменении ответственного в продаже бизнес-процесс завершается без ошибок, но ни уведомление, ни отображение нового уведомления не появляются. Если смотреть sql запросом уведомления в таблице уведомлений, они есть.
Подскажите пожалуйста, что мы делаем не так и как реализовать поставленную задачу? Спасибо!

Здравствуйте, Юлия!

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

Вам необходимо заполнять следующие поля:
Объект (выбор значения из справочника - Продажа)
Уникальный идентификатор заголовка - (Id продажи)
Кому - (Ответственный)
Время - (текущая дата/время)
Описание
Источник (выбор значения из справочника - Ответственный)
Заголовок

Здравствуйте, Юлия!

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

Вам необходимо заполнять следующие поля:
Объект (выбор значения из справочника - Продажа)
Уникальный идентификатор заголовка - (Id продажи)
Кому - (Ответственный)
Время - (текущая дата/время)
Описание
Источник (выбор значения из справочника - Ответственный)
Заголовок

Алексей, подскажите, пожалуйста, что имеется в виду под конечным состоянием продажи. Если это Активность, с ней вроде понятно, если активность в Статусе "завершена", значит она в конечном состоянии. У Продажи есть только Стадия и мы тестируем на "Определении потенциала". В поле Источник значение добавили, уведомления не появились. Спасибо!

Здравствуйте, Юлия!

Рекомендую по данному вопросу зарегистрировать обращение в службу поддержки (желательно, чтобы это обращение было зарегистрировано от имени авторизованного лица:smile:).

В данном случае речь идет о стадии продажи. Конечное состояние определяется соответствующим признаком в справочнике.

все тикеты как правило заканчиваются одинаково - ничем.

Где пример как создать напоминание в коде C#? 

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

Добрый день!
в ITIL 7.6
есть такое поле "Категория" в карточке Обращения - оно обязательно к заполнению
Скажите, пожалуйста, где настроена обязательность этого поля?(хотела бы сделать обязательным в зависимости от определенных условий)
В объекте "Обращение" прописано, что колонка "Категория" обязательна к заполнению на уровне приложения, но если унаследовать объект "Обращение", и убрать обязательность этой колонки,
то колонка "Категория" все равно остается обязательной для заполнения - т.е. где-то еще в каком-то скрипте настроена обязательность этой колонки?

Нравится

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

Привет Дарья.

Для управления обязательностью поля лучше использовать бизнес правила, пример использования: http://www.community.terrasoft.ru/forum/topic/12988

Спасибо за совет)) но я не пытаюсь управлять обязательностью какого-то поля. Я пытаюсь найти, где в стандартной конфигурации Itil 7,6 прописана обязательность колонки категория в обращении. Помимо самого объекта обязательность данной колонки похоже прописана где-то еще, но только вот где?

В самом объекте case у поля Категория стоит признак обязательно на уровне приложения.

Да, стоит, как я уже писала. Но если его снять, то поле будет по-прежнему обязательно. Значит, где-то еще в скрипте прописана обязательность, только вот где?

Обязательность поля Категория проставлена в 2х местах:

1) В самом объекте case;
2) В карточке редактирования обращения CasePage;

Спасибо, Григорий. А можно поточнее - из какой именно схемы casepage - в каком пакете? Я не нашла обязательность этого поля в схемах casepage

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

Григорий, я уже проделывала эти действия..
В самом объекте Обращения снят признак обязательности "на уровне приложения" с колонки Категория
В мастере пробовала снимать этот признак, но поле в карточке обязательно по-прежнему.

Такое ощущение, что он где-то принудительно устанавливается

Добрый день!

Попробуйте убрать обязательность с помощью кода, установить аттрибут "isRequired" в значение false

	{
		"operation": "merge",
		"name": "Category",
		"values": {
			"layout": {
				"column": 0,
				"row": 5,
				"colSpan": 12,
				"rowSpan": 1
			},
			"caption": {
				"bindTo": "Resources.Strings.CategoryCaption"
			},
			"textSize": "Default",
			"labelConfig": {
				"visible": true
			},
			"enabled": true,
			"isRequired": false
		}
	},

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

 
				//Category - название аттрибута на который мы хочем наложить бизнес-правило
				Category": {
					//название бизнес-правила
					"RequireCategoryFinalState": {
						ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
						//BusinessRuleModule.enums.Property.REQUIRED - тип бп
						property: BusinessRuleModule.enums.Property.REQUIRED,
						conditions: [{
							leftExpression: {
								type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
								attribute: "Status", //Колонка объекта Case, которая ссылаеться на справочник статусов CaseStatus
								attributePath: "IsFinal"  //Колонка в таблице Status, то есть Status.IsFinal (CaseStatus)
							},
							comparisonType: this.Terrasoft.ComparisonType.EQUAL,
							rightExpression: {
								type: BusinessRuleModule.enums.ValueType.CONSTANT,
								value: true //Тут может быть ИД, или любой другой тип данных
							}
						}]
					}
				}

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

Так же надо повесить вызов соответствующих методов на событие init и на изменение одного из значений, которые участвуют в условии.
Простой кейс: при переводе обращение в статус “В работе”, делать обязательным поле Категория

Пример с методом:

 
/*
Указываем в контроле Category, метод, который будет 
определять обязательность для поля 
"isRequired": 
{
	"bindTo": 'isCategoryRequired'
}
 
 
В атрибутах надо прописать обработчик, который будет 
отрабатывать при изменении значение поля Статус
	*/
attributes: {
	"Status": {
		dependencies: [
			{
				columns: ["Status"],
				methodName: "onStatusItemChanged"
			}
		]
	}
},
/*Повесим вызов метод на init, чтобы при открытия 
карточки у нас отрабатывало условие*/
init: function() {
		 this.callParent(arguments);
		 this.isCategoryRequired();
	},
 
isCategoryRequired: function() {
		var statusId = this.get("Status").value;
		return statusId === CONSTANTA.CASESTATUS.ACTIVE;
},	
/*Повесим вызов метода при изменении статуса onStatusItemChanged, 
чтобы при изменении значения поля Статус
 у нас отрабатывала логика*/	 
 onStatusItemChanged: function() {
//Вызов метода/ов, в данном случае метода isCategoryRequired	 
		this.isCategoryRequired();
},

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

init: function() {
 this.callParent(arguments);
 this.checkIfCategoryRequired();
},
 
checkIfCategoryRequired: function() {
	var isRequired,
	statusId = this.get("Status").value;
	isRequired = statusId === CONSTANTA.CASESTATUS.ACTIVE;
	this.set("isCategoryRequired", isRequired);
},	
 
onStatusItemChanged: function() {
	 this.checkIfCategoryRequired();
},

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

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

Так а повесить бизнес-правило?
Атрибут "isRequired": false + правило и все работает.
Это чисто тестовый пример, при создании карточки не требует заполненного поля, но после - да.
И уберите значение по умолчанию, для поля Category, если оно не обязательно

"Category": {
	"RequiredTypeOnAdd": {
		ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
		property: BusinessRuleModule.enums.Property.REQUIRED,
		conditions: [{
			leftExpression: {
				type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
				attribute: "Operation"
			},
			comparisonType: this.Terrasoft.ComparisonType.NOT_EQUAL,
			rightExpression: {
				type: BusinessRuleModule.enums.ValueType.CONSTANT,
				value: Enums.CardStateV2.ADD
			}
		}]
	}
}

Спасибо!
Атрибут "isRequired": false + правило - заработало ( перекрыло какое-то бизнес-правило в стандартной конфигурации, которое требовало обязательность?)
В качестве бизнес-правило использовало другое правило, не из вашего примера.

Вопрос по вашем примеру
Enums.CardStateV2.ADD
ругается, что Enums is not defined.
Скажите, пожалуйста, что необходимо подключить в скрипт схемы, что он понимал, что такое Enums ?

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

define("CasePage", ["CasePageResources", "GeneralDetails", "BusinessRuleModule", "ConfigurationEnums"],
function(resources, GeneralDetails, BusinessRuleModule, Enums)

Да, пример, собственно, не нужен - просто про модуль спросила.

В общем-то, Атрибут "isRequired": false + бизнес- правило работает.
Хотя так и непонятно до конца, где же крылась обязательность данного поля в базовой конфигурации.
Ну да ладно- главное, что можно ее обойти.
Спасибо

Моя рекомендация, установите себе jetBraine WebStorm, файлы JS стоит выгружать по указанному пути

C:\inetpub\wwwroot\Название сайта\Terrasoft.WebApp\Resources\ui\Terrasoft\configuration\JS

Потом в web.config прописать

    <add key="CompilerSourcesTempFolderPath" value="C:\inetpub\wwwroot\Название сайта\Terrasoft.WebApp\Resources\ui\Terrasoft\configuration\JS" />

Дальше делаете поиск по файлам, там много можно разных примеров подсмотреть.

"Александр Зубков" написал:init: function() {
this.callParent(arguments);
this.checkIfCategoryRequired();
},

checkIfCategoryRequired: function() {
var isRequired,
statusId = this.get("Status").value;
isRequired = statusId === CONSTANTA.CASESTATUS.ACTIVE;
this.set("isCategoryRequired", isRequired);
},

onStatusItemChanged: function() {
this.checkIfCategoryRequired();
},

Александр, вы приводили такой пример.
в вашем примере есть CONSTANTA.CASESTATUS.ACTIVE
это определенное значение статуса ( в работе)
Скажите, пожалуйста, где задается подобная CONSTANTA.CASESTATUS.ACTIVE,
где ее необходимо определять?

Спасибо, нашла ответ на свой вопрос
это константа, определенная в модуле по типу

define("UsrConsts", [], function() {

var caseStatus = {
Close: "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
};

return {
CaseStatus: caseStatus
};

});

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

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

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

Простой кейс: при переводе обращение в статус “В работе”, делать обязательным поле Категория

Пример с методом:

       

/*

Указываем в контроле Category, метод, который будет

определять обязательность для поля

"isRequired":

{

        "bindTo": 'isCategoryRequired'

}





В атрибутах надо прописать обработчик, который будет

отрабатывать при изменении значение поля Статус

        */

attributes: {

        "Status": {

                dependencies: [

                        {

                                columns: ["Status"],

                                methodName: "onStatusItemChanged"

                        }

                ]

        }

},

/*Повесим вызов метод на init, чтобы при открытия

карточки у нас отрабатывало условие*/

init: function() {

                 this.callParent(arguments);

                 this.isCategoryRequired();

        },

               

isCategoryRequired: function() {

                var statusId = this.get("Status").value;

                return statusId === CONSTANTA.CASESTATUS.ACTIVE;

},     

/*Повесим вызов метода при изменении статуса onStatusItemChanged,

чтобы при изменении значения поля Статус

 у нас отрабатывала логика*/       

 onStatusItemChanged: function() {

//Вызов метода/ов, в данном случае метода isCategoryRequired     

                this.isCategoryRequired();

},

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

init: function() {

 this.callParent(arguments);

 this.checkIfCategoryRequired();

},

                               

checkIfCategoryRequired: function() {

        var isRequired,

        statusId = this.get("Status").value;

        isRequired = statusId === CONSTANTA.CASESTATUS.ACTIVE;

        this.set("isCategoryRequired", isRequired);

},     



onStatusItemChanged: function() {

         this.checkIfCategoryRequired();

},


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

Игорь, вопрос. Вы проводили отладку кода?
Также есть же другие способы реализации.
- http://www.community.terrasoft.ru/forum/topic/15340
- http://www.community.terrasoft.ru/forum/topic/12990

Единственным вариантом решения многоуровневого условия обязательности полей является применение валидации нужного поля.

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

Добрый день!

Сталкивался ли кто-нибудь в миграции данных с TS 3.X на bpm'online 7.x с вопросом переносов файлов? Удалось это реализовать в более-менее автоматическом режиме?

Спасибо

Нравится

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

Здравствуйте.
Файлы и в той и в той системе хранятся в виде больших бинарных объектов. Процесс переноса не автоматизировали. Каждый случай рассматривается отдельно. Здесь можно абстрагироваться от продукта, в принципе. Есть две базы данных, содержащие некие сущности, которые нужно перенести. Возможно, в некоторой степени, поможет автоматизировать процесс утилита bdForge или аналогичная.

Понятно, что при доработках, да и без них есть нюансы. Но не каждый же раз изобретать велосипед для переноса tbl_Files?

Владимир, на текущий момент, такого инструмента в природе не существует и изобретение "велосипеда" не гарантируется в виду его незначительной востребованности.

Как я понимаю, в 3.X все файлы хранились в tbl_Files, а в bpm'online есть таблица File на каждую сущность (например, ContactFile).
А при этом есть еще таблица File. Что в ней записано?

В таблице, File bpm'online 7.x, не хранится ни какой информации (это наследие от bpm'online 5.x). Для Контактов файлы хранятся в таблице ContactFile, для Контрагентов в таблице AccountFile и т.д.

Пример простого переноса файлов из детали Файлы раздела Контакты (TS) в раздел Контакты ( bpm'online 7.x):

DECLARE @SupervisorBPMID UNIQUEIDENTIFIER = '410006E1-CA4E-4502-A9EC-E54D922D2C00';
DECLARE @SupervisorTSID UNIQUEIDENTIFIER = 'FFC4AABA-4882-41FC-8AC0-FC54D6DCFE93';
 
INSERT INTO [BPMonline_760_SalesOmnichannel_DemoInternal_Tereshchuk].[dbo].[ContactFile]
	([ContactId]
      ,[ProcessListeners]
      ,[Id]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[Name]
      ,[Notes]
      --,[LockedById]
      --,[LockedOn]
      ,[Data]
      ,[TypeId]
      ,[Version]
      ,[Size]) 
SELECT 
	@SupervisorBPMID, 
	0, 
	NEWID(), 
	[CreatedOn], 
	@SupervisorBPMID/*CreatedByID*/, 
	[ModifiedOn], 
	@SupervisorBPMID/*ModifiedByID*/,
	[Link],
	ISNULL([Description], ''), 
	[FileData],
	case [ItemTypeID] 
		when '{39A5B367-4A7A-473E-8F74-26977CB6DB67}' then '529BC2F8-0EE0-DF11-971B-001D60E938C6'	-- Файл -> Файл
		when '{94A8A85B-7EAF-405C-900A-58DC0301EDC2}' then '539BC2F8-0EE0-DF11-971B-001D60E938C6'	-- Ссылка -> Ссылка
		when '{6D180D71-36C5-4278-8224-505B06559FD5}' then null										-- URL -> 
		when '{B48F1491-1460-4A18-A4A3-B13FD6EE5624}' then '549BC2F8-0EE0-DF11-971B-001D60E938C6'	-- Ссылка на папку -> Ссылка на объект
	end, 
	[Revision],
	[FileSize] 
FROM [TS_3.4.0.130_XRM_SD_Softkey_RUS].[dbo].[tbl_Files] WHERE [ID] IN (SELECT [FileID] FROM tbl_FileInContact WHERE [ContactID] = @SupervisorTSID)

Важно!
1. Идентификаторы пользователей Контактов TS, должны совпадать с идентификаторами пользователей Контактов bpm'online 7.x (в моем примере идентификаторы Supervisor не совпадают, и по этой причине привожу явно)
2. Любой импорт лучше выполнять через шлюзовые таблицы
3. В TS есть перечисление enm_FileTypes, а в bpm'online 7.x это таблица FileType, в запросе необходимо явно приводить типы (в моем примере это сделано через case)

Спасибо огромное за помощь!

И еще вопрос про опыт. Если перенос делать через Excel, то можно ли сохранить ID записей, чтобы использовать их для связывания?
А то однофамильцы, к которым надо привязать средства связи встречаются сплошь и рядом

Да, можно. Для этого необходимо вывести поле ID в раздел

Может быть, можно еще и связывать объекты (например, адрес с котнтактов) не по Имени-Фамилии контакта, а по его ID?

Да, можно. Для этого необходимо вывести поле ID записи и ID контакта в раздел

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

Добрый день!
в BPM есть возможность сделать поле обязательным по какому-то условию
с помощью BINDPARAMETER

по правилу
rules: {
"Fieldname": {
BindParameterRequiredAccountByType: {
ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
property: BusinessRuleModule.enums.Property.REQUIRED,

conditions: [{
// Выражение левой части условия.
leftExpression: {
type:
attribute:
attributePath:
},
comparisonType: Terrasoft.ComparisonType.NOTEQUAL,
rightExpression: {
type: ,
value:
}
}]
}
}

Скажите, пожалуйста, если я хочу, чтобы условие было следующим
Terrasoft.CurrentUser.userType != Terrasoft.UserType.SSP
( т.е. текущий пользователь не является пользователем веб-портала)

то что я должна написать в левой части условия и в правой?
что необходимо указывать в type, attribute, attributePath
для Terrasoft.CurrentUser.userType
type в этом случае BusinessRuleModule.enums.ValueType.CONSTANT?
а что тогда attribute, attributepath?

правая часть выражения Terrasoft.UserType.SSP в этом случае как должна выглядеть?
type тоже в этом случае BusinessRuleModule.enums.ValueType.CONSTANT,
а value это Terrasoft.UserType.SSP ?

P.S. в каком пакете сейчас находится модуль BusinessRuleModule? где можно его посмотреть?(версия 7.6)

Нравится

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

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

Для решения задачи рекомендуем ознакомится со статьей “Как сделать поле обязательным для заполнения по определенному условию”
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/RequiredFi…

В версии 7.6 схема BusinessRuleModule находится в пакете NUI.

Добрый день! Спасибо, я эту статью читала.
Там в примере - Правило зависимости обязательности поля [Контрагент] от значения в поле [Тип].
там понятно, что указывать в левой и в правой части условия.
мне не понятно, как должна выглядеть левая часть условия в данном выражении,
если левая часть условия - это Terrasoft.CurrentUser.userType

Какой тип выражения должен быть в данном случае?
Возможные значения: ATTRIBUTE, CONSTANT, SYSSETTING, SYSVALUE, CARDSTATE
Тип текущего пользователя - это же не аттрибут модели представления и не константа, не
системная настройка, не системное значение и не состояние карточки.
Тогда что это? какое значения для type выбрать в этом случае?

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

Если бы необходимо было использовать в сравнении значение Terrasoft.CurrentUser - тип выражения должен быть SYSVALUE. Но в Вашем случае можно использовать следующий подход:

1) для правого выражения указать тип CONSTANT и значение Terrasoft.UserType.SSP;
2) создать в блоке attributes атрибут

"CurrentUserType": {
	dataValueType: Terrasoft.DataValueType.TEXT,
	value: Terrasoft.CurrentUser.userType 
}

3) для левого выражения указать тип ATTRIBUTE и атрибут CurrentUserType.

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

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

Нравится

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

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

Если Вам не трудно, прошу Вас уточнить Ваш вопрос скриншотами.

Если я правильно понял, то Вас интересует как передать значение со страницы проекта в страницу детали, чтобы рассчитать значение полей. Это можно сделать с помощью messages.
1. В объект messages проекта добавить SUBSCRIBE. В объект messages детали добавить PUBLISH.
2. На init проекта подписаться на сообщение
this.sandbox.subscribe("GetSomeInfoFromDetail", function(argument) {
return this.someFunctionUsingArgument();
}, this, ["key"]);
3. На детали, когда Вам нужно получить значение с проекта сделать sandbox.publish
var result = this.sandbox.publish("GetSomeInfoFromDetail", valueToSend, ["key"]);

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

Спасибо, Вы очень помогли :smile:

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

Добрый день!
В разделе Обращения в ITIL есть деталь Активности.
На данной детали при нажатии на кнопку Добавить появляется
выпадающий список: "Добавить задачу" или "E-mail"

Подскажите, пожалуйста, в какой схеме какого пакета реализован вызов данного выпадающего списка.
В схеме CaseActivityDetail не нашла подобного функционала.

Спасибо

Нравится

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

Добрый день!

Дарья, сам механизм находится в схеме BaseGridDetailV2, но Вы не сможете вносить туда модификации, да и не надо, в принципе.
Вы можете воспользоваться стандартными средствами работы СРМ: откройте мастер раздела "Активности", добавьте новую карточку редактирования для нужного типа, сделайте дизайн карточки, сохраните, выполните команду flushall в командной строке Redis Client. Предварительно внесите тип в справочник "Типы активности".
Этих действий достаточно.

Добрый день!
Но я не планировала делать новую карточку редактирования для нужного типа )
Я бы хотела внести изменения в начальные значения для существующего типа e-mail
При нажатии на действие "e-mail" в детали Активности в разделе Обращения хотела бы? чтобы в поле "Кому" подставлялся определенный адрес ( не конкретный адрес, а зависящий от данных в обращении).
Возможно ли такое?
В связи с этим и спрашивала, где находится вызов этих действий, чтобы найти далее какая карточка вызывается при нажатии на действие e-mail

Извините, не понял саму суть задачи. Что значит "чтобы в поле "Кому" подставлялся определенный адрес"?
Там байндинг происходит автоматически на открытие карточек AddTypedRecordButton => values => menu => items = >

"bindTo": "EditPages

".

		AddTypedRecordButton
				{
					"operation": "insert",
					"name": "AddTypedRecordButton",
					"parentName": "Detail",
					"propertyName": "tools",
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"menu": {
							"items": {
								"bindTo": "EditPages"
							}
						},
						"visible": {"bindTo": "getAddTypedRecordButtonVisible"},
						"enabled": {"bindTo": "getAddTypedRecordButtonEnabled"},
						"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
						"caption": {"bindTo": "Resources.Strings.AddButtonCaption"}
					}
				},

Что в итоге вы хотите получить, более подробно объясните суть бизнес логики, которая должна быть реализована.

Добрый вечер!
Спасибо, я в принципе, получила ответ на свой вопрос.
При нажатии на действие "Email" вызывается обычная карточка ActivityPage, но только типизированная с типом e-mail
соответственно, те изменения, которые я хочу произвести ( заполнение некоторых значений по-умолчанию при нажатии на "email" в детали) необходимо делать в схеме CaseActivityDetail.
Просто я почему-то предположила, что здесь какая-то другая схема для e-mai участвует, и пыталась ее найти, но оказывается схема та же самая CaseActivityDetail

Спасибо

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

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

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

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

Здравствуйте!
В разделе "Активности" есть представление "Планирование визитов". На нем расположен список контрагентов, расписание и карта.
Если я добавляю эти объекты в свой раздел,то они располагаются друг под другом. Подскажите, пожалуйста, где можно настроить их позиции так, чтобы они были как на планировании визитов (т.е., в строчку, а не столбиком)?

Нравится

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

Добрый день, Никита.

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

Если я правильно понял, то Вы имеете в виду объекты: реестр, расписание и карта. Если это те объекты, о которых речь, то их позиционирование регламентируется CSS стилями. Подробнее о расположении элементов в строку с помощью CSS можно почитать тут:
http://htmlbook.ru/samlayout/blochnaya-verstka/strochno-blochnye-elemen…
И по запросу в Google:
css div расположение элементов в строку

"E.Podkovka" написал:

Если я правильно понял, то Вы имеете в виду объекты: реестр, расписание и карта. Если это те объекты, о которых речь, то их позиционирование регламентируется CSS стилями.


Действительно, добавил свой модуль с разметкой и подключил его. Все заработало. Спасибо!

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

Необходимо применить фильтр к комбобоксу StatusEdit в карточке редактирования задачи.

При применении следующего кода:

Page.StatusEdit.PrepareLookupFilter += delegate (object sender, ComboBoxEditEventArgs e) {
var InWorkStatusId = "394D4B84-58E6-DF11-971B-001D60E938C6";
Collection> filters = e.Filters;
filters.Add(new Dictionary {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {InWorkStatusId}}});
};

При выборе выпадающего списка происходит следующая ошибка:

Exception Message: The control 'PageContainer_StatusEdit' does not have an AjaxEvent with the name 'InternalPrepareLookupFilter' or the handler is absent

Что не так делаю?

Нравится

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

Попробуйте так:

Page.StatusEdit.PrepareLookupFilter += delegate (object sender, ComboBoxEditEventArgs e) {
var InWorkStatusId = "394D4B84-58E6-DF11-971B-001D60E938C6";
var filters = e.Filters;
filters.Add(new Dictionary<string, object> {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {InWorkStatusId}}});
};

Та же самая ошибка вылетает.

Exception Message: The control 'PageContainer_StatusEdit' does not have an AjaxEvent with the name 'InternalPrepareLookupFilter' or the handler is absent

У меня работает нормально. Сообщите больше информации. Может, кроме этого в другом месте ещё какие-то фильтры на это поле есть?

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

А надо на Init.

Каким образом тогда в скрипте Init получить следующее значение:

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue("Id");

На этой строчке скрипт "вылетает". т.к. , насколько я понимаю, данные из DataSource еще не загружены.

Логика внутри делегата выполняется не на открытии, а в момент нажатия на лукап.

Почему тогда происходит ошибка:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в Terrasoft.WebApp.TaskEditPageEventsProcess`1.ChildInitAfterParentScriptExecute(ProcessExecutingContext context)

при получении Id открываемой активности:

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue("Id");

???

И под скриптом Init подразумевался ChildInitBeforeParentScript ???

Функция GetTypedColumnValue — это generic, там надо указать тип в угловых скобках. Вроде:

Guid accountId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("AccountId");

Можно и before, и after.

Угловые скобки вырезал парсер форума, они там есть:

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id");

т.е. ошибка с этим не связана.

Посмотрите в других разделах как устроено наложение фильтров и сделайте по аналогии. Там несложно.

Вот пример:

			Page.ManagerLookupEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
	Collection<Dictionary<string, object>> filters = e.Filters;
	Guid accountId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("AccountId");
	filters.Add(new Dictionary<string, object> { 
       {"comparisonType", FilterComparisonType.Equal}, 
       {"leftExpressionColumnPath", "Account.Id"}, 
       {"useDisplayValue", false}, 
       {"rightExpressionParameterValues", new object[] {accountId}}});
};

Если нужно Id записи, карточка которой открыта, то можно просто:

           {"rightExpressionParameterValues", new object[] {Page.DataSource.ActiveRowPrimaryColumnValue.ToString()}}});

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

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

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id");

Условие должно проверяться внутри делегата.

if(NeedFilters) {
filters.Add(new Dictionary<string, object> {

Применил :

var TaskId = Page.DataSource.ActiveRowPrimaryColumnValue.ToString();

На выходе получил значение TaskId:

00000000-0000-0000-0000-000000000000

Возможно, запись ещё не сохранена.

Я открываю уже существующую запись.

Дело в том, что :

var TaskId = Page.DataSource.ActiveRowPrimaryColumnValue.ToString();

получает Id активности только если его перенести в ScriptAfterBasePageLoadComplete, в скриптах Init всегда нулевые значения.

Проверяйте значение поля внутри делегата.

Все работает. Большое спасибо.

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

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

Хочу с вами посоветоваться так как не могу найти решение следующий проблемы.
Пользователь портала при создание нового запросе через свой личный кабинет на вкладку «Комментарии» добавляет 2 файла. После классификации сотрудник технической поддержки берет данный запрос в работу. Но после этого пользователь портала передумывает и удаляет 1 из файлов на вкладке «Комментарии». Это не где не отслеживается. Не системный администратор и не сотрудник тех. поддержки не могут доказать что, раньше было прикреплено 2 файла вместо 1-го текущего файла.

С уважением,
Гюнель

Нравится

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

Решение простое - установите на объект "Файлы и ссылки чего-то-там" признак "Администрируется по операциям".
Затем для пользователей портала ставите чтение и добавление, на удаление и изменение запрет.

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