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

Нравится

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

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

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

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

Желаю успехов!

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

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

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

Добрый вечер, Андрей.
Действительно, колонки Контрагент не хватает в окне напоминаний. Если Вы напишете, какую версию сейчас используете (желательно с точностью до 4-й цифры), я вышлю Вам необходимое обновление. Информацию о версии Вы можете посмотреть в свойствах файла TSCRM.exe

Друзья, спасибо за отзывчивость!
Алексей, версия у меня 3.2.0.5
За обновление был бы очень признателен, т.к. у меня еще исчезают задачи для контрагентов, апгрейт поможет!

Наши клиенты постоянно задают этот же вопрос: не удобно в окне напоминаний не видеть Контаргента, по которому произошло событие.
Если в каждое название Задачи подставлять название контрагента, то получим слишком много лишней информации. Зачем в таком случае вообще связь с Контрагентом? Так же скриптом можно подставлять в название Задачи номер Счета, название Воздействия и пр... К тому же, если используются длинные названия Контрагентов, то слишком захламляется любой грид, в котором отображается список Задач.

Александр, Ключник Алексей уже любезно сообщил о доделке данной колонки.

Здравствуйте, а как можно колонку контрагента в напоминаниях добавить в версию 3.0.4?

Примерно так (см.файл).

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

Попробовала добавить колонку по примеру в файле, выложенном Татьяной. При запуске TSCRM возникает ошибка:
"Невозможно найти столбец с индексом 9 в объекте SelectQuery 'sq_Remindings' Select 'ContactsSelect'"

Индекс 9 как раз у новой строки-константы.

Проблема разрешилась. Было случайно добавлено лишнее поле в одном из UNION в Select.

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

Бывает, что встречается ошибка: при запуске программы возникает окно напоминаний, не содержащее записей. Причина в том, что для проверки, есть ли напоминания, в scr_Main используется функция GetAreRemindingsExist(), в которой опрашивается датасет ds_RemindingsCount. Он возвращает значения из таблицы tbl_Reminding. Там и вправду может быть напоминание. Но объекта, на которое ссылается это напоминание, может по каким-то причнам не быть. А в гриде окошка напоминаний используется другой датасет, ds_Remindings. В нём данные получаются из сложного запроса со множеством UNION ALL, но важно то, что выбирает он из таблиц, на которые в принципе может ссылаться поле "SubjectID" таблицы tbl_Reminding.

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

Лечить это можно так:
в скрипте scr_Main, в функции GetAreRemindingsExist() в самом конце, перед return (Count > 0); поставить такую конструкцию:

if (Count > 0){
//Если найдены напоминания - проверяем, существуют ли связанные объекты
var RemindingsDataset = GetSingleItemByCode('ds_Remindings', 'CheckExistingRecords');
        ApplyDatasetFilter(RemindingsDataset, 'ContactID', ContactParameter.ValAsGUID, true);
        ApplyDatasetFilter(RemindingsDataset, 'RemindTime', today.getVarDate(), true);
        RemindingsDataset.Open();
        Count = (RemindingsDataset.IsEmptyPage ? 0 : Count); // или поменять на
        //Count = RemindingsDataset.RecordsCount; // альтернативный, более медленный способ, возвращающий точное количество напоминаний с действительно существующими объектами
        RemindingsDataset.Close();
}

Это избавит от "призрачных" напоминаний, но не ликвидирует, конечно, причину их появления.

Нравится

Поделиться

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

Может быть оптимальнее использовать след. строки вместо var RemindingsDataset = Services.GetNewItemByUSI('ds_Remindings');

var RemindingsDataset = GetSingleItemByCode('ds_Remindings', 'CheckExistingRecords');
RemindingsDataset.Close();

С GetSingleItemByCode быстрее, конечно. Тем более, что проверка напоминаний происходит регулярно. Подправил, но решил строку с RemindingsDataset.Close() повторно не вставлять, рассуждая так: в первый раз датасет будет закрыт, а в последующие - зарыт при выходе из функции (там закрытие есть). Главное, твёрдо помнить, что с таким кодом датасет используется только здесь.

Более того, датасет (если он DBDataset) автоматически закрывается в теле приведенной функции GetSingleItemByCode(...). Кроме того, вместо

Count = RemindingsDataset.RecordsCount; 

, который выполняет дополнительный запрос типа SELECT COUNT(*) FROM ...

советовал бы написать код вроде:

Count = (RemindingsDataset.IsEmptyPage ? 0 : Count);

Будет работать немного быстрее.

Спасибо, Артём!

А и вправду (сейчас посмотрел и убедился), GetSingleItemByCode всегда закрывает сервис, если он DBDataset. По крайней мере, так в 3.2.1.

Что же касается .RecordsCount, то, конечно, это свойство не стоит использовать для проверки, существует ли хоть одна запись, ведь оно генерирует дополнительный запрос с count(*). Лучшие, согласен, использовать .IsEmptyPage. Но дело в том, что в функции (GetAreRemindingsExist(), в базовой её части) используется именно количество: переменная Count получается, как раз, запросом по count(*), хотя и в неявной форме: var Count = Main.RemindingsDataset.Values('Count');
(указанный датасет содержит запрос с count(*)). Моя вставка подменяет значение этой переменной count (содержащий количество напоминаний) на количество напоминаний, имеющих связанные объекты.

Если взять Count = (RemindingsDataset.IsEmptyPage ? 0 : Count); мы получим в результате Count с количеством напоминаний, а не с количеством напоминаний с существующими объектами, когда RemindingsDataset.IsEmptyPage не будет true; то есть записей меньше, но они всё-таки есть.

Однако, поскольку функция всё равно возвращает return (Count > 0); то, получается, безразлично, "правильно" мы вычислили Count, или нет. Так что я согласен: Count = (RemindingsDataset.IsEmptyPage ? 0 : Count); даст выигрыш на один запрос. Сейчас исправлю. Хотя, наверное, стоило бы и саму функцию с датасетом перекроить: помещать в базовую перменную count сразу проверку на существование связанных с напоминанием объектов. Изменить её Select Query, к примеру.

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