Технические вопросы
7.x

В одной из перегрузок конструктора для объекта EntitySchemaQuery, содержащей два параметра, второй параметр имеет тип string и название SourceSchemaName. Объясните, пожалуйста, подробно - что, в данном случае, обозначает понятие "корневая схема"? Ведь это её имя передаётся в SourceSchemaName. Что она из себя представляет и зачем нужна?

Нравится

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

Корневая схема – это схема (таблица в базе данных), относительно которой строятся пути ко всем колонкам в запросе, в том числе к колонкам присоединяемых таблиц.

Более подробно можете почитать здесь:
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/UsingEntitySchemaQuery.html

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

Здравствуйте.
Я не так давно работаю в BPMonline. Хочу узнать поподробнее - что делает и зачем нужно свойство EntityShemaManager из класса EntitySchemaQuery?

Нравится

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

Евгений, про EntityShemaManager Вы можете ознакомиться по следующей ссылке:

http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/Terrasoft…

Информацию про классы и про разработку в целом детально описано на SDK.

Показать все комментарии
SIP
webitel
Технические вопросы
7.x

Добрый день!

Помогите разобраться вот с таким вопросом. bpm'online ondemand предоставляется клиентам с уже настроенной интеграцией с webitel. Означает ил это, я могу завести в облако свои sip аккаунты для приема звонков и совершения исходящих вызовов? Если да, то где это настраивать? Тут же, в отличии от onsite нет доступа к админке webitel. Или, что-то докупать нужно?

Нравится

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

bpm'online ondemand предоставляется клиентам с лицензией WebitelCollaboration и подключенной интеграцией к бесплатному серверу телефонии.
Данная лицензия предполагает использование функционала Webitel только для внутренних звонков или видео-звонков между сотрудниками, использующими bpm'online ondemand.

Это означает что нет возможности подключать свои Sip-каналы.
Для использования функционала приема и выполнения внешних звонков через Sip Вам необходимо:
- Приобрести IP-ATC Webitel (также доступно в ondemand-решении)
- Приобрести лицензии BPMonline Webitel Call Manager

Понял. Спасибо.

Показать все комментарии
7.5
детали средства связи
Лид
Технические вопросы
7.x

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

Нравится

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

1. Создать объект с названием LeadCommunication, указать в качестве родительского объекта "Базовое средство связи"

Добавить в объект колоку Lead, опубликовать.

2. Добавить схему представления детали с полями с названием LeadCommunicationDetail, в качестве родительского объекта указать "Базовая схема детали средств связи"
Исходный код детали:

define("LeadCommunicationDetail", ["LeadCommunicationDetailResources", "terrasoft", "Lead",
        "ConfigurationEnums", "ConfigurationConstants"], function(resources, Terrasoft, Lead, ConfigurationEnums,
        ConfigurationConstants) {
    return {
 
        /**
         * Имя сущности
         */
        entitySchemaName: "LeadCommunication",
 
        methods: {
 
        }
    };
});

Сохранить деталь.

3. Добавить замещающий объект CommunicationType, в качестве родителя указать "Тип средства связи"
Добавить колонку с типом "Логическое", названием "UseforLeads" и заголовком "Использовать для лидов".
Опубликовать объект.

4. Зарегистрировать деталь, выполнив следующий sql скрипт:

declare @DetailSchemaUid uniqueidentifier = (select Uid from SysSchema where Name = 'LeadCommunicationDetail')
declare @EntitySchemaUid uniqueidentifier = (select Uid from SysSchema where Name = 'LeadCommunication')
insert into SysDetail(Caption, DetailSchemaUId, EntitySchemaUId)
values('Средства связи Лида', @DetailSchemaUid, @EntitySchemaUid)

5. Через местер раздела на странице Лид добавить деталь "Средства связи Лида"

Спасибо, деталь добавить получилось.
Как мне теперь отобразить на ней поля Лида с телефонами?

"Сафонов Олег" написал:

Как мне теперь отобразить на ней поля Лида с телефонами?

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

Вам необходимо настроить колонки для отображения.

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

Показать все комментарии
тип
функциональная роль
Технические вопросы
7.x

Добрый день!

Имеется несколько типов контрагентов, для каждого из которых создана страница со своей логикой.
Естественно, что не все пользователи имеют право создавать Поставщиков, Агентов и уж тем более Нашу компанию.
Скорее всего, необходимо создать функциональные роли: Agent manager, Vendor manager и т.п.

