Добрый день! Подскажите, пожалуйста, почему при копировании бюджета (целочисленного значения) из ячейки excel в CRM, система выдает ошибку о том что поле не заполнено (т.е. фактически его не видит). При ручном вводе такой ошибки нет.
По сообщению из файла трудно сказать наверняка, что произошло.
Можно поставить отладчик и посмотреть, где конкретно она возникает.
Если не работает только на одном компьютере, то стоит для начала почистить профиль и кеш, перерегистрировать библиотеки, убедиться, что установлен Excel и включена интеграция с ним.
Если присмотреться, свал внутри функции ShowExcelReport. При отладке можно зайти внутрь неё и посмотреть, на какой именно строке валится. Вероятно, при попытке считать или записать какое-то свойство объекта Excel. Но точно можно узнать, если пройти внутри функции пошагово.
Возможно, дело в этом:
Если у вас используется новая версия Excel, то в скрипте scr_UserReportCommon замените функцию GetExcelObject кодом:
function GetExcelObject(){
var Excel =new ActiveXObject('Excel.Application');
var Excel_wb = Excel.Workbooks.Add();
Excel.Sheets(1).Name="Данные";
var SheetsCount = Excel.Sheets.Count;for(var i =2; i <= SheetsCount; i++){
Excel.Sheets(2).Delete();}
Excel.Visible=false;return Excel;}
В Террасофт есть версионность файлов, но нет возможности сравнения версий. Потому было решено реализовать функционал открытия 2х файлов в режиме сравнения.
Для этого используется метод CompareDocuments(). Описание метода и входных параметров можно посмотреть здесь.
На деталь [Журнал изменений] раздела [Файлы] добавлена кнопка [Сравнить документы]
На событие кнопки:
function btnCompareDocumentsOnClick(Control){ var Dataset = dlData.Dataset; var RecordID = Dataset('RecordID');// RecordID – ID родительского файла var SelectedIDs = grdData.SelectedIDs;//Получаем массив идентификаторов выделенных файлов var SelectedFilesIDs = GetArrayByCollection(SelectedIDs);//Преобразуем его в коллекцию var Ln = SelectedFilesIDs.length;
//Проверяем количество выделенных файлов, файлов должно быть 2 if(Ln ==2){
FirstFileID = SelectedFilesIDs[0];
SecondFileID = SelectedFilesIDs[1]; } else{
MessageBox(‘Выделите два файла’); return; }
//Получаем название первого файла var DatasetLog = Services.GetNewItemByUSI('ds_FilesLog');
ApplyDatasetFilter(DatasetLog,'RecordID', RecordID,true);
ApplyDatasetFilter(DatasetLog,'ID', FirstFileID,true);
DatasetLog.Open(); var FirstFileLink = DatasetLog('Link');
DatasetLog.Close();
//Получаем название второго файла
ApplyDatasetFilter(DatasetLog,'RecordID', RecordID,true);
ApplyDatasetFilter(DatasetLog,'ID', SecondFileID,true);
DatasetLog.Open(); var SecondFileLink = DatasetLog('Link');
DatasetLog.Close();
// загружаем файлы из бд на диск var FirstFileName = LoadFileFromFilesLog(FirstFileID, FirstFileLink,true, RecordID); var SecondFileName = LoadFileFromFilesLog(SecondFileID, SecondFileLink,true, RecordID);
//С помощью COM-объекта добавляем файлы в коллекцию открытых документов
WordUtils =new ActiveXObject("Word.Application"); var FirstWordDoc = WordUtils.Documents.Add(FirstFileName); var SecondWordDoc = WordUtils.Documents.Add(SecondFileName);
// получаем документ, который является результатом сравнения исходных файлов var WordDocRes = WordUtils.CompareDocuments(FirstWordDoc, SecondWordDoc,0,1,true,true,true,true,true,true,true,true,true,true,'',true);
С 16 июля по 1 сентября 2015 года для пользователей Terrasoft 3.X действуют специальные условия перехода на продукты CRM‑линейки bpm’online.
В зависимости от выбранной модели развертывания bpm’online (в облаке или на собственных серверах компании), а также срока действия контракта, предусмотрены различные скидки.
При переходе с Terrasoft 3.X на продукты bpm’online в облаке скидка может достигать 80% при подписании договора на 3 года.
Часто при необходимости показать в документации или переписке диаграмму процесса просто открывают её в дизайнере и делают скриншот. Таким образом нельзя сохранить большой процесс, не умещающийся целиком на экране в нормальном масштабе.
О возможности сохранить бизнес-процесс в виде графического файла зачастую не знают даже опытные пользователи системы. Но она есть.
Terrasoft 3.X:
Две кнопки, экспорт в BMP и в WMF.
bpm'online 5.X и 7.X:
Есть возможность выбрать формат JPEG, BMP или PNG.
Лучше всего выбирать формат BMP или PNG. В изображениях JPG возможны артефакты сжатия, процессы в WMF также выглядят не очень.
Полученный файл по разрешению может значительно превосходить экран, его можно отправить на печать на листе большых форматов.
Планируем в будущем интеграцию Terrasoft 3.4.0.Х с Call-центром. АТС - Panasonic, СУБД - Oracle.
На данный момент сотрудники техподдержки имеют именные лицензии TS XRM User + SD Agent 3.Х.
Вопросы:
1. Что нам необходимо докупать для того, чтобы сотрудники могли работать с разделами Call-центра?
2. Какие особенности интеграции с АТС Panasonic?
3. Имеется ли руководство по интеграции конкретно с АТС Panasonic?
Пользователи платформы Terrasoft 3.X, которые начинают готовиться к наступлению нового 2016 года с начала лета, могут заметить, что список лет в календаре системы заканчивается 2015 годом.
Сейчас мы узнаем, как его продлить.
1. Запустите программу Администратор Terrasoft (файл TSAdmin.exe) в папке Program Files\Terrasoft\Bin.
2. В программе нажмите Ctrl+F для открытия окна поиска, введите в поиск «enm_years» и нажмите кнопку «найти»:
3. Справа в дереве выберете найденный сервис «enm_Years», кликните по нему дважды. Откроется список годов в системе:
4. Нажмите слева кнопку «Новый» -> «Значение перечисления»:
5. Создастся новый год. В нём во всех трёх полях введите «2016» вместо того, что там есть:
6. Повторите пункты 4-5 для нужного числа лет.
7. Обязательно в конце сохраните правки (Ctrl+S), закройте TSAdmin (Администратор Terrasoft) и перезапустите TSClient (сама система Terrasoft).
8. Год должен появиться:
Рабочее место "Задачи" имеет в правой части список контактов, чьи задачи можно было бы оперативно выбрать. Видимо, где-то спрятано ограничение на количество контактов в этом списке, т.к. больше 10 сделать не удаётся, а надо мне 13 (пока, возможно увеличение). Кто знает, где изменить/отменить ограничение?
Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.
Не оно. Это место тоже находил - не помогло. Сейчас ради интереса вставил перед выделенным фрагментом выдачу в лог текущего значения NewContactList.length - а оно не выдаётся. Значит сюда мы вообще не попадаем.
Вот это оно!
Вообще забанил кусок
// if (Color == 0xFFFFFFFF) {
// return;
// }
ибо чуть ниже у нас реализована доработка по подсветке задачи в соответствии с "личным" цветом ответственного, и GetFreeColor в этом месте стал не актуальным.
Спасибо за помощь!
Совершаю первые попытки использования бизнес-процессов, поэтому прошу сильно не пинать.
Задача. При изменении состояния инцидента на определённое значение и неизменении этого состояния в течение n-ного количества времени, необходимо сформировать напоминалку ответственному и создателю.
Моё видение решения.
Через "Автоматический запуск процесса" настраиваю запуск моего процесса по изменению данных в источнике данных Инцидент если новое значение состояния соответствует такому-то фильтру. Как гасить уже висящий процесс при смене состояния на другое пока не придумал, возможно через другой бизнес-процесс, в котором скриптом прописать окончание предыдущего.
Создаём бизнес-процесс, содержащий всего два действия:
1. Задержка на n-ное количество времени
2. чтение/запись данных, "запись значений параметров в базу данных", "создать новую запись" с источником данных "напоминание". В п.5 заполняю поля будущего напоминания: "Описание = текст напоминания", "Тип объекта = Инцидент", "Время = как указать текущее + 1-2 минуты?" И вопрос с п.4: указать взаимосвязь ключевого поля с параметром диаграммы. Видимо, здесь нужно указать, к какому инциденту будет прицеплено новое уведомление. Откуда заполучить номер? И ID ответсвенного и создателя инцидента как поймать?
1. Через "Автоматический запуск процесса" настраиваем запуск БП через каждые M-минут (зависит от n и здравого смысла)
2. В БП:
- берем все инциденты, подходящие по признакам ("неизменении этого состояния в течение n-ного", для учета последнего изменения надо либо сделать поле, куда писать текущее время при изменении, либо включить историю)
- проверяем для выбранных инцидентов - нет ли уже напоминалок/вместо проверки можно просто удалять созданные ранее (по какому-то признаку + ИД инцидента)
- добавляем и/или обновляем напоминалки для выбранных инцидентов
Так у вас будут всегда (с промежутком в M-минут) актуальные напоминалки
Как вариант, можно сделать это в виде задания Агента-SQL.
Но на сам деле надо сделать по-другому)) При изменении состояния инцидента на нужное - ставить напоминалку через n-времени. При изменении состояния с нужного - стирать ее. И Все)
Ставить напоминалку - это работа ручками, а именно её и хочется исключить, т.к. в этом случае в процесс вклинивается человеческий фактор. Сейчас у народа есть фильтр по заданному состоянию инцидента, и на него им лень перейти и проверить не появилось ли там что-нибудь.
В целом, мысль понял и принял. На самом деле, наверно в джобик SQL это засунуть проще будет.
1. Выбираю все инциденты в нужном статусе из tbl_Incident
2. Из tbl_IncidentLog вытягиваю max(CreatedOn) для данного инцидента. Если эта дата отличается от текущей более чем на N, проверяю наличие/отсутствие в tbl_Reminding строчки для этого инцидента. Если нет, инсертю её.
Теоретически, должно получиться. Пошел кодить.
"Александр Кудряшов" написал:
Булат Андрей Борисович пишет:
Ставить напоминалку - это работа ручками, а именно её и хочется исключить
Имелся ввиду скрипт на сохранение объекта Инцидент. Кодом написать генерацию напоминания, работать будет автоматом
Тоже вариант.
Остаётся вопрос: как убивать неиспользованные напоминания, если инцидент из неправильного состояния переведён раньше наступления часа Х. Там-же в скрипте отслеживать? Всё-таки, вариант с периодическим заданием/джобиком эту логику отработает правильнее.
"Булат Андрей Борисович" написал:как убивать неиспользованные напоминания...Там-же в скрипте отслеживать? Всё-таки, вариант с периодическим заданием/джобиком эту логику отработает правильнее.
реализовать скриптом проще.
после сохранения инцидента (DatasetAfterPost):
- если состояние изменилось с другого на неправильное - поставить напоминалку на текущее время + n
[когда наступит время Х - напоминалка отрабоается (удалится или переставится) вручную тем, на кого она ставится, если час Х не наступит то:]
- если состояние поменялось с неправильного на другой - удалить напоминалку, если она есть
состояние для дальнейшего сравнения в качестве "того, которое было до редактирования" лучше сохранять в переменную на AfterOpen
Реализовал таки через джобик SQL, ибо TSQL мне больше знаком :-) Вроде работает. Но... Напоминалку пользователь увидит только если запустит программу. У нас не все постоянно сидят в системе: не требуется это.
Отсюда вылезло продолжение задачи. Формировать не напоминалку а письмо. Тоже средствами MSSQL это возможно, или возвращаемся к первому сообщению - формирование бизнес-процесса?
При нахождении инцидентов, находящихся в состоянии YY более заданного времени (селека соответствующая уже готова), необходимо отправить письмо ответственному и автору инцидента. Адрес берём из соответствующих контактов. Тема письма - простой текст. В тело письма неплохо было бы затолкать номер инцидента, наименование контрагента и "признаки" инцидента.
письмо отправлять средствами сервера SQL (sp_send_dbmail) или через ОС сервера (плохо представляю как)
я бы отправлял одно письмо на одного адресата (с информацией на все инциденты, касающиеся адресата)
в Террасофт письма, естественно, не сохранятся (да и не надо)
Дмитрий, спасибо! Счастье наступило!
Слепил через sp_send_dbmail. В кучу собирать не стал: один инцидент - одно письмо, чтобы не перелопачивать логику предыдущего джоба.