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

Нравится

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

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

Реализовать данную функциональность можно следующим образом.

1. В TSAdmin найти карточку редактирования контрагента.
2. Вызвать обработчик OnDatasetAfterAppend датасета даталинка.
3. В нём прописать значения средств связи в виде:
Dataset('Communication1TypeID') = <Значение 1>;
Dataset('Communication2TypeID') = <Значение 2>;
Dataset('Communication3TypeID') = <Значение 3>;
Dataset('Communication4TypeID') = <Значение 4>;
Dataset('Communication5TypeID') = <Значение 5>;
где <Значение 1> - это ID требуемой записи из таблицы tbl_CommunicationType (в Вашем случае [Мобильный]), для остальных значений аналогично.

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

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

Нравится

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

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

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

Запись кеша осуществляется на уровне ядра.
Реализовать чистку кеша из системы возможно одним из следующих способов:
1) создать bat-файл, в котором будет выполняться чистка кеша, и при нажатии на кнопку вызывать выполнение этого файла;
2) при нажатии на кнопку реализовать удаление файлов, которые находятся в папке Cache.

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

Добрый день, коллеги!

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

1. Версия Terrasoft CRM 3.2.0.86;
2. ОС - XP, 8;
3. MS SQL Server 2012;

Симптомы следующие.

Разедел с какого-то времени перестал открываться. Судя по внешнему виду не загрузилось окно раздела, а сообщение говорит о недопустимости конвертации одного типа в другой.

Что пытался делать.

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

Исходя из этого можно сделать вывод, что проблема где-то в кэше, но удаление папки Cache не дает никаких результатов.

Нравится

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

Картинка в прикрепленном файле.

Добрый день.
Исходя из описания, проблема скорее всего кроется в профиле пользователя на текущей машина. Очистите профиль и загрузитесь заново под проблемным логином.
Необходимо учесть один нюанс, что слетят пользовательские настройки реестров, а также настройки разделов.

P.S.
Прикрепленное изображение не открывается.

Павел, вы имеете ввиду очистку/удаление папки Profile?
Если да, то это ситуацию не меняет.

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

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

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

В Террасофте 3.5.1 Грид Напоминаний сворачиваются в системный Трей.
Каким образом можно сделать, чтобы при напоминании разворачивался сам Грид Напоминаний, а не маленькое окошко из системного трея о напоминаниях.

Нравится

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

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

Для того, чтобы появлялось сразу окно напоминания, необходимо в сервисе scr_Main найти функцию UpdateRemindingNotification и закомментировать код, после чего в начало функции написать новый код:
var RemindingsForm = GetSingleItemByCode(Main.RemindingsWindowUSI);
RemindingsForm.Show();
У Вас должна получиться такая функция:

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

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

Нравится

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

Здравствуйте, Антон!

А почему не вывести эти колонки в реестр записей?

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

Здравствуйте, Антон!

Если правильно Вас понял, вы имеете ввиду такой пример:

Для этого необходимо выполнить такую последовательность действий (пример приведу на разделе [Контрагенты]):

  1. 1. В нужном сервисе запроса, в нашем случае это будет sq_Account, вывести те колонки таблицы, которые необходимо отобразить в реестре. Если колонку выводим с помощью подзапроса, тогда необходимо настроить фильтрацию
  2. 2. В источнике данных, в нашем примере это ds_Account, выводи созданное поле на предыдущем шаге наше
  3. 3. Заполняем поля. В поле [Заголовок] вводим название колонки. В поле [Группа] вводим название группы, под этим названием будет группироваться колонки. в поле [Многострочный заголовок] вводим сгруппированное название вида: [Группа]|[Многострочный заголовок].
  4. 4. Повторяем предыдущие пункты, если нам необходимо вывести еще пару полей и группируем их в группу [Обязательства]
  5. 5.Добавляем ранее созданные поля в реестр. Для этого открываем окно реестре, в нашем случае это wnd_AccountsGridArea, добавляем поле(я) и заполняем необходимые значения.

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

По группировке в добавлении колонок, понятно, спасибо! А как можно настроить такую же группировку только в рамках сущности прямо в гриде? Скриншот прилагается
А так же подскажите, пожалуйста, где можно найти документацию по созданию разделов системы версии 3.3.2

Здравствуйте, Антон!

Создание древовидного грида (TreeDataGrid) не простая задача, пример создания такого грида и раздела можете рассмотреть на примере раздела [Проекты].

Также рекомендую ознакомиться со статьями на community по этому вопросу:
Организовать древовидный список
TreeArea в качестве основного реестра раздела
Создание нового раздела
Дотянуться до поля ParentID
Создание нового раздела
TreeArea
Не могу разобраться с TreeArea
Как организовать фильтрацию по наличию подчиненного элемента в TreeArea?

