Иногда при постановке задачи возникает необходимость добавить к этой задаче еще десяток пользователей системы. Добавление вручную каждого пользователя на закладку "Контакты" занимает значительную часть времени пользователя. Полезным функционалом было бы создание новой кнопки "Добавить группу контактов".
Предлагаю вариант решения:
1. Вам необходимо в грид детали "Контакты" (менеджера деталей раздела "Задачи") добавить новую кнопку. Назвать ее, например, "Добавить группу пользователей" и присвоить Caption "AddUsersGroup".
2. Далее Вам необходимо реализовать две функции, которые потом будут вызываться в обработчике события нажатия на созданную кнопку.
2.1. Одна из функций должна реализовывать появление окна выбора существующих групп пользователей. Необходимая функция будет выглядеть примерно следующим образом:

function AddUsersGroup() {
var Dataset = GetSingleItemByCode('ds_Group', 'ContactInTaskGridArea');
var SearchFieldNames = 'Name';
var DisplayFieldNames = 'Name';
var KeyFieldName = 'ID';
var KeyValue = '';
var SearchFieldName = 'Name';
var SearchValue = '';
var NotifyObject = Self;
var Tag = 'SelectUsersGroupWindow';
var IsReadOnly = true;
ShowSelectDataWindow(Dataset, SearchFieldNames, DisplayFieldNames,
KeyFieldName, KeyValue, SearchFieldName, SearchValue, NotifyObject,
Tag, IsReadOnly);
}

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

function ProcessAddUsersGroup(Sender) {
var GroupID = Sender.Attributes('KeyValue');
if (!GroupID) {
return;
}
var UserSelectQuery = GetSingleItemByCode('sq_User',
'ContactInTaskGridArea');
var ContactInTaskDataset = GetSingleItemByCode('ds_ContactInTask',
'ContactInTaskGridArea');
ApplySelectQueryFilter(UserSelectQuery, 'GroupID', GroupID, true);
var UserDataset = UserSelectQuery.Open();
var TaskID = Self.Attributes('ParentItemID');
while (!UserDataset.IsEOF) {
ContactInTaskDataset.Append();
ContactInTaskDataset.Values('ID') = Connector.GenGUID();
ContactInTaskDataset.Values('TaskID') = TaskID;
ContactInTaskDataset.Values('ContactID') =
UserDataset.Values('UserContactID');
ContactInTaskDataset.Post();
UserDataset.GotoNext();
}
ContactInTaskDataset.Close();
UserDataset.Close();
}

3. Далее нужно в обработчике события OnClick созданной кнопки прописать вызов процедуры AddUsersGroup (вызова окна выбора групп).
function amiAddUsersGroupOnExecute(ActionMenuItem) {
AddUsersGroup();
}

4. Затем в обработчике события OnNotify грида менеджера деталей "Контакты" раздела "Задачи", прописать вызов фукнции ProcessAddUsersInGroup с необходимыми условиями.

function wnd_ContactInTaskGridAreaOnNotify(ScriptableService, Sender, Message,
Data) {
if (Message == MSG_OK) {
if (Sender.Tag == 'SelectUsersGroupWindow') {
ProcessAddUsersGroup(Sender);
}
RefreshDataset(BaseGridArea.GridDataset);
} else {
scr_BaseGridArea.wnd_BaseGridAreaOnNotify(ScriptableService, Sender,
Message, Data);
}
}

В прикрепленном файле высылаю пример текста доработанного сервиса.

Желаю удачи!

С уважением,
Мельникова Екатерина

Нравится

Поделиться

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

У многих пользователей системы Terrasoft CRM в разделе "Задачи" создано множество задач с различными типами. И вопрос зависимости
цвета задачи от ее типа является более нужным и востребованым, чем зависимость цвета задачи от состояния (как это реализовано в стандартной версии). Например, задачи с типом "Звонок" необходимо выделять синим цветом среди сотни задач сегодняшнего расписания, а задачу "Втреча" красным (для того, чтобы она не осталась незамеченной).

