Публикация

Дополнение предназначено для повышения эффективности и оптимизации процессов управления проектами. Модуль можно внедрять в:

  • Проектную и сервисную деятельность;
  • Планирование и обучение;
  • R&D и девелопмент;
  • Разработку ПО и исследования;
  • Управление мероприятиями;

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

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

Видеообзор продукта по ссылке

Попробовать можно по ссылке

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Задача:
Реализовать корректную печать для раздела проекты для выделенного в реестре проекта
Подробнее о проблеме описано тут
Для построения выборки нам потребуется рекурсивный запрос, с помощью базовых компонентов SQ Terrasoft'a у меня такой придумать не получилось так как синтаксис CTE начинается со слова with. Решение - создать ADO Dataset, где можно написать любой запрос
1. Создаем ADO Dataset, пишем Connection string, задаем сам запрос :

WITH MyProject
AS
(
SELECT tbl_Project.*, 0 AS Level
 FROM tbl_Project
WHERE ID = :ID
UNION ALL
SELECT p.*, Level+1
 FROM tbl_Project p
INNER JOIN MyProject AS mp
        ON p.ParentID = mp.id
)
SELECT
                MyProject.ID,
                MyProject.ParentID,
                MyProject.Name,
                MyProject.EstimatedStartDate,          
                MyProject.EstimatedDueDate,            
                ContactOwner.Name AS OwnerName,
                ProjectState.Name AS StateName,
        Level
                FROM
                MyProject,
                tbl_Contact AS ContactOwner,
                tbl_ProjectState AS ProjectState
WHERE MyProject.OwnerID = ContactOwner.ID
AND ProjectState.ID = MyProject.StateID
ORDER BY MyProject.SortOrder

Колонки которые вынесены в последнем запросе нужно создать руками, также необходимо создать параметр ID с типом уникального идентификатора
Настройки Dataset'a следующие
1

2. Кнопка в реестре раздела [Проекты], передача параметра ID записи в отчет:

function btnPrintProjectOnClick(Control) {
                var SelectedIDs = GetProjectSelectedIDsArray();
                var Dataset = Services.GetNewItemByUSI('adods_PrintProject');
                var Report = Services.GetNewItemByUSI('fr_PrintProject');
                        if (!IsEmptyValue(SelectedIDs[0]))
                        {
                        SetAttribute(Report,'ProjectIDtoPrint',SelectedIDs[0]);
                ShowReport(Report);
                }
                else
                        MessageBox('Не выбран ни один проект');
}

ShowReport c скрипта scr_ReportUtils

3. Сама печатная форма
Получение параметров

function fr_PrintProjectOnPreview(ReportPreviewer) {
 var DatasetNameStr = "adods_PrintProject"; //датасет в котором мы хотим делать фильтрацию (необходимо помнить о том, что у отчета может быть несколько датасетов)
 var str = ReportPreviewer.DatasetUSIList.CommaText; //в строчке ReportPreviewer.DatasetUSIList.CommaText передаются USI датасетов, через запятую
 var ReportDatasetUSI =  str.substr(str.indexOf(DatasetNameStr), DatasetNameStr.length);
 var Dataset = ReportPreviewer.DatasetByUSI(ReportDatasetUSI);
 
                var ProjectIDtoPrint = GetAttribute(ReportPreviewer.Report,'ProjectIDtoPrint');
                Dataset.Parameters.ItemsByName('ID').Value = ProjectIDtoPrint;                                
}

К параметру ID в ADO Dataset получаем доступ так:

                Dataset.Parameters.ItemsByName('ID').Value = ...;

3. Сам отчет

var
 oldCurXBand: Extended;    
 oldBandWidth: Extended;    

procedure ProjectNameOnBeforePrint(Sender: TfrxComponent);
begin
 oldCurXBand := ProjectName.Left;
 oldBandWidth := ProjectName.Width;                      
ProjectName.Left := ProjectName.Left + 20 * Project.Value('Level');                                            
ProjectName.Width := ProjectName.Width - 20 * Project.Value('Level');                                            
end;

procedure ProjectNameOnAfterPrint(Sender: TfrxComponent);
begin
ProjectName.Left := oldCurXBand;
ProjectName.Width := oldBandWidth;                  
end;

begin

end.