Но как в зависимости от функциональных ролей скрывать или показывать пункты меню Add?
Add Account

Нравится

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

В данной ситуации вижу 2 выхода:
1. Попробовать назначить права на объект "Тип контрагента". Как вариант ESQ не будет возвращать тип КА без разрешения на него и он не будет отображаться в кнопке.
2. Изменить логику в странице реестра контрагентов. Проверять к какой роли относится текущий пользователь и добавлять доступные для роли типы КА.

"Царьков Сергей Вячеславович" написал:1. Попробовать назначить права на объект "Тип контрагента". Как вариант ESQ не будет возвращать тип КА без разрешения на него и он не будет отображаться в кнопке.
2. Изменить логику в странице реестра контрагентов. Проверять к какой роли относится текущий пользователь и добавлять доступные для роли типы КА.

1-й вариант не подойдёт, так как пользователь должен видеть другие типы, но не создавать их.

А в какой схеме прописывается эта логика реестра контрагентов?

Изменить логику в странице реестра контрагентов. Проверять к какой роли относится текущий пользователь и добавлять доступные для роли типы КА.

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

Логику, скорее всего, менять на странице AccountSectionV2, но надо смотреть.

"Владимир Соколов" написал:

А в какой схеме прописывается эта логика реестра контрагентов?


Логика действительно меняется на странице AccountSectionV2. Но копнуть нужно глубже - на странице BaseSectionV2 в diff есть объявление кнопки

{
"operation": "insert",
"name": "SeparateModeAddRecordButton",
"parentName": "SeparateModeActionButtonsLeftContainer",
"propertyName": "items",
"values": {
	"itemType": Terrasoft.ViewItemType.BUTTON,
	"style": Terrasoft.controls.ButtonEnums.style.GREEN,
	"caption": {"bindTo": "AddRecordButtonCaption"},
	"click": {"bindTo": "addRecord"},
	"classes": {
		"textClass": ["actions-button-margin-right"],
		"wrapperClass": ["actions-button-margin-right"]
	},
	"controlConfig": {
		"menu": {
	        	"items": {
				"bindTo": "EditPages",
				"bindConfig": {
					"converter": function(editPages) {
					if (editPages.getCount() > 1) {
					return editPages;
					} else {
					return null;
					}
				}
			}
		}
	}
}
}
},

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

Показать все комментарии
Технические вопросы
7.x

Создал представление раздела, с гридой и группой полей.

            {
                "operation": "insert",
                "name": "BDDSGridDataView",
                "parentName": "DataViewsContainer",
                "propertyName": "items",
                "values": {
                    "itemType": Terrasoft.ViewItemType.SECTION_VIEW,
                    "items": []
                }
            },
            {
                "operation": "insert",
                "name": "BDDSGridSectionContainer",
                "parentName": "BDDSGridDataView",
                "propertyName": "items",
                "values": {
                    "id": "BDDSGridSectionContainer",
                    "itemType": Terrasoft.ViewItemType.CONTAINER,
                    "items": []
                },
                index:1
            },
            {
                "operation": "insert",
                "parentName": "BDDSGridDataView",
                "propertyName": "items",
                "name": "BDDSInfoBlock",
                "values": {
                    "itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
                    "items": []
                },
                index:0
            },

необходимо в это представление добавить деталь. Стандартными средствами не удается сделать. Видимо Section не знает, что такое детали. Подскажите как справиться с задачей.

Нравится

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

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

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

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

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

версия продукта 7.6. Дело в том, что так как это представление раздела - мне необходимо прикрепить деталь непосредственно в Section моего раздела в контейнер моего представления, а не на страницу редактирования объекта раздела. По факту я работаю с наследником BaseSection, а не BasePage. А в BaseSection видимо не описана логика присоединения детали.

Эммм... У раздела есть две схемы [Name]Page и [Name]Section. [Name]Section - это и есть страница редактирования раздела. Вы можете открыть созданный Вами раздел через мастер раздела?

Да, открыл