Предлагаю заменить функционал зависимости цвета от состояния на зависимость цвета от типа задачи следующим образом:
1. В таблицу tbl_TaskType довавляем поле Color с типом "Целое число".
2. Добавляем поле цвета в сервис sq_TaskType.
3. Добавляем целочисленное поле (IntegerDataField) в датасет ds_TaskType.
4. В карточку редактирования wnd_TaskTypeEdit добавляем контрол ColorBoxDataControl. Устанавливаем необходимые значения свойствам DatasetLink и DataFieldName.
5. Открываем запрос на выборку sq_Task. В этом запросе нужно изменить уже существующее поле StatusColor. А именно, сделать выборку поля Color из таблицы tbl_TaskType.
После сохранения всех внесенных изменений и перезапуска рабочего приложения, при выборе цвета в справочнике "Типы задач", созданные задачи будут подсвечиваться этим цветом.

Желаю удачи!

С уважением,
Мельникова Екатерина

Нравится

Поделиться

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

Отлично! Я первый пользователь данной функциональности!
Ещё бы задачи с приоритетом "Срочно" или "Критично" всегда были наверху, в независимости от сортировки (опцию можно сделать отключаемой)

Вопрос.
Как прикрутить данную функциональность к разделу Контрагенты?
Проделал всё вышеописанное для собственного справочника, как теперь прикрутить цвета к гриду?

Пытаюсь сделать тоже самое для договоров по статусу...
"Подписан. Оплачен.", "Не подписан. Не оплачен."...
Проделал вышеизложенный алгоритм со справочником "Состояние договора" и с sq_Contract, ds_Contract.
Создал в scr_ContractsGridArea для grdData

function GetContractColorByDatasetRecord(Dataset) {
	var TextColor = Dataset.ValAsInt('Color');
	return TextColor;
}
 
// --------------
// Event handlers
// --------------
 
function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font) 
{
TextColor.Value = GetContractColorByDatasetRecord(BaseGridArea.GridDataset);
}

по аналогии с Задачами...
Но всё равно раскраска не происходит...

---
Конфигурация:
TSCRM 3.3.1.36
Firebird 2.0 (v.2.0.3.12981)

Александр, а HasCustomDraw в реестре включили?

уже включил...))
спасибо за подсказку, всё работает)

---
Конфигурация:
TSCRM 3.3.1.36
Firebird 2.0 (v.2.0.3.12981)

Отличная возможность + описание:twisted:
Счета, Документы, Договора - всё расскрасил!:wink:
Вот только при добавлении ColorBoxDataControl'а появляется сообщение "Разрушительный сбой!"...Никаких проблем после не возникало. Надеюсь так и останется просто плохим воспоминанием))

Я, например, в своих проектах стараюсь избегать раскраски реестра - вместо нее использую различные иконки в реестре (в зависимости от типа и состояния).

Ну, раскраска - это не мой креатив, а привычка тех, кто много лет работал еще с 2.8
Да и вообще, как говорят: "на вкус и цвет фломастеров нет":lol:
А вот с ошибкой непонятно:confused:

В родительских/подчиненных документах цветом не выделяется.
Внес нужные изменения в wmd_DocumentInDocumentGridAreaScript,
и не могу подобрать нужное значение в ф-ю GetContractColorByDatasetRecord() в обработчике grdDataOnGetRowDrawInfo.

Для реализации необходимого Вам функционала нужно выполнить следующие действия:
1. Сперва добавить поле Color в каждый из UNION sq_ChildDocument (из таблиц DocumentStatus, ContractStaus и BillStatus). Безусловно, предварительно нужно будет создать целочисленное поле Color в таблице, запросе, датасете и окне справочников "Состояния счета" и "Состояния договора".
2. Добавить целочисленное поле Color в ds_ChildDocument.
3. Добавить поле Color в каждый из UNION sq_ParentDocument.
4. Добавить целочисленное поле Color в ds_ParentDocument.
5. Установить для grdData в wnd_DocumentInDocumentGridArea свойство HasCustomDraw в true.
6. Прописать функцию и обработчик таким образом:

function GetDocumentColorByDatasetRecord(Dataset) {
        var TextColor = DocumentInDocument.Dataset.ValAsInt('Color');
        return TextColor;
}
 
// ----------------------------------------------------------------------------
// Event handlers
// ----------------------------------------------------------------------------
function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font) {
TextColor.Value = GetDocumentColorByDatasetRecord(DocumentInDocument.Dataset);	
}

7. Сохраните внесенные изменения. Перезапустите рабочее приложение Terrasoft CRM и протестируйте работоспособность функционала. В результате при указании документа, договора или счета - они будут подсвечиваться цветами, указанными в справочниках состояний.

Желаю удачи!

Так ведь и делал, только вот в вместо DocumentInDocument.Dataset писал DocumentInDocument.
А, и "Всегда выбирать в запросе":smile:
Спасибо!

