Доброго времени суток, коллеги!

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

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

         var StartDate = Dataset.ValAsDateTime('StartDate');
         var DueDate = Dataset.ValAsDateTime('DueDate');
         var OwnerIDDataField = Dataset.DataFields.ItemsByName('OwnerID');  
         while(GetIsTaskCoverExists(Dataset, OwnerIDDataField.Value, StartDate,
         DueDate))
         {
              var StartDate = new Date(Dataset.ValAsDateTime('StartDate'));
              var DueDate = new Date(Dataset.ValAsDateTime('DueDate'));            
              StartDate.setHours(StartDate.getHours() + 1);
              DueDate.setHours(DueDate.getHours() + 1);
              StartDate = StartDate.getVarDate();
              DueDate = DueDate.getVarDate();
              Dataset.Values('StartDate') = StartDate;
              Dataset.Values('DueDate') = DueDate;
         }

В итоге получим примерно следующее содержимое функции обработчика события:

1

Нравится

Поделиться

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

Если есть короткое "окно", в которое всё же влезет новая задача, алгоритм может его перешагнуть и не заметить?

Да, такое возможно. Для коротких задач можно сдвигать время не на час, а к примеру, на 10 минут вперед.

Коллеги, мною данная задача была реализована запросом SQL который пригоден для использования даже в триггере.
Кроме выше описанного, он (запрос) умеет находить наименьшее окно под которое подходит задача. И все это добро может быть легко «прикручено» к расписанию каждого сотрудника в календаре (если не ошибаюсь - это уже тоже реализовано).

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

Подскажите как доработать приведенный ниже пример, из темы https://community.terrasoft.ua/forum/topic/3864:

Например, чтобы задачу по БП мог выполнить ответсвенный, можете добавить следующую проверку (на кнопку ОК):
if (WorkflowItemID != null)
     {
     if (Connector.CurrentUser.ContactID != OwnerID)
          {
                ShowInformationDialog('Вы не можете изменить состояние задачи!');
          return;
    }
     }

Пример заработал с небольшими изменениями, но необходимо что б проверка ответственного происходила только в том случае, если были внесены изменения хотя бы в одно поле карточки "Задача"?

Нравится

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

Можно сделать поле объекта TaskEdit, на OnPrepare в него записывать false, а на DataChange - true. А при сохранении карточки проверять это поле. Если false - ничего не менялось, проверку не делаем.

Благодарю Александр!
Ваш совет опробовал, все работает. Но хотелось бы все таки другого результата:
В данной ситуации получается, если пользователь сделал изменения (н/п: пользователь не заметил что не он ответственный) и вернул все обратно, то система не дает сохранить задачу, т.к. произведены изменения и системе все равно что по факту изменений в данных не произошло.
Подскажите как избежать такую ситуацию?

В таком случае стоит на OnPrepare сохранить старые значения полей карточки в поля объекта, а в обработчике OK сравнить каждое поле объекта с карточкой. Для оптимизации полную проверку полей можно делать только в тех случаях, если на DataChange установили значение true.

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

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

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

Результат на скриншоте. Описание реализации в прикрепленном файле.

111

Нравится

Поделиться

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

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

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

Интересное решение, благодарю :)

"Переведенцев" написал:. В скрипт редактирования Задачи добавили функцию "вносить в поля Последний раз прикрепленного Контакта и Контрагента текущую дату при сохранении Задачи".

Не могли бы вы выложить пример вашей реализации.

Заранее благодарен.

"Владимир С." написал:
Переведенцев пишет:

. В скрипт редактирования Задачи добавили функцию "вносить в поля Последний раз прикрепленного Контакта и Контрагента текущую дату при сохранении Задачи".

Не могли бы вы выложить пример вашей реализации.

Заранее благодарен.

Выкладываю пример реализации во вложении.

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

Для того чтобы в карточке «Задача» изменить время по-умолчанию в поле «Продолжительность» необходимо выполнить следующие действия:
1. Открыть Terrasoft Administrator.
2. Открыть сервис src_TaskUtils (Common \ Library).
3. В теле функции function GetDefaultTaskDueDateTime(StartDate) изменить исходный код на, к примеру, следующий.
К примеру,

function GetDefaultTaskDueDateTime(StartDate) {
        var DefaultTaskDurationHours = 0;
        var DefaultTaskDurationMinutes = 15;   
        var Result = new Date(StartDate);
        Result.setHours(StartDate.getHours() + DefaultTaskDurationHours,
        StartDate.getMinutes() + DefaultTaskDurationMinutes);
        return Result;
}

Что означает что продолжительность новой задачи (по умолчанию) устанавливается в 0 часов 15 минут.

4. Сохраните изменения и перезапустите клиентское приложение Terrasoft.

Нравится

Поделиться

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

Не, не кушает значение часов дробные числа. Я это делал такими исправлениями (привожу полностью функции):

// Вычисление даты и времени окончания задачи по умолчанию
function GetDefaultTaskDueDateTime(StartDate) {
var DefaultTaskDurationHours = 0; // Продолжительность задачи в часах
var DefaultTaskDurationMinutes = 30; // Продолжительность задачи в минутах
// В итоге часы и минуты суммируются
var Result = new Date(StartDate);
Result.setHours(StartDate.getHours() + DefaultTaskDurationHours,
StartDate.getMinutes() + DefaultTaskDurationMinutes);
return Result;
}

// Вычисление дефолтных значений времени начала и конца задачи
function GetDefaultTaskDateTime() {
var Today = new Date(System.Now());
var EndOfDay = GetDefaultTaskDueDateTime(Today);
var Result = new Object();
Result.StartDate = Today;
Result.DueDate = EndOfDay;
return Result;
}

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

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

Реализовано таким образом: пользователь в разделе [Задачи] выбирает те задачи, которые ему необходимо закрыть, нажимает пр. кнопку мыши и в контекстном меню выбирает «Действия» > «Отметить выполненными»:
Раздел [Задачи]
И выбранные задачи становятся выполненными. [Факт. дата начала] и [Факт. дата завершения] проставляются датами по плану.

1. В wnd_TasksWorkspace был добавлен ActionMenuItem:
Добавление ActionMenuItem

2. На него наложено событие amiChangeStatusOnExecute:
Событие ActionMenuItem

3.

function amiChangeStatusOnExecute(ActionMenuItem) {
        var Dataset = Services.GetNewItemByUSI('ds_TaskStatus');
        Dataset.Close();
        ApplyDatasetFilter(Dataset, 'ID', TaskStatusClosed, true);
        Dataset.Open();
        GetSelectRecordsForChangeStatus(Dataset);
}

где TaskStatusClosed – это ID выполненной задачи, добавлен в scr_Consts:
var TaskStatusClosed = '{F598ECDB-4EEF-4FA8-9E69-A36B053501E5}'; //Выполнена
Данное состояние будет проставляться выбранным задачам.

4. Сам скрипт scr_Consts необходимо добавить в Используемые скрипты scr_TasksWorkspace.

5. Функция GetSelectRecordsForChangeStatus выглядит следующим образом, находится также в scr_TasksWorkspace:

function GetSelectRecordsForChangeStatus(Dataset) {
        var GridDataset = dlTasks.Dataset;

        var CanUpdateTask = GetCanUpdateTableGroup(GridDataset);
        if (!CanUpdateTask) {
                var Message = FormatStr(HavntPermissionUpdateWarning, "задача");
                ShowWarningDialog(Message);
                return;
        }
        var StatusID = Dataset.Values('ID');
        var SelectedItemIDs = TasksWorkspace.Grid.SelectedIDs.CreateCopy();
        var UpdateQuery = GetSingleItemByCode('uq_TaskStatus', 'TaskWorkspace');
        var Parameters = UpdateQuery.Parameters;
        for (var i = 0; i SelectedItemIDs.Count; i++) {
                var TaskID = SelectedItemIDs.Items(i);
                var TaskDataset = Services.GetNewItemByUSI('ds_Task');
                TaskDataset.Close();
                ApplyDatasetFilter(TaskDataset,'ID',TaskID,true);
                TaskDataset.Open();
                Parameters('ID').Value = TaskID;
                Parameters('StatusID').Value = StatusID;
                Parameters('ActualStartDate').Value = TaskDataset('StartDate');
                Parameters('ActualFinishDate').Value = TaskDataset('DueDate');
                UpdateQuery.Execute();
               
                TaskDataset.Edit();
                TaskDataset('ActualDuration') = TaskDataset('Duration');
                TaskDataset('ActualDurationHours') = TaskDataset('ActualDuration')/60;
                TaskDataset('ActualDurationMinutes') = TaskDataset('ActualDuration')/60-TaskDataset('ActualDurationHours');
                TaskDataset('RemindingToAuthorID') = null;
                TaskDataset('RemindingToOwnerID') = null;
                TaskDataset.Post();
        }
        RefreshDataset(GridDataset);
}

6. Остается сохранить изменения и перезапустить систему.

Нравится

Поделиться

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

Интересно! А результаты? Было бы интересно позволять массово завершать только задачи одного типа и выставлять им какой-то результат...

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

Спасибо за идею :) Думаю, на досуге воплотим у себя

Пожалуйста) Рада, что пригодилась)

Кстати, в 3.4.0 реализовано массовое редактирование записей. Т.е. вы можете выделить несколько записей, нажать на кнопку "Изменить", сделать редактирование через интерфейс карточки и эти изменения применяться для всех выделенных записей.

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

Возникла необходимость работать с задачами Lotus Notes из конфигурации Terrasoft по следующим пунктам:

  • Создать задачу в Lotus Notes
  • Удалить задачу из Lotus Notes
  • Получить список задач текущего пользователя

Прежде всего нужно в настройках пользователя (Файл - Настройки - Настройки пользователя) на вкладке "E-mail" указать интеграцию с Lotus Notes, перегрузить клиент, затем там же в настройках пользователя на вкладке Lotus Notes указать путь к исполняемому файлу и файлу настроек (на машине должен быть установлен Lotus Client).
Последующие операции проводились на версиях Lotus Notes 8.5 и Terrasoft 3.3.2.220.

Инициализация
Для установки соединения с Lotus Notes потребуется scr_LotusUtils, а именно функция InitializeLotus(). При этом пользователю будет выдано окошко логина, а в атрибутах коннектора появится проинициализированный экземпляр коннектора Лотуса.
Если вызвать инициализацию по второму разу, то ничего не произойдет, поскольку в скрипте библиотеки прописана проверка на этот случай.
Итак, инициализация сводится к одной строчке

InitializeLotus();

Создание записи в Lotus Notes
Вначале получаем почтовую базу Лотуса

var Lotus = Connector.Attributes('Lotus');
var MailDB = Lotus.MailDB;

Далее создаем в ней новый документ
var doc = MailDB.CreateDocument();

В календаре LotusNotes можно создавать записи разных типов. То, какой тип будет создан, определяется параметром Form
Для создания записей с типом "встреча" или "собрание" этот параметр нужно заполнить значением 'Appointment':
doc.AppendItemValue('Form', 'Appointment');

Для конкретно задач нужно использовать значение 'Task'.
Атрибутов у создаваемого документа Лотуса есть довольно много, но минимальный необходимый набор следующий:
doc.AppendItemValue('Chair', Lotus.Session.UserName); //устанавливаем текущего лользователя Лотуса председателем записи
doc.AppendItemValue('Subject', Dataset.ValAsStr('Title')); //заголовок записи
// для записи с типом "собрание"
//doc.AppendItemValue('AppointmentType','3');
// для записи с типом "встреча"
doc.AppendItemValue('AppointmentType','0');
doc.AppendItemValue('StartDateTime', Dataset.ValAsDateTime('StartDate')); // дата/время начала
doc.AppendItemValue('EndDateTime', Dataset.ValAsDateTime('DueDate')); // дата/время окончания
doc.AppendItemValue('CalendarDateTime', Dataset.ValAsDateTime('StartDate')); // заполняем для корректного отображения в календаре Лотуса

После этого осталось только сохранить созданную запись в базу:
doc.Save(true,true);

При создании задачи (doc.AppendItemValue('Form', 'Task');) нужно заполнять несколько другие атрибуты создаваемого документа:

doc = MailDB.CreateDocument();
doc.AppendItemValue('Form','Task');
doc.AppendItemValue('Chair',Lotus.Session.UserName);
doc.AppendItemValue('Subject','your subject here');
doc.AppendItemValue('StartDate',Today.getVarDate());
doc.AppendItemValue('DueDateTime',DateToStr(EndTime))
doc.AppendItemValue('CalendarDateTime',Today.getVarDate());
doc.Save(true,true);

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

var UNID = doc.UniversalID;
Номер имеет строковый тип.

Удаление записи Lotus Notes
Процесс удаления намного короче (при условии, что сохранен уникальный номер UNID созданной ранее записи):

var doc = MailDB.GetDocumentByUNID(UNID);
if (doc.Remove(false)) {
   ShowInformationDialog('Задача успешно удалена из календаря Lotus Notes');
} else {
   ShowInformationDialog('Невозможно удалить задачу из Lotus Notes');
}

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

var Calendar = MailDB.GetView("($Calendar)");

Для удобства получения из записи атрибута будем использовать дополниетльную функцию
function GetItem(Task, ItemName) {
   return Task.GetItemValue(ItemName).getItem(0);
}

Простой вариант - перебор всех записей, и по имеющимся атрибутам определение нужной.
var Task = Calendar.GetFirstDocument();
while (Task != null) {
   Form = GetItem(Task, 'Form');
   StartDateTime = GetItem(Task, 'StartDateTime');
   EndDateTime = GetItem(Task, 'EndDateTime');
   Owner = GetItem(Task, 'Chair');
   Subject = GetItem(Task, 'Subject');
   AppointmentType = GetItem(Task, 'AppointmentType');
   UNID = Task.UniversalID;
   // если нужно - можно получать больше атрибутов или другие

   // здесь необходимые действия ...

   Task = Calendar.GetNextDocument(Task);
}

Замечания и конструктивная критика приветствуются.

Нравится

Поделиться

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

В предыдущем посте я упомянул термин "нормализация" задач. Хочу пояснить, что имел ввиду и зачем.

Позвольте, в начале, уточнить определение технологичного процесса.

  1. Это воспроизводимая последовательность задач, выполнение которых приводит к нужному результату.
  2. Данная последовательность представляет собой инструкцию к действиям и описывает кратчайшие пути достижения результата в наиболее вероятных вариациях процесса.
  3. Сотрудник является исполнителем процесса.
  4. Каждая задача нормализована (определение см. ниже).
  5. Процесс включает в себя схемы контроля и регуляции.

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

  1. Это воспроизводимая последовательность результатов, достижение которых приводит к итоговому результату.
  2. Данная последовательность включает в себя рекомендацию к действиям и описывает лучшие практики достижения результата.
  3. Сотрудник является интерпретатором процесса.
  4. Поскольку задачи не нормализованы, процесс включает в себя механизмы самообучения, взаимного контроля и саморегуляции.
  5. Внешний контроль осуществляется по результатам.

Первый подход применим, когда у нас есть однозначная зависимость между выполнением задачи и получаемым результатом. Ключевым требованием такого процесса является возможность нормализации выполняемых задач. В этом случае от исполнителя не ожидается существенного «творчества» при выполнении задачи (у него для этого может не доставать компетенций). От него требуется строгое следование инструкции (например, скрипту: если ответ клиента такой «…», то делаем так «…» если другой, то эдак). Контроль и регуляция осуществляется руководителем.

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

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

«Нормальная» задача:

  1. Конкретна (понятно что и как необходимо сделать)
  2. Имеет одного ответственного
  3. Нормативами ограниченна во времени
  4. Имеет четкие (однозначные) критерии оценки
  5. Предполагает определенную форму передачи результатов
  6. Подразумевает некие требования к компетенциям исполнителя

«Нормальный» результат:

  1. Может не иметь одного ответственного (?)
  2. Подразумевает некие требования к компетенциям исполнителя
  3. Ограничен во времени внешними условиями
  4. Критерием оценки является факт достижения результата
  5. Форма передачи результата определяется в каждом конкретном случае
  6. Содержание работы, количество задач является «черным ящиком»

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

Нравится

Поделиться

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

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

  1. Люди
  2. Технологии
  3. Методология внедрения изменений (технологий)

Подробности ниже:

Люди:

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

  1. Практики подбора персонала
  2. Мотивация
  3. Оценка компетенций и управление развитием
  4. Построение отношений

Технологии:

Это самая обширная тема, тут в принципе может быть все. Строго говоря, то что я описал выше тоже технологии, но для стройности теории я их вынес отдельно. Любая деятельность в организации, построена, по определенной технологии.

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

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

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

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

Точно также квалификация и компетенции руководителя должны принадлежать не людям, а организации в виде рабочего процесса. Организация такой работы, которая приносит нужные результаты, как бы и без "участия" руководителя, и есть главный критерий его успешности. Только этом случае руководитель сможет заниматься стратегическими задачами, а не утопать в оперативных вопросах.

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

Предлагаю в нашей работе выделить следующие технологии:

  1. Продажи (коробок и проектов)
  2. Реализации проектов
  3. Вывод нового продукта (отраслевого решения)

Методология внедрения изменений

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

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

Нравится

Поделиться

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

Саша, так ведь вроде есть документ или ряд документов с лучшими нашими практиками (по крайней мере, по внедрению вроде было). Или это не то?

Саша, регулярно читаю твои сообщения.
Предлагаю четко выделить концепцию.
Бытует такое мнение, что если концепция удачна, она должна умещаться на обычной салфетке.
Вот попробуй в 140 символов, как в твитерре, выразить, что ты хочешь сделать и как оно поможет нам, а то "многабукфф" и "я потерялася" (с) :wink:

Саша, мне кажется, что нужно детализировать идею.
Не совсе понятно о чем идет речь.

Коллеги, спасибо.
Идею я опубликую в разделе "Идеи".

Юра, анекдот:

— Нет, нет, нет! — кричит главный редактор своему репортеру, — статья слишком длинная! Выбросьте все ненужные подробности!
Через полчаса репортер приносит текст:
— Мистер Хэнкс вел машину со скоростью 100 миль в час по скользкому шоссе. Похороны завтра в 15 часов.

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

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

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

Как это получается? Вы можете написать, например, что День рождения у Вашего клиента 01.11.1980г и еще добросовестно заполнить эту деталь у 5000 Ваших клиентов. Но с этой информацией ничего не произойдет далее, и Вы каждый день будете просматривать список Ваших клиентов, выискивая у кого же в ближайшем будущем День рождения.
Нет, Вы, конечно, можете поставить себе отдельно вручную задачу в расписание. Такая функция есть. Заметьте, что это 5000 задач, поставленных вручную.
Задача, правда, возникнет автоматически 01.11.2010, а не 01.11.2011. И если ответственный не Вы, то придется поменять ответственного в самой задаче. Но это уже детали, ведь Вы достигли цели.
Хорошо еще то, что мы в своей базе дописали себе возможность ставить циклические задачи, т.е. я создавая задачу укажу, что повторять эту задачу надо раз в год 50 лет подряд.

Но возможно кто-то из Вас когда-либо пользовался Outlook. Тогда вы знаете, что там тоже есть знаменательные события и расписание с задачами. Если не знаете, я Вам расскажу как это работает: просто заполнив поле День рождения контакта Вы сразу получите в своем расписании циклическое событие! Одно заполненное поле!

Кстати, если Вы решите, что в Террасофт можно просто сформировать отчет по знаменательным событиям Ваших клиентов (сделать выборку на текущую неделю), спешу Вас огорчить - у Вас получится это сделать, если дни рождения написаны в форме 01.11.2010, а не 01.11.1980.
Т.е. у Вас будет прекрасная возможность раз в год, желательно 1 января, сесть и открыть все 5000 записей по Вашим клиентам и проставить новые знаменательные события.

Чего бы хотелось ? Хотелось бы, чтобы напоминания (задачи) формировались ответственному автоматически после установки знаменательного события на детали.
Может быть, кто-то уже реализовывал это у себя в базе?

Нравится

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

Виктория, здесь один из вариантов решения.

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

Федор Владимирович, это решение появится в следующей версии, 3.4.0. В конфигурацию Terrasoft будет добавлен так называемый Job-менеджер, с помощью которого можно будет запланировать на сервере создания напоминаний по знаменательным событиям, а также любые другие действия, которые должны периодически выполняться. На данный момент эта функциональность реализована в TS XRM Bank 3.3.2, а в версии 3.4.0 будет добавлена и в остальные продукты Terrasoft.

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

"Тихенко Виктория" написал:Возможно, это можно включить в какое-то бесплатное обновление

Ну самостоятельно часть функционала для себя завсегда руками в виде сервисов из конфигурации можно перенести:wink:

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

Добрый день!

В соответствии с http://community.terrasoft.ru/forum/topic/4094 внес изменения в отображение заголовка задач в зависимости от типа задач. Для заголовка мне потребовались дополнительные поля. Их я прописал в EnableAnyQueryColumns функции Initialize скрипта scr_SchedulerArea. Всё отлично отображается и работает. НО!!! Когда в расписании зажимаешь Ctrl и копируешь Задачу (перетаскиванием), то добавленные мной поля в заголовках (на всем расписании) не отображаются (null). После нажатия Обновить расписание приходит в порядок. Подскажите, где я еще что-то не доделал?

Нравится

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

Попробуйте добавить в конец обработчика ScheduleControlOnCopyEvent строку

RefreshDataset(dlEvents.Dataset);

Спасибо, Олег, помогло.

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