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

Нравится

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 (в Вашем случае [Мобильный]), для остальных значений аналогично.

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

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

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

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

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

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

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

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

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

Нравится

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

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

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

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

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

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

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

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

Нравится

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

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

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

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

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

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

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

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

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

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

В карточку звонка добавил два 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;
 
	}	
}

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

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

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

Пытаюсь решить одну проблему и столкнулся со странным поведением системы.

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

Код примерно такой:

var ExlApp = new ActiveXObject("Excel.Application");
var WorkBook = ExlApp.Workbooks.Open(FileName);
var Sheet = WorkBook.Sheets(1);
var BankData = Sheet.UsedRange.Value;
// Вот здесь BankData и есть тот самый массив, но обратится к нему проблематично
// var Value = BankData[2][2] выдает ошибку о том что объект есть null или не является объектом
// да и BankData имеет тип Unknown. Хотя в студии его структура видна и данные как бы есть.

WorkBook.Close(false);
ExlApp.Quit();
delete ExlApp;

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

Нравится

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

Добрый день!
Это не мессив. В MSDN есть вся информация.
Sheet.UsedRange возвращает тип Range
Здесь все об этом типе
Такие вещи очень хорошо поискать снача в MSDN, а после можно найти решение на Stackoverflow

Я не писал что Sheet.UsedRange это массив.
А вот Sheet.UsedRange.Value возвращает массив, с которым чудесно можно работать в Delphi например.
Быстрая обработка данных Excel в Delphi
Благодарю за ссылку на MSDN :)

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

Я создаю шаблон счёт-фактуры, мне необходимо подсчитывать сумму с НДС и округлять сумму в каждой строке. На примере шаблонов других документов я хочу использовать OnDatasetCalcFields, который даёт возможность менять уже выбранные из БД значения. Например так:

var Value = Dataset.ValAsFloat('BasicTotalAmount');
ShowInformationDialog("Value before = " + Value);
var NDS = Value / 100 * 18;
ShowInformationDialog("NDS = " + NDS);
var Totally = System.Round(NDS + Value, 2);
Dataset.Values('BasicTotalAmount') = Value;

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

Нравится

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

Дмитрий, похожие вопросы рассматриваются в темах:

Кратко, если в Dataset-е нет вычисляемых полей (других), то это событие само не вызовется.

Да, действительно. Спасибо!

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

Здравствуйте!
Понадобился редактор html для редактирования и записи данных в БД в формате html.
Скачал и установил lite версию html редактора XStandard (ActiveXControl).
Подскажите, как получить свойство Value? (для записи в БД).
По документации (http://xstandard.com/en/documentation/xstandard-dev-guide/api/) точного ответа не нашел.

Нравится

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

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

Нравится

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

Вероятно у Вас есть системная настройка с названием вроде «Текущий номер проекта», её также надо обновлять.

"Зверев Александр" написал:Вероятно у Вас есть системная настройка с названием вроде «Текущий номер проекта», её также надо обновлять.

Как её можно обновлять скриптами при запуске системы?

Например, завязаться на событие OnPrepare страницы главного окна wnd_Main. То есть в функцию wnd_MainOnPrepare дописать вывод своей функции, которая вычисляет актуальный номер и пишет в системную настройку.

Читать значение настройки можно функцией GetSystemParameterValueEx, писать — SetSystemParameterValue.

Штатно вычисляется текущий номер и сразу увеличивается на 1 при помощи функции GenerateSystemNumber, можете посмотреть пример работы с системными настройками и там.

Если интеграция с другой системой идёт в момент, когда не запущен Terrasoft и сделана на уровне БД, можно просто менять значение записи в БД в таблице tbl_SystemSetting.

Большое спасибо, первый вариант нашёл сам, а второй - то что нужно.

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

Добрый день.
есть таблица на 15000 записей
при обращении к ней из под админ пользователя выполнение занимает не более 1 сек.
при обращении обычным пользователем более 5ти минут
из-за чего может быть проблема?

Нравится

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

Админ работает напрямую с таблицей, а пользователь — с автоматически сгенерированной view, отфильтрованной по его правам.

можно дать права на работу на прямую с таблицей?

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

отловите в профайлере запрос и посмотрите на план запроса.

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

Добрый день!
Возникла такая ситуация. При входящем звонке со срытого номера, зависает карточка в большинстве случаев. Номер определяется как 007.
Из за чего может зависать звонок? И быть может есть способ подменить номер вместо этого номера?
Может кто сталкивался?

Нравится

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

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

Скорей всего что номер 007 подставляет Ваша АТС и необходимо вносить изменения в настройки АТС чтобы она передавала тот или иной CallerID (входящий номер).

Спасибо, буду пытаться разобраться.

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