Идея отступа взята с FastReport. Отчёты с деревьями, все остальное в статье у меня не заработало, даже на тестовых таблицах с совпадающими типами + в статье есть ошибки. Реализовано лучше с Документации по методам FR берем
Left (Integer) - Координата Х левого верхнего угла объекта.
Width (Integer) - Ширина объекта.
Отступаем по x нужную длину и кушаем это число с ширины бэнда. Выходит более красивее чем прыгающий бэнд.
Результат :
2

p.s Пожелания по улучшению:
1.Использовать текущие данные подключения для получения данных с ADO Dataset

Поделиться

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

Отличная инструкция :smile: +1 лайк!

Спасибо!

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

Доброго времени суток!
Задача:
Корректно распечатать грид в разделе [Проекты], при нажатии печати грида по умолчанию выгружается записи без какой либо привязки к степени вложенности, т.е по сути печатается обычный грид а не древовидный.
2

1
Я вижу реализацию как отдельную кнопку "Печать" в wnd_ProjectGridArea которая бы по SelectedIDs (выбранным записям в реестре) выводила бы на печать отдельную печатную форму (FR) в которой мы бы по умному учитывали степени вложенности.
Возможно кто-то уже шел по этому пути ознакомившись например со статьей FastReport. Отчёты с деревьями и готов поделиться результатами?

Бинарные файлы Terrasoft 3.3.2.277
Конфигурация XRM 3.3.2.157

У меня такой же вопрос

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

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

Можно попробовать реализовывал похожий функционал (до 4-х уровней вложенности) следующим образом:

1

Решение описано тут

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

Добрый день,
Просьба поделиться опытом/наработками/идеями, как сделать следующую вещь:
Есть раздел проекты, в самой карточке проекта (сам раздел пока не отличается от коробочного) есть поле Ответственный по проекту (стадии или работе), и Исполнитель проекта/стадии/работы. Задача в том что бы отсылать почтовые (!) уведомления Отечественному и Исполнителю за день до истечения плановой даты завершения проекта. Решено было уходить от задач, что бы упростить процесс.
При этом исполнители могут быть не пользователи системы Террасофт, а просто контакты с заполненными e-mail'ами.
Первые мысли это ковырять таймер с wnd_Main, и крутить по аналогии с напоминаниями. Возможно кто-то уже проходил этот путь?

У меня такой же вопрос

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

Версия 3.3.2, так что JobManager'а тут нет

Получилась примерно такая тема.
Запрос sq_ProjectToSendMail формирует список по которым необходимо отослать уведомления

SELECT 
	[tbl_Project].[ID] AS [ID],
	[tbl_Project].[OwnerID] AS [OwnerID],
	[tbl_ProjectManHour].[ContactID] AS [ExecutorContactID],
	[tbl_ProjectManHour].[AccountID] AS [ExecutorAccountID],
	[tbl_Project].[EstimatedStartDate] AS [EstimatedStartDate],
	[tbl_Project].[EstimatedDueDate] AS [EstimatedDueDate]
FROM
	[dbo].[tbl_Project] AS [tbl_Project]
LEFT OUTER JOIN
	[dbo].[tbl_ProjectManHour] AS [tbl_ProjectManHour] ON [tbl_ProjectManHour].[ID] = [tbl_Project].[ExecutorManHourID]
WHERE(datediff(dd,EstimatedStartDate,EstimatedDueDate) = :DaysToRemind AND
	NOT [tbl_Project].[StateID] IN (:StageCompletedID, :WorkCompletedID, :ProjectCompletedID))

Далее формируем письма по шаблону

	var Dataset = Services.GetNewItemByUSI('ds_ProjectToSendMail');
	Dataset.Open();
	 while (!Dataset.IsEOF) 
	 {
 
	var ProjectID = Dataset('ID');
	var MailParams = new Object();
	MailParams.AutoSend = true;
	MailParams.RecordID = ProjectID;
	MailParams.Silent = true;  
 
	var OwnerContactID = Dataset('OwnerID');
	var ExecutorContactID = Dataset('ExecutorContactID');
	MailParams.Address = GetMailAddressesByContactID(ExecutorContactID);
	MailParams.CopyAddress = GetMailAddressesByContactID(OwnerContactID);
 
	var TamplateID = '{...}'; //Напоминания исполнителю и ответственному по проекту
 
	SendEmailByTemplate(TamplateID,MailParams);
 
	Dataset.GotoNext();
	}
 
 
Dataset.Close();

Тут возникают вопросы:
1. В данной реализации письма в тихую будут отправляться с активного акаунта Outlook. В компании стоит Exchange Server, и завести технический ящик internal.crm@mydomain.com не проблема, как сделать так что бы письма отправлялись с технического ящика, и при этом привязывались к записи в разделе проекты (сейчас они привязываются к проекту/стадии/работе).
2. Как сделать так что бы данный скрипт выполнялся какой либо службой, без участия пользователя. Я к тому что возможно ли реализовать или портировать что-то типа JobManager'a в 3.3.2

Просьба подсказать как данные уведомления реализованы у Вас в компании Terrasoft? На сколько я понимаю реализована либо служба которая запускается по намеченному времени и запускает кусок скрипта.
Либо же второй вариант: на каком то из серверов настроена техническая почтовая учетка на Outlook, постоянно запущен Terrasoft и Outlook, далее по таймеру реализована отсылка почтовых уведомлений по шаблону.

При желании JobManager можно попробовать портировать и на 3.3.2.
Если скрипт на стороне SQL, то можно настроить встроенный планировщик БД.
Да, MSSQL и Oracle тожем можно научить отправлять почту.

"Зверев Александр" написал:Да, MSSQL и Oracle тожем можно научить отправлять почту.

SQL Server конечно умеет отправлять почты, но тут возникает вопрос на сколько сложно будет сделать такой шаблон как в TS и корректно туда проставить все данные, в дополнение в текущей задаче мне необходимо в письмо еще и вставлять исполнителей (деталь Команда) с клиента все это корректно отсылается по кнопочке "Отослать уведомление", а вот сделать настолько же красиво в SQL Server - большой вопрос.

Просьба ответить на мой предыдущий пост

"АльфаКрыса" написал:Просьба подсказать как данные уведомления реализованы у Вас в компании Terrasoft? На сколько я понимаю реализована либо служба которая запускается по намеченному времени и запускает кусок скрипта.
Либо же второй вариант: на каком то из серверов настроена техническая почтовая учетка на Outlook, постоянно запущен Terrasoft и Outlook, далее по таймеру реализована отсылка почтовых уведомлений по шаблону.

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

В MS SQL можно отправлять почту на триггере. В таком случае, будет доступна запись к примеру INSERTED, со всеми полями: INSERTED.OwnerID, а значит запросом можно вытащить любые доп. поля с деталей.

По поводу Вашего вопроса:
второй вариант (с постоянно запущенным Террасофтом) мне не особо нравится, но как вариант конечно годится.
Я бы порекомендовал написать консольное приложение на C#, с тем самым "куском" скрипта, который производит отправку уведомлений. Далее создать BAT-ничек, и в нем реализовать запуск этой программы по таймеру (каждый 30 мин, 60 мин и т.д.).

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

Добрый вечер!
У меня 2 вопроса по системе Terrasoft XRM:
1) можно ли/планируется ли добавить к глобальному поиску следующий функционал:
- возможность поиска по полю "описание" для Контактов
(здесь я присоединяюсь к аналогичному вопросу, который уже задавали на форуме:
http://www.community.terrasoft.ua/forum/topic/6786)
- вывести строку глобального поиска постоянно на главный экран (с тем, чтобы не вызывать эту функцию из меню, а просто набрать в строку данные и нажать Ввод - подобно аналогичной функции в Outlook). Как вариант - назначить на эту функцию комбинацию "быстрых клавиш".
Дело в том, что сейчас информация о контактах хранится в адресной книжке Exchange, и довольно много информации, часто более 255 символов в длину, находится в поле Notes (которое при импорте в Terrasoft попадает в Описание). Соответственно, функция глобального поиска у нас одна из самых востребованных и в TS часто будет производиться поиск данных именно из поля Описание.
2) можно ли каким-то образом вести в системе график отпусков сотрудников нашей организации и его корреляцию со списком задач/проектов (чтобы, например, не отпустить ключевого сотрудника в отпуск во время планируемого важного проекта)?

У меня такой же вопрос

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

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

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

1. Открыть wnd_BaseGridArea.
2. Перейти на вкладку "события".
3. Создать событие OnKeyDown и сохранить изменения.

1

4. В открывшемся окне в созданную функцию добавить следующий код:

	if (Key.Value == 71)
	{
	var Window = GetSingleItemByCode('wnd_GlobalSearchResults', 'MainWindow');
	Window.Prepare();
	Window.Show();
	}

5. Сохранить изменения.

После нажатия на клавишу "G" будет открываться окно глобального поиска.

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

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

Добрый день!
Что-то никак не могу понять, по какому принципу работает сортировка проектов. По какому бы столбцу не пытался отсортировать, что-то меняется, но сортировкой назвать это сложно. Это какая-то общая проблема или это в нашей конфигурации что-то не так? И в каком направлении причины искать?

У меня такой же вопрос

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

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

TreeGrid

Данный функционал может быть изменен в конфигурации.

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

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

Итак моя первая запись!
Недавно обнаружился маленький бажок при попытке вводить финансовые операции для проекта итоговая сумма рассчитывалась неправильно: не пересчитывалась сумма введённая в отличной от базовой валюте.

Решение было любезно предоставленно службой поддержки. Цитирую:
1) В запросе sq_GetProjectCashflow заменить выбор колонки Amount на BasicAmount:
2) Отредактировать следующим образом функцию CalculateProjectCashflow скрипта

(Amoun переделать в BasicAmount)

function CalculateProjectCashflow(ProjectID, CashflowType, IsEstimated) {
         var Cashflow;
         var Dataset = GetSingleItemByCode('ds_GetProjectCashflow', 'CalculateProjectCashflow');
         var Parameters = Dataset.SelectQuery.Parameters;
         ApplyDatasetFilter(Dataset, 'ProjectID', ProjectID, true);        
         Parameters.ItemsByName('CashflowType').Value = CashflowType;
         if (IsEstimated) {
                   Parameters.ItemsByName('StatusID').Value = CashflowStatusBudget;
         } else {
                   Parameters.ItemsByName('StatusID').Value = CashflowStatusCompleted;
         }
         Dataset.Open();
         try {
                     Cashflow = Dataset.ValAsFloat('BasicAmount');
         } finally {
                   Dataset.Close();
                   ApplyDatasetFilter(Dataset, 'ProjectID', null, false);      
         }
         return Cashflow;
}

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Часто бывает, что Заказчик не готов к процессному подходу и соответственно внедрение и автоматизация бизнес-процессов в компании может быть не только бесполезной задачей, но и нанести существенный урон организации. Причин неготовности может быть огромное множество:
- Процессная незрелость компании;
- Творческий подход при реализации задач. Ситуация, когда сотрудник оперирует только дедлайном и показателями эффективности и руководство не интересует, что и когда он будет делать для этого;
- Ориентация на работу с ключевыми клиентами, которую тяжело регламентировать;
- и многие другие особенности отрасли или конкретного предприятия.

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

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

Внешне это выглядит так:
Рабочее окно менеджера по продажам:

https://picasaweb.google.com/andy.dovgan/TqRqyG?authkey=Gv1sRgCIe0-LeF_p...

Рабочее окно специалиста маркетинга:

https://picasaweb.google.com/andy.dovgan/TqRqyG?authkey=Gv1sRgCIe0-LeF_p...

Общий пул документов по продаже:

https://picasaweb.google.com/andy.dovgan/TqRqyG?authkey=Gv1sRgCIe0-LeF_p...

Координация осуществляется посредством уведомлений:

https://picasaweb.google.com/andy.dovgan/TqRqyG?authkey=Gv1sRgCIe0-LeF_p...

Все документы дублируются в деталь "Файлы".

Большое спасибо Наде Арсентьевой за постановку задачи и Олегу Лабьяку за качественную настройку.

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать

Коллеги, приветствую!
Вопрос навеян очередным запросом от клиента. Может, кто-то поделится простым и элегантным решением.
Если у компании есть типовые проекты, состоящие, например, из 3 стадий, необходимо по бизнес-процессу создавать не только проекты но и стадии к этому проекту, новому или же существующему, или же по ходу процесса открывать карточки существующих стадий. Отдельных таблиц со стадиями в Terrasoft нет, соответственно непонятно каким ключевым(ми) ID стадии(ий) мы будем оперировать.

Кто сталкивался с такой задачей, подскажите, как проще всего это реализовать.

У меня такой же вопрос

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

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

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

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

Как можно отключить добавление детали, если это не проект?
То есть, чтобы данная деталь добавлялась только для проектов.

У меня такой же вопрос

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

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

Суть я понял. А конкретно на какое событие?
На onSelection DataGrid wnd_ProjectGridArea?
А из этого окна есть доступ к свойствам закладок деталей?

в разделе на событие dlProjectOnDatasetAfterPositionChange

Есть, например, pgXDetail.IsVisible = (TypeID == ProjectTypeID).

Спасибо разобрался.

Войдите или зарегистрируйтесь, чтобы комментировать