"Мельникова Екатерина" написал:

"Швец Александр" написал:

я все проделал как описано - строки грида или текст окрашиваются нормально, но только если я вывожу колонку Color в гриде (в представлении gvMain грида определяю колонки и делаю colStatusColorgvMain видимой и доступной), но если сделать колонку невидимой для каждой строки грида выдается ошибка "Ошибка выполнения метода 'grdDataOnGetRowDrawInfo'. Поле 'Цвет' не активно «Call Stack»" и строки не окрашиваются.

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

Для колонки цвет сделайте "всегда выбирать в запросе" .

поменяйте функцию

function GetDocumentColorByDatasetRecord(Dataset) {
        var TextColor = DocumentInDocument.Dataset.ValAsInt('Color');
        return TextColor;
}

на такой вид

function GetDocumentColorByDatasetRecord(Dataset) {
        var TextColor = GetFieldValueFromDisabledField(Dataset, 'Color');
        return TextColor;
}

Или просто поставьте для поля Color галочку "Всегда выбирать в запросе" в сервисе запроса

Оба варианта ([1]Сделать колонку цвет "всегда выбирать в запросе" и [2]воспользоваться функцией GetFieldValueFromDisabledField()) работают - спасибо

Здравствуйте!
Помогите решить проблемы (Terrasoft 3.3.1.65).
1. Я раскрасил реестр (главные записи дерева), все работает.
Мне нужно забрать раскраску выделенной записи, то есть при изменение фокуса в реестре (при переходе на другую запись), данная запись выделяется стандартным оранжевым цветом. Думаю с рисунков будет понятнее:

2. Есть ли возможность при выборе ячейки (фокус или клик) вывести Caption?

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

Спасибо! Будем ждать! :smile:
Может заодно подправить DataGrid.SelectedColumn (всегда возвращает null)?

"genekogo" написал:Может заодно подправить DataGrid.SelectedColumn (всегда возвращает null)?

Исправить не обещаю -- но посмотрю обязательно.

"Александр Кравчук" написал:Когда-то для реестра я включил прозрачность выделения (альфа = 128). Для дерева пока осталось по старому. Сегодня-завтра обязательно исправлю это недоразумение. Если не будет никаких нюансов -- то отпишусь какую версию бинарных файлов нужно взять.

Поправил в 3.3.1.89 и 3.3.2.26:

"genekogo" написал:Может заодно подправить DataGrid.SelectedColumn (всегда возвращает null)?

Поправил также в 3.3.1.89 и 3.3.2.26.
Вот теперь я усну... :wink:

Саша! Низкий поклон и сладких снов!!!
:twisted:

--
www.it-sfera.com.ua

"genekogo" написал:Есть ли возможность при выборе ячейки (фокус или клик) вывести Caption?

Уточните, пожалуйста, какой Caption Вы имеете ввиду. Объясните, пожалуйста, на конкретном примере, поскольку не совсем очевидно, какой именно функционал Вам нужно реализовать.
Заранее спасибо за помощь.
Ожидаю ответа.

Мельникова Екатерина

Когда текст не вмещается в поле реестра появляется надпись (на рисунке поле «Заголовок»). Например, вместо надписи с текстом «Контроль оплаты счета (t)» я хотел бы отобразить надпись с текстом «Тестовая надпись» (и неважно вмещается текст в поле реестра или нет).
Есть ли возможность при выборе ячейки (фокус или клик) вывести свой Caption?

"genekogo" написал: Например, вместо надписи с текстом «Контроль оплаты счета (t)» я хотел бы отобразить надпись с текстом «Тестовая надпись».

Т.е. Вы хотите изменить хинт ячейки?

Да. :smile:

Никогда ни от кого не слышал такого пожелания. Для чего это может понадобится?

"Александр Кравчук" написал:Никогда ни от кого не слышал такого пожелания. Для чего это может понадобится?

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

"Александр Кудряшов" написал:А вот это я давно хотел увидеть в контролах - скажем подсказка-описание что за страшная информация скрывается в данном поле и каково ее назначение.

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

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

Пример (из данной ветки форума): выводим в реестр информацию о продажах по дням

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

--
www.it-sfera.com.ua

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

+1

--
www.it-sfera.com.ua

Ну что ж, заводите идею.

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