Вы, видимо, не поняли суть проблемы. Я создал представление раздела на основе PivotGrid из раздела планировая (Forecast). Сформировал сводную таблицу(на основании вьюхи в базе данных). И накидал виртуальных полей в контейнер на <имя раздела>Section. Теперь мне необходима деталь, которая бы завязывалась на виртуальное поле данного представления. Предоставляю код SECTION:

 {
                "operation": "insert",
                "name": "BDDSGridDataView",
                "parentName": "DataViewsContainer",
                "propertyName": "items",
                "values": {
                    "itemType": Terrasoft.ViewItemType.SECTION_VIEW,
                    "items": []
                }
            },
            {
                "operation": "insert",
                "name": "BDDSGridSectionContainer",
                "parentName": "BDDSGridDataView",
                "propertyName": "items",
                "values": {
                    "id": "BDDSGridSectionContainer",
                    "itemType": Terrasoft.ViewItemType.CONTAINER,
                    "items": []
                },
                index:1
            },
            {
                "operation": "insert",
                "parentName": "BDDSGridDataView",
                "propertyName": "items",
                "name": "BDDSInfoBlock",
                "values": {
                    "itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
                    "items": []
                },
                index:0
            },
 
            ///// BDDS GRID LAYOUT FIELDS
 
            {
                "operation": "insert",
                "parentName": "BDDSInfoBlock",
                "propertyName": "items",
                "name": "DateFrom",
                "values": {
                    "caption":"Период с",
                    "layout": {
                        "column": 0,
                        "row": 0,
                        "colSpan": 8
                    }
                }
            },
            {
                "operation": "insert",
                "parentName": "BDDSInfoBlock",
                "propertyName": "items",
                "name": "DateTo",
                "values": {
                    "caption":"по ",
                    "layout": {
                        "column": 8,
                        "row": 0,
                        "colSpan": 8
                    }
                }
            },
 
            {
                "operation": "insert",
                "name": "PreviousWeek",
                "parentName": "BDDSInfoBlock",
                "propertyName": "items",
                "index": 0,
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": "Previous",
                    "click": {"bindTo": "getPrevWeek"},
                    "enabled": true,
                    "layout": {
                        "column": 17,
                        "row": 0,
                        "colSpan": 2
                    }
                }
            },
            {
                "operation": "insert",
                "name": "CurrentWeek",
                "parentName": "BDDSInfoBlock",
                "propertyName": "items",
                "index": 0,
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": "Current",
                    "click": {"bindTo": "getThisWeek"},
                    "enabled": true,
                    "layout": {
                        "column": 19,
                        "row": 0,
                        "colSpan": 2
                    }
                }
            },
            {
                "operation": "insert",
                "name": "NextWeek",
                "parentName": "BDDSInfoBlock",
                "propertyName": "items",
                "index": 0,
                "values": {
                    //"imageConfig": {"bindTo": "Resources.Images.ThisWeek"},
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": "Next",
                    "click": {"bindTo": "getNextWeek"},
                    "enabled": true,
                    "layout": {
                        "column": 21,
                        "row": 0,
                        "colSpan": 2
                    }
                }
            },

Далее в этот же VIEW CONTAINER хотелось бы прикрепить деталь. Напоминаю, это не страница редактирования раздела.

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

Прошу прощения - мой вариант не подходит..

Попытался на Section грубо создать деталь

entitySchemaName: 'SxBDDS'

        details: /**SCHEMA_DETAILS*/{
            "SxDemand": {
                schemaName: "SxDemandDetail",
                entitySchemaName: "SxDemand",
                filter: {
                    masterColumn: "Id",
                    detailColumn: "SxBDDS"
                }
            }
        }/**SCHEMA_DETAILS*/,

Далее в дифах

            {
                "operation": "insert",
                "parentName": "BDDSGridDataView",
                "propertyName": "items",
                "name": "SxDemand",
                "values": {
                    "itemType": Terrasoft.ViewItemType.DETAIL
                }
            },

В результате получаю ошибку : cannot use method apply of undefined.
Метод аpply при поимке исключения применяется к методу модели. Метод в данном случае undefined. Вероятно это связано с тем что логика деталей у BaseSection не описана. Было бы здорово если бы был миксин с свойствами и методами(и месседжами) BasePage которые касаются деталей. Либо мне необходимо вручную добавить на <мой>Section эти методы. Хочу узнать возможно ли это вообще, либо стоит искать другое решение.

Добрый день, Дмитрий.

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

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

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

Спасибо за совет. Попробую.

Показать все комментарии
7.5
пакет
Технические вопросы
7.x

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

Нравится

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#? 

Показать все комментарии
поле категория обращения
Технические вопросы
7.x

Добрый день!
в 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

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

Показать все комментарии
деталь файлы
миграция
Технические вопросы
7.x

Добрый день!

Сталкивался ли кто-нибудь в миграции данных с 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 контакта в раздел

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