Добрый день! передо мной стоит задача внести изменения в карточку добавления контрагента, а именно настроить средства связи так чтобы уже автоматически стояли в заданном порядке.
Реализовать данную функциональность можно следующим образом.
1. В TSAdmin найти карточку редактирования контрагента.
2. Вызвать обработчик OnDatasetAfterAppend датасета даталинка.
3. В нём прописать значения средств связи в виде:
Dataset('Communication1TypeID') = <Значение 1>;
Dataset('Communication2TypeID') = <Значение 2>;
Dataset('Communication3TypeID') = <Значение 3>;
Dataset('Communication4TypeID') = <Значение 4>;
Dataset('Communication5TypeID') = <Значение 5>;
где <Значение 1> - это ID требуемой записи из таблицы tbl_CommunicationType (в Вашем случае [Мобильный]), для остальных значений аналогично.
Добрый день, коллеги! Подскажите, пожалуйста, реально ли и каким образом можно реализовать возможность очистки кеша и папки профиля у пользователя через интерфейс (кнопкой, или любой другой вариант). Проблемы с кешем были еще на момент внедрения, решили путем создания отдельного ехе файла у каждого пользователя, при запуски которого и происходит очитка. Сейчас столкнулись с такой проблемой: больше половины пользователей перешли на терминальный доступ, соответственно чистка кеша старым методом невозможна.
Конфигурации часто не меняем, проблема возникает периодически у пользователей зависает система и приходится чистить кеш. А при таком варианте очень сильно потеряем в скорости и для нас это важно. Вариант с кнопкой думаю самый оптимальный... и нам бы очень помогла любая документация по тому как осуществляется запись и очистка кеша в системе, или ваши советы по реализации такой возможности посредством кнопки.
Запись кеша осуществляется на уровне ядра.
Реализовать чистку кеша из системы возможно одним из следующих способов:
1) создать bat-файл, в котором будет выполняться чистка кеша, и при нажатии на кнопку вызывать выполнение этого файла;
2) при нажатии на кнопку реализовать удаление файлов, которые находятся в папке Cache.
Возможно кто-то сталкивался с проблемой, симптомы которой я сейчас попробую описать.
1. Версия Terrasoft CRM 3.2.0.86;
2. ОС - XP, 8;
3. MS SQL Server 2012;
Симптомы следующие.
Разедел с какого-то времени перестал открываться. Судя по внешнему виду не загрузилось окно раздела, а сообщение говорит о недопустимости конвертации одного типа в другой.
Что пытался делать.
У меня есть возможность получить удаленный доступ (благодаря VPN) к локальной сети, поэтому первое, что я попытался сделать, это сгенерировать ошибку у себя. Однако, оказалось, что на моей стороне ошибка не генерируется для тех же логина и пороля. IT-ик заказчика с которым я сотрудничаю тоже не смог воспроизвести проблему на другом копьютере. На "проблемном" компьютере под другой учеткой раздел открылся.
Исходя из этого можно сделать вывод, что проблема где-то в кэше, но удаление папки Cache не дает никаких результатов.
Добрый день.
Исходя из описания, проблема скорее всего кроется в профиле пользователя на текущей машина. Очистите профиль и загрузитесь заново под проблемным логином.
Необходимо учесть один нюанс, что слетят пользовательские настройки реестров, а также настройки разделов.
В таком случае необходимо выполнять отладку загрузки раздела, начиная с события OnPrepare с заходом в каждую вызывающуюся функцию.
Возможно где-то в коде находится логическая ошибка.
В Террасофте 3.5.1 Грид Напоминаний сворачиваются в системный Трей.
Каким образом можно сделать, чтобы при напоминании разворачивался сам Грид Напоминаний, а не маленькое окошко из системного трея о напоминаниях.
Для того, чтобы появлялось сразу окно напоминания, необходимо в сервисе scr_Main найти функцию UpdateRemindingNotification и закомментировать код, после чего в начало функции написать новый код:
var RemindingsForm = GetSingleItemByCode(Main.RemindingsWindowUSI);
RemindingsForm.Show();
У Вас должна получиться такая функция:
Добрый день! Подскажите, пожалуйста, каким образом в гриде можно установить возможность раскрывать плюсиком, к примеру сущность контакт, что бы внутри него отобразились направления по этому контакту. К примеру при создании справочников эта возможность присутствует изначально, а как ее реализовать в разделе?
Алексей, в приложении пример того отображения записей в разделе, который мы хотим. У менеджера может быть несколько контрагентов, соответственно раскрыв его - мы их увидим, так же и с контрагентами и так далее... Вопрос именно в том, как это отображение реализовать?
Если правильно Вас понял, вы имеете ввиду такой пример:
Для этого необходимо выполнить такую последовательность действий (пример приведу на разделе [Контрагенты]):
1. В нужном сервисе запроса, в нашем случае это будет sq_Account, вывести те колонки таблицы, которые необходимо отобразить в реестре. Если колонку выводим с помощью подзапроса, тогда необходимо настроить фильтрацию
2. В источнике данных, в нашем примере это ds_Account, выводи созданное поле на предыдущем шаге наше
3. Заполняем поля. В поле [Заголовок] вводим название колонки. В поле [Группа] вводим название группы, под этим названием будет группироваться колонки. в поле [Многострочный заголовок] вводим сгруппированное название вида: [Группа]|[Многострочный заголовок].
4. Повторяем предыдущие пункты, если нам необходимо вывести еще пару полей и группируем их в группу [Обязательства]
5.Добавляем ранее созданные поля в реестр. Для этого открываем окно реестре, в нашем случае это wnd_AccountsGridArea, добавляем поле(я) и заполняем необходимые значения.
Вы можете сгруппировать любые поля в одну группу. Главное в источнике данных заполнить поле [Группа] и [Многострочный заголовок]
По группировке в добавлении колонок, понятно, спасибо! А как можно настроить такую же группировку только в рамках сущности прямо в гриде? Скриншот прилагается
А так же подскажите, пожалуйста, где можно найти документацию по созданию разделов системы версии 3.3.2
Пример добавления пользовательского фильтра описан в файле во вложении.
Также существует возможность добавления или отключения фильтра в датасете раздела. Для этого нужно запустить TSAdmin, найти датасет раздела и для датафилда датасета (нужного поля) установить/снять признак 'Поле фильтрации'.
Добрый день! Необходимо добавить доп колонку с определенными условиями в результаты глобального поиска. Добавили в датасет mds_GlobalSearchResult доп поле и в окно wnd_GlobalSearchResults доп колонку, подаскажите, пожалуйста, где нужно прописать код для отображения после поиска нужных нам данных в этой колонки?
Данные с результатами поиска в колонки датасета добавляются в функции AppendResultString скрипта scr_GlobalSearch. Она вызывается для каждого результата в функции DoSearch.
Еще подскажите, пожалуйста, каким образом можно кодом у всех пользователей поставить умолчательно выбранные параметры поиска в настроках поиска (т.е даже при чистке кеша должны быть установленны определенные параметры - выбранные чекбоксы по умолчанию)?
Это датасет для уже найденных результатов, параметры поиска передаются в других функциях того же скрипта, которые вызываются раньше из функции DoSearch и вызывающей её StartSearch. См. InitializeSearchSettings, AddFiltersBySearchWordsArray и др. функции в скрипте scr_GlobalSearch.
Хорошо, тогда такой пример: где прописано условие, что поле FieldValue получает значение в зависимости от поля "тип объекта" SubjectType, по которому был найден результат? В одном случае в FieldValue - это название контрагента, а в другом - название проекта.
В карточку звонка добавил два LookupDataControl. В зависимости от того, какое значение выбрано в LookupDataControl1, значения в LookupDataControl2 меняются. Фильтрацию делал в с помощью:
function edtTypeOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
var TypeID = dlData.Dataset('TypeID');
var LookupDataset = edtResult.DataField.LookupDataset;
ApplyDatasetFilter(LookupDataset, 'CallTypeID', TypeID,
!IsEmptyGUID(TypeID));
}
Фильтр работает нормально. Без Unprepare работает тоже нормально. Может ли это быть от частого запуска "edtResult.UnprepareDropDownList()"? Просто когда убрал строки edtResult.UnprepareDropDownList() из функции dlDataOnDatasetDataChange, отрабатывает без ошибок.
Может, дело в том, что у Вас dlDataOnDatasetDataChange(DataField) срабатывает при изменении любого поля, а не только поля «Тип», по которому фильтруется? А если добавить дополнительную проверку и делить Unprepare только когда действительно нужно?
Да, срабатывает не только когда фильтрую по данному полю. А как можно отловить изменение именно этого поля? Добавил в функцию function edtTypeOnEnter(Control) стало отрабатывать нормально, без ошибок, но хотелось бы узнать, как можно отловить изменение именно в dlDataOnDatasetDataChange(DataField)?
У Вас в функцию dlDataOnDatasetDataChange передаётся параметр DataField. Это и есть то поле, что поменялось. Смотрите у него значение Name.
function dlDataOnDatasetDataChange(DataField){
var DataFieldName = DataField.Name;switch(DataFieldName){case('TypeID'):
edtResult.UnprepareDropDownList();break;}}
Думаю, стоит использовать какой-то COM-объеккт и вызывать его методы. Например, стандартный в Windows объект Shell.Application тоже умеет работать с ZIP.
Самый простой способ, это использовать встроенный Zip-архиватор ОС Windows.
Пример использования:
function Main(){
var zFolder ="c:\\log.zip";
var eFolder ="c:\\log";
ExtractFileFromZip(zFolder, eFolder);
CompriseFileToZip(eFolder, zFolder);}
function ExtractFileFromZip(PathFrom, PathTo){
var FSO =new ActiveXObject("Scripting.FileSystemObject");
var App =new ActiveXObject("Shell.Application");if(FSO.FolderExists(PathTo)){
FSO.DeleteFolder(PathTo, true);}
FSO.CreateFolder(PathTo);
var FolderPathTo = FSO.GetFolder(PathTo).Path;
var FolderPathFrom = App.Namespace(FSO.GetFile(PathFrom).Path);
var ZipItems = App.Namespace(FolderPathFrom).Items();
App.Namespace(FolderPathTo).CopyHere(ZipItems);}
function CompriseFileToZip(PathFrom, PathTo){
var Str ="PK%05%06%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00";
var ForWriting =2;
var FSO =new ActiveXObject("Scripting.FileSystemObject");
var App =new ActiveXObject("Shell.Application");if(FSO.FileExists(PathTo)){
FSO.DeleteFile(PathTo, true);}
var Itm = FSO.OpenTextFile(PathTo, ForWriting, true);
Itm.Write(unescape(Str));
Itm.Close();
var Enm =new Enumerator(FSO.GetFolder(PathFrom).Files);for(;!Enm.atEnd(); Enm.moveNext()){
Itm = Enm.item();
App.Namespace(FSO.GetFile(PathTo).Path).CopyHere(Itm.Path);}}