1. В сервисе wnd_ProjectsGridArea в свойстве grdData необходимо найти свойство HasCustomDraw и присвоить ему значение true
2. В сервисе sq_Project для поля TypeID и активировать опцию "Всегда выбирать в запросе"
3. В сервисе wnd_ProjectGridArea найдите grdData и на закладке "Свойства" найдите свойство OnGetRowDrawInfo. Дважды кликните на правой части этого поля. В результате Вы автоматически перейдете в скрипт, в обработчик данного события.
4. В обработчике данного события необходим прописать следующее
function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font) {
// DefineRowDrawInfo(Color, TextColor, ImageName, Font);
var Dataset = dlData.Dataset;
var TypeID = Dataset.Value('TypeID');
switch (TypeID) {
case Type1:
TextColor.Value = clGreen;
break;
case Type2:
TextColor.Value = clRed;
break;
default:
TextColor.Value = clBlack;
break;
}
В данном скрипте вместо Type1, Type2, Type3 необходимо ставить ID типов инцидентов, которые предварительно нужно посмотреть в таблице tbl_ProjectType в используемой Вами СУБД
Что касается цветов, то Вы можете просмотреть перечень всех возможных цветов в сервисе scr_Const

А как раскрасить расписание? Не текст а event. подобие задач не предлагать - не получается

Здравствуйте! Посмотрите реализацию изменения цвета фона задач в расписании, в зависимости от состояния во вложенном файле.

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

Добрый день!

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

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

Нравится

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

Здравствуйте, Павел!

Вы можете реализовать данную функциональность с помощью JOB, который будет выполнять действия или запускать процедуру в конкретные промежутки времени.
Данное решение подходит для версий приложения под MS SQL.
Как альтернативный вариант можете организовать проверку по дате на событие OnPrepare wnd_Main, если проверка возвращает значение, то применять фильтр (ранее созданный), т.е. проверка по дате будет работать каждый раз при запуске системы.

Terrasoft Support Team

Ага, каждый раз при запуске системы у каждого пользователя. А если два человека одновременно в начале месяца зайдут то, вообще весело будет.
JOB хороший вариант, но тогда не отработает логика, которая в скриптах прописана.
Я не уверен, но помоему при запуске tscrm.exe можно указать сервис окна, которое запустится вместо wnd_Main и пользователя\пароль. Если да, то рисуем новый сервис окна, в котором на OnPrepare создаем задачи и в конце закрываем окно. После в планировщик задач прописываем запуск tscrm.exe с правильными параметрами и ждем начала следующего месяца :)

Действительно хороший вариант, спасибо!

Вот пример запуска

TSCRM.exe /wnd=wnd_import /usr=Supervisor /pwd="" /cfg=tscrm

Добрый день!

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

Каким образом лучше организовать цикл перебора?

function wnd_BPOnPrepare(Window) {
var DatasetTask = Services.GetNewItemByUSI('ds_Task');
var DatasetAccount = Services.GetNewItemByUSI('ds_Account');
var AccountTypeID = '{CB403C3E-51C9-4117-8ADF-CEC787AE584C}'; //тип клиента = Клиент
ApplyDatasetFilter(DatasetAccount, 'AccountTypeID', AccountTypeID, true);
//в sq_Account создать фильтр сравнения с параметром AccountTypeID
DatasetAccount.Open();

DatasetTask.Append();

DatasetTask.Values('Title')='Связь'
DatasetTask.Values('PriorityID')= '{F6E5132C-BFC4-48E4-832B-0A60BBF6FC57}';
DatasetTask.Values('TypeID')= '{EE2F344B-BCE6-48A7-8813-20A4964DDE82}';
DatasetTask.Values('OwnerID')= DatasetAccount.Values('OwnerID');
DatasetTask.Values('StatusID')= '{9E289E42-9A0E-4A9C-A57F-049754310D95}';
DatasetTask.Values('AccountID')= DatasetAccount.Values('ID');
//DatasetTask.Values('StartDate')= GetTodayDate();
//DatasetTask.Values('DueDate')= AddDateDays(DateTime, 25)

DatasetTask.Post();
DatasetTask.Close();
DatasetAccount.Close();
}

Попробывал так:

function wnd_BPOnPrepare(Window) {
var DatasetTask = Services.GetNewItemByUSI('ds_Task');
var DatasetAccount = Services.GetNewItemByUSI('ds_Account');
var AccountTypeID = '{CB403C3E-51C9-4117-8ADF-CEC787AE584C}'; //тип клиента = Клиент
ApplyDatasetFilter(DatasetAccount, 'AccountTypeID', AccountTypeID, true);
//в sq_Account создать фильтр сравнения с параметром AccountTypeID
DatasetAccount.Open();

(!DatasetAccount.IsEOF)
DatasetTask.Append();

DatasetTask.Values('Title')='Связь'
DatasetTask.Values('PriorityID')= '{F6E5132C-BFC4-48E4-832B-0A60BBF6FC57}';
DatasetTask.Values('TypeID')= '{EE2F344B-BCE6-48A7-8813-20A4964DDE82}';
DatasetTask.Values('OwnerID')= DatasetAccount.Values('OwnerID');
DatasetTask.Values('StatusID')= '{9E289E42-9A0E-4A9C-A57F-049754310D95}';
DatasetTask.Values('AccountID')= DatasetAccount.Values('ID');
//DatasetTask.Values('StartDate')= GetTodayDate();
//DatasetTask.Values('DueDate')= AddDateDays(DateTime, 25)

DatasetTask.Post();
DatasetAccount.GotoNext();
}

DatasetTask.Close();
DatasetAccount.Close();
}

но создается 1242 задачи вместо 2-х

Я бы это сделал вот так

var AccountTypeID = '{CB403C3E-51C9-4117-8ADF-CEC787AE584C}';
var stNone = 0;
 
var AccountsDataset =  GetDetailSummary(
	'tbl_Account', 'AccountTypeID', AccountTypeID, 'ID', stNone);
var DatasetTask = Services.GetNewItemByUSI('ds_Task');
try {
	AccountsDataset.GoToFirst();
	while (!AccountsDataset.IsEOF) {
		DatasetTask.Append();
		DatasetTask.Values('Title')='Связь'
		DatasetTask.Values('PriorityID')= '{F6E5132C-BFC4-48E4-832B-0A60BBF6FC57}';
		DatasetTask.Values('TypeID')= '{EE2F344B-BCE6-48A7-8813-20A4964DDE82}';
		DatasetTask.Values('OwnerID')= DatasetAccount.Values('OwnerID');
		DatasetTask.Values('StatusID')= '{9E289E42-9A0E-4A9C-A57F-049754310D95}';
		DatasetTask.Values('AccountID')= DatasetAccount.Values('ID');
		//DatasetTask.Values('StartDate')= GetTodayDate();
		//DatasetTask.Values('DueDate')= AddDateDays(DateTime, 25)
		DatasetTask.Post();
		AccountsDataset.GotoNext();
	}
} finally {
	AccountsDataset.Close();
	DatasetTask.Close();
 
}

Вопрос снят, все получилось!

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

С некоторого времени у пользователей, не являющихся администраторами, не отправляются сообщения о назначении задачи исполнителям. Выдается сообщение "Сообщение не отправлено. Неверный шаблон или адрес". В отладчике нашел, что почему-то "AddressesList" пустой (AddressesList.Count = 0) . Под администратором все работает.
Где искать ошибку?

Нравится

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

Добрый день, Станислав!

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

Права на шаблон "Напоминание о задаче" у всех пользователей на чтение. Такие же права на внутренние контакты.

Пожалуйста, укажите название и номер версии продукта, тип СУБД, версию ОС и MSOffice. Попытаюсь воспроизвести.
Если ничего не помогает, рекомендую обращение в службу поддержки.

Terrasoft Sales 3.1.0.16 на SQL2000. Ошибка воспроизводится на Windows XP и 2003. Office 2003. В Outlook отключена надстройка Terrasoft CRM Add-Inn. У пользователя отключена привязка и автопривязка в отправке и приемке (сейчас доступ к модулю E-mail у пользователей отключен).

Здравствуйте, Станислав!

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

Хочу заметить, что список адресов формируется при выполнении функции [GetMailAddressesByContactID] скрипта [scr_MailUtils].
Вполне возможно, что не выбирается электронный адрес выбранного контакта в [sq_ContactMails], который используется в этой функции.
Рекомендуется запустить утилиту [Profiler] (размещение по умолчанию "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\profiler.exe") и посмотреть какой именно запрос выполняется.
Важно, чтобы фильтр [CommunicationTypeID] в этом запросе был включён и в качестве значения был указан ID типа средства связи - E-mail. Разумеется, и [ContactID] также должен соответствовать контакту, которому отправляется сообщение.

Terrasoft Support Team

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