Руководство пользователя

Не получается ввести ключ

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

У Вас не корректный путь.

Каким образом ввести корректный?

В Вашем случае полный путь будет таким:
"C:\Program Files (x86)\Terrasoft Sales\Bin\TSClient.exe" /wnd=wnd_CreateNewWorkspace

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

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

Сервис, в котором хранятся иконки для разделов системы, называется il_Main (\\Common\Main).

спасибо, а каким образом можно использовать этот сервис по отношению к новому разделу?

Иконки для раздела указываются в дизайнере окна wnd_Main.

Для нового раздела вы можете сделать по аналогии с уже существующими разделами, например, раздела [Контрагенты].

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

Добрый день, подскажите где добавляются\удаляются параметры в фильтре в нижнем левом углу разделов?

Нравится

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

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

Уточните, пожалуйста, о каких фильтрах идет речь? В разделах фильтры размещены вверху страницы, а не внизу.

В приложении скрин, там выделена нужная нам область фильтров
Спасибо

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

Спасибо!

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

Добрый день! Необходимо добавить доп колонку с определенными условиями в результаты глобального поиска. Добавили в датасет mds_GlobalSearchResult доп поле и в окно wnd_GlobalSearchResults доп колонку, подаскажите, пожалуйста, где нужно прописать код для отображения после поиска нужных нам данных в этой колонки?

Нравится

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

Данные с результатами поиска в колонки датасета добавляются в функции AppendResultString скрипта scr_GlobalSearch. Она вызывается для каждого результата в функции DoSearch.

Еще подскажите, пожалуйста, каким образом можно кодом у всех пользователей поставить умолчательно выбранные параметры поиска в настроках поиска (т.е даже при чистке кеша должны быть установленны определенные параметры - выбранные чекбоксы по умолчанию)?

Можно, например, создать в таблице контактов дополнительные скрытые поля и хранить в них.

А где в датасете ResultDataset, который используется функцией AppendResultString, можно создать параметр, по которому будет производиться поиск?

Это датасет для уже найденных результатов, параметры поиска передаются в других функциях того же скрипта, которые вызываются раньше из функции DoSearch и вызывающей её StartSearch. См. InitializeSearchSettings, AddFiltersBySearchWordsArray и др. функции в скрипте scr_GlobalSearch.

Хорошо, тогда такой пример: где прописано условие, что поле FieldValue получает значение в зависимости от поля "тип объекта" SubjectType, по которому был найден результат? В одном случае в FieldValue - это название контрагента, а в другом - название проекта.

Таблицы, по полям которых ищется, задаются в BuildSearchFieldsData. Там заполняется объект GlobalSearch.SearchedWorkspaces.

Рекомендую настроить отладчик и пошагово пройти весь процесс поиска, чтобы понять, откуда что берётся.

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

Добрый день!

Помогите, пожалуйста, решить следующую задачу:
Terrasoft: 3.3.1.163

Необходимо добавить в CRM в Контрагентов новые поля: кредитный лимит и отсрочка платежа
http://prntscr.com/9sh095
http://prntscr.com/9sh0g9
http://prntscr.com/9sh0q5

Спасибо!

Нравится

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

В карточку звонка добавил два LookupDataControl. В зависимости от того, какое значение выбрано в LookupDataControl1, значения в LookupDataControl2 меняются. Фильтрацию делал в с помощью:

function edtTypeOnPrepareSelectWindow(LookupDataControl, SelectWindow) {

var TypeID = dlData.Dataset('TypeID');
var LookupDataset = edtResult.DataField.LookupDataset;
ApplyDatasetFilter(LookupDataset, 'CallTypeID', TypeID,
!IsEmptyGUID(TypeID));
}

а обновлял с помощью:

function dlDataOnDatasetDataChange(DataField) {

edtResult.UnprepareDropDownList();
edtPrichina.UnprepareDropDownList();
}

Но при выборе значений LookupDataControl2 вылетает ошибка List index out of bounds (разные числа)

В чем может быть проблема? Заранее спасибо.

Нравится

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

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

Уточните, пожалуйста, продукт и его версию.

Забыл сразу написать. XRM 3.3.2.

А если фильтр убрать, выбирает нормально?
Дело именно в наложенном фильтре, или в Unprepare?

Фильтр работает нормально. Без 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;
 
	}	
}

Спасибо. Вы очень помогли, Александр.

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

Добрый день!

Как в TS 3.X лучше работать с zip-архивами (распаковать файлы, упаковать файлы)?

Нравится

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

Думаю, стоит использовать какой-то 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);
	}
}
Показать все комментарии