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

Метод, который определяет активность
isEnableButtonTest: function() {
debugger
var activeRow = this.get("ActiveRow");
if (activeRow)
{
var pc = this.get("GridData").get(activeRow).get("ServiceCategory");
//return (pc || pc !== "") ? true : false;
if (pc.value === UsrConsts.ServiceCategory.Test)
return true
else
return false;
//return (pc.value === UsrConsts.ServiceCategory.Test) ? true : false;
}
else
return false;
}

var pc = this.get("GridData").get(activeRow).get("ServiceCategory")
возвращает какое-то значение только, если колонка ServiceCategory выведена в реестр,
иначе значение undefined.
Почему? Скажите, пожалуйста, как это обойти?
И еще вопрос - при изменении поля ServiceCategory доступность кнопки меняется только, если обновить сам реестр. Как сделать автоматическое обновление кнопки?

Нравится

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

Дарья, здравствуйте!

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

Добрый день!
Версия 7.6 ITIL
Полный список кода в прикрепленном файле

Дарья, здравствуйте.

GridData не гарантирует получение результата. Для получения значения ServiceCategory, Вам необходимо сделать запрос в базу данных при помощи entityschemaquery. Значение Id (из таблицы Case) для выделенного обращения у Вас хранится в переменной activeRow.

Для изменения доступности кнопки без обновления реестра, Вам следует посмотреть в сторону sandbox.

Спасибо - про запрос с помошью entityschemaquery поняла ( просто в инструкции в sdk было написано GridData)

По поводу изменения доступности кнопки без обновления реестра - подскажите, пожалуйста, где можно посмотреть реализацию сообщений sandbox ?

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

Примеров реализации сообщений в нашей системе довольно много. Самым ярким примером могут служить модули BasePageV2 и BaseSectionV2. В этих модулях при инициализации вызывается метод subscribeSandboxEvents, который выполняет подписку на сообщения sandbox.

Например, в модуле BaseSectionV2 выполняется подписка на сообщение CardChanged, и когда модуль получает это сообщение, он устанавливает изменённое значение соответствующему атрибуту. Само же сообщение отправляет (публикует) модуль BasePageV2 при вызове метода publishPropertyValueToSection. В свою очередь, метод publishPropertyValueToSection вызывается при изменении некоторых атрибутов модели карточки редактирования.

Вы можете поступить похожим образом. Например, в методе init Вашей карточки редактирования (CasePage) подписаться на изменение поля ServiceCategory:

init: function() {
	this.callParent(arguments);
	this.on("change:ServiceCategory", function(model, value) {
		this.publishPropertyValueToSection("CurrentServiceCategory", value);
	}, this);
}

Таким образом, при изменении поля ServiceCategory карточки новое значение будет записываться в атрибут CurrentServiceCategory раздела CaseSection.

После этого в разделе Вы сможете получить значение текущей категории, обратившись к атрибуту CurrentServiceCategory:

isEnableButtonColumbus: function() {
	var serviceCategory = this.get("CurrentServiceCategory");
	if (!serviceCategory) {
		// Ваш код
	} else {
		return (serviceCategory.value === UsrConsts.ServiceCategory.Dynamix);
	}
},
Показать все комментарии

Добрый день!

Как добавить "зеленую" кнопку c именем "Начать работу с лидом" в разделе "Лиды" к уже существующим:
1

И самое главное, как сделать так, чтобы при клике на нее запустился определенный бизнес процесс, скажем "LeadProcess" ?

С системой работаю еще мало, поэтому если можно больше подробностей. Буду очень благодарен.

Спасибо!

Нравится

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

Запуск БП по кнопке:
http://www.community.terrasoft.ru/forum/topic/10554#comment-47944

Добавление кнопки в активную строку (на примере кнопки позвонить водителю в кастомном разделе):

define("SfEvacuatorSection", ["SfEvacuatorSectionResources", "GridUtilitiesV2"],
function(resources) {
	return {
		entitySchemaName: "SfEvacuator",
		contextHelpId: "1001",
		diff: /**SCHEMA_DIFF*/[
			{ // добавление самой кнопки
				"operation": "insert",
				"name": "DataGridActiveRowCallDriverAction",
				"parentName": "DataGrid",
				"propertyName": "activeRowActions",
				"values": {
					"className": "Terrasoft.Button",
					"style": Terrasoft.controls.ButtonEnums.style.BLUE,
					"caption": resources.localizableStrings.CallDriverRowButtonCaption,
					"tag": "call"
				}
			}
		]/**SCHEMA_DIFF*/,
		messages: {},
		methods: {
			onActiveRowAction: function(buttonTag, primaryColumnValue) {
				switch (buttonTag) {
					// замещение базового метода для правильной обработки нажатия по тэгу
					case "call":
						this.callDriver(primaryColumnValue);
						break;
					default:
						this.callParent(arguments);
						break;
				}
			},
			callDriver: function(recordId) {
				//функция-обработчик
			}
		}
	};
});

Попробую подробнее описать задачу.

В разделе "Лиды" в реестре есть зеленые кнопки "Квалифицировть" и т.д. наряду с "Открыть" "Копировать" и т.д.

Мне нужно чтобы при нажатии этих кнопок запускались мои собственные процессы. Например при клике на кнопку "Квалифицировать" мне нужно запустить свой процесс "SellsLeadProcessContact".

Вот код, который у меня получился:

Кнопка:

				{
					"operation": "insert",
					"name": "DataGridActiveRowQualificationProcessAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"caption": {"bindTo": "getQualificationProcessButtonCaption"},
						"tag": "continueQualify",
						"iconAlign": Terrasoft.controls.ButtonEnums.iconAlign.RIGHT,
						"imageConfig": resources.localizableImages.QualificationProcessActionImage,
						"classes": {"textClass": "ts-grid-image-action"},
						"visible": {"bindTo": "getIsQualificationStageActive"}
					}
				}

Обработка нажатия:

				onActiveRowAction: function(buttonTag) {
					if (buttonTag === "continueQualify") {
						this.continueQualify();
					} else {
						this.callParent(arguments);
					}
				},

Функция запуска процессов в зависимости от статуса лида

				continueQualify: function(id) {
					var qualifyStatusId = this.getQualifyStatus(id);
					var qualifyStatus = LeadConfigurationConst.LeadConst.QualifyStatus;
					var LeadId = this.get(id);
					var processLeadContact = {
						sysProcessName: "SellsLeadProcessContact",
						parameters: {
							LeadId: LeadId
						}
					};
					var processLeadInformation = {
						sysProcessName: "SellsLeadProcessInformation",
						parameters: {
							LeadId: LeadId
						}
					};
					var processLeadMeet = {
						sysProcessName: "SellsLeadProcessMeet",
						parameters: {
							LeadId: LeadId
						}
					};
					if (qualifyStatusId === qualifyStatus.Qualification) {
						this.runProcess(processLeadContact.sysProcessName, processLeadContact.parameters, this);
					}
					if (qualifyStatusId === qualifyStatus.Distribution) {
						this.runProcess(processLeadInformation.sysProcessName, processLeadInformation.parameters, this);
					}
					if (qualifyStatusId === qualifyStatus.TransferForSale) {
						this.runProcess(processLeadMeet.sysProcessName, processLeadMeet.parameters, this);
					}
					return "";
				},

В бизнес процессе создал параметр:

222

В итоге процессы не запускаются.

В консоли при клике на кнопку выдает 3 строки ошибки:

Ошибка 1
POST https://sells.bpmonline.com/0/DataService/json/SyncReply/SelectQuery 500 (FormatException)

Ошибка 2
Uncaught Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).

Ошибка 3
user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
file: https://sells.bpmonline.com/0/core/e8b5149b83cf4b4da75b8dc1338afb83/com…
line: 600
message: Uncaught Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).

Весь код схемы в приложении

Помогите пожалуйста с проблемой. Уже 3 дня прошло с момента ее возникновения.

Спасибо!

Добрый день!

Насколько я понял, речь идет о странице раздела.

В этом случае получение идентификатора записи с помощью функции this.get(id) не сработает:

var LeadId = this.get(id); //неправильно

Ошибка ниже как раз и говорит о том, что this.get(id), вероятнее всего, возвращает undefined:

message: Uncaught Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

Получайте Id следующим образом:

var LeadId = this.get("ActiveRow");

Все, получилось. Но ошибка была не только в этом.

Строка запуска процесса была написана так:

this.runProcess(processArgs.sysProcessName, processArgs.parameters, this);

А когда заменил спереди "this" на "ProcessModuleUtilities", то процесс запустился.

ProcessModuleUtilities.runProcess(processArgs.sysProcessName, processArgs.parameters, this);

Спасибо большое за помощь!

Вопрос снят

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

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

Стоит задача в invoiceSection в грид для каждой записи добавить 2 собственных кнопки "печать 1" и "печать 2", которые будут открывать 2 различных отчета.
Также необходимо либо подменить отчет, который печатается по кнопке печать, либо скрыть её.

Подскажите, пожалуйста, как можно реализовать данную задачу?

Нравится

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

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

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

Рекомендации предоставлены в дублирующемся топике

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

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

Стоит задача в invoiceSection в грид для каждой записи добавить 2 собственных кнопки "печать 1" и "печать 2", которые будут открывать 2 различных отчета.
Также необходимо либо подменить отчет, который печатается по кнопке печать, либо скрыть её.

Подскажите, пожалуйста, как можно реализовать данную задачу?

Нравится

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

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

Здравствуйте, Александр!
Отчеты регистрируются в справочнике "Печатные формы". Базовая кнопка добавляется следующим образом:

			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "DataGridActiveRowPrintAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"style": Terrasoft.controls.ButtonEnums.style.GREY,
						"caption": {"bindTo": "Resources.Strings.PrintRecordGridRowButtonCaption"},
						"tag": "print"
					}
				}
			]/**SCHEMA_DIFF*/

Добавляйте свои по аналогии.
Обработка нажатия определяется в методе "onActiveRowAction" в BaseSectionV2:

				onActiveRowAction: function(buttonTag, primaryColumnValue) {
					switch (buttonTag) {
						case "edit":
							this.editRecord(primaryColumnValue);
							break;
						case "copy":
							this.copyRecord(primaryColumnValue);
							break;
						case "delete":
							this.deleteRecords();
							break;
						case "print":
							this.printRecord(primaryColumnValue);
							break;
						case "processEntryPoint":
							this.onProcessEntryPointGridRowButtonClick();
							break;
					}
				},
Показать все комментарии

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

На консоли "TSBPMOnle ServiceDesk" эст такая кнопка "Соединение". (прик. файл "01.jpg")
Понятно что, это кнопка предназначена для указание нынешнее состояние "Пользователя".
Но интересна как она работает. То есть например, если я выбрала состояние "Активен",
как другие пользователи увидит мой этот статус?

Заранее спосиба за ответь

С уважением,
Гюнель Рустамова

Нравится

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

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

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

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

Здравствуйте, помогите решить задачу!
Нужно добавить кнопку загрузки файла, кнопку загрузки фото, и кнопку импорта данных!
Два варианта:
1. В карточке продажи в раздел Действия(там где печатные формы).
2. На страницу карточки продаж где то возле текстовых полей.
Буду благодарен за любую информацию.

Нравится

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

Если это в 5 версии, тогда есть контрол UploadFile/Поле загрузки файла, что бы его увидеть возле поиска в левой панеле есть иконка нажми на нее и в самом низу нажми на "Все" в разделе "Элементы"

Юрий, если вопрос по BPMonline 7.0 для решения задачи по загрузке файлов, в качестве примера воспользуйтесь, пожалуйста, реализацией датали «Файлы и ссылки».
Схема FileDetail: методы onFileSelect, onFileLoad.
Код, реализующий добавление кнопки загрузки имеет вид:

buttonsContainer.items = [{
	className: 'Terrasoft.Button',
	id: 'addFileButton',
	caption: resources.localizableStrings.AddFileCaption,
	tag: 'addFileButton',
	fileUpload: true,
	click: {
		bindTo: 'onAddFileClick'
	}
				}];

Связка метода onFileSelect с обработчиком события onAddFileClick:

this.methods.onAddFileClick = function(event) {
	var button = Ext.getCmp('addFileButton');
	button.on('filesSelected', this.onFileSelect, this);
	};
Показать все комментарии

Всем привет!

Сегодня хочу рассмотреть работу кнопки "OK" на формах редактирования. Как всегда, передо мной коробочный вариант Terrasoft XRM 3.3.2

Честно говоря, первый раз открыв приложение, меня удивило "огромное" количество кнопок на формах редактирования... целых 2: "OK" и "Отмена".... если где-то есть больше, значит я что-то до сих пор упустил из виду :smile:

Если с кнопкой "Отмена" все более-менее понятно, то с кнопкой "OK" не очень. ОК = Хорошо, так? Когда мы открываем форму контрагента, и что-то меняем, нам нужно нажать кнопку "Хорошо" или все же лучше иметь кнопку "Сохранить"? Какое из 2-х названий более всего отражает смысл того, что будет происходить в дальнейшем? К счастью, поменять Caption кнопки базового окна редактирования с "OK" на "Сохранить" довольно просто. Сделать это можно в сервисе wnd_BaseDBEdit.

Но это еще не все...
Часто пользователи открывают форму чтобы просто посмотреть какую-то информацию, которой нет в гриде. После просмотра, 99,9% пользователей нажимают какую кнопку? Правильно - "ОК".
А теперь посмотрим, что при этом происходит: а происходит то, что запись сохраняется в БД. И мы видим, что поменялась дата изменения, а так же поле "Изменил". Но ведь никто ничего не менял - просто посмотрел! Тем не менее, запись сохранилась в базе, упали новые записи в логи, сработала интеграция и пакет с апдейтом полетел в другую систему... А Вася не поймет, почему Петя редактировал запись его контрагента, например, и что он в итоге поменял, когда в истории никаких изменений :)

Как с этим безобразием бороться:
1) В базовом функционале есть функция, которая определяет, были ли внесены изменения в список полей. К сожалению, если потребуется проверить все поля, то в коробочной реализации придется все их и перечислить, что не айс. Допиливаем функционал скрипта scr_DB

function GetFieldsValuesAreChanged(Dataset, DataFieldNames) {
        var DataField;
        if(!IsEmptyValue(DataFieldNames)){
                for (var i = 1; i arguments.length; i++) {
                        FieldValue = Dataset.DataFields(arguments[i]);
                        if (FieldValue.ValueIsChanged) {
                                return true;
                        }
                }
        } else {//Проверяем все поля на изменения если не указан список конкретных полей
                for (var i = 1; i Dataset.DataFields.Count; i++) {
                        FieldValue = Dataset.DataFields.Items(i);
                        if (FieldValue.ValueIsChanged) {
                                return true;
                        }
                }
        }            
        return false;
}

2) А теперь нужно проверку "А было ли что-то изменено?" вставить перед вызовом метода Dataset.Post() Для этого берем скрипт scr_BaseDBEditUtils и добавляем в функцию сохранения наш функционал:

function SaveChanges(BaseDBEdit, Window) {
        var AddNewRecordOnPage = (BaseDBEdit.Dataset.State == dstInsert);
        Window.Attributes('IsAppend') = (BaseDBEdit.Dataset.State == dstInsert);
        Window.Attributes('RecordID') = BaseDBEdit.RecordID;
        if(GetFieldsValuesAreChanged(BaseDBEdit.Dataset))//Сохраняем запись только если что-то реально поменялось
                var PostResult = BaseDBEdit.Dataset.Post();
        else
                var PostResult = 1;
        Window.Attributes('AddNewRecordOnPage') =
                (AddNewRecordOnPage && PostResult > 0);
        var Result = ((PostResult == 1) || (BaseDBEdit.RecordAlreadySaved));
        return Result;
}

Запускаем приложение - и "О чудо!" - можно сколько угодно открывать формочки, и нажимать кнопку "ОК" (если вдруг не всем моральные устои позволяют переименовать ее заголовок в "Сохранить"). При этом пользователь чувствует себя свободно и легко, т.к. никогда не станет "папой" просто потому, что открыл форму чтобы посмотреть данные :smile:

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

Нравится

Поделиться

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

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

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

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

Террасофт вер. 3.2.
А администраторе по кнопке "сохранить" (изображение дискеты слева сверху) происходит запись какого-либо сервиса в базу данных.
Появилась потребность получить доступ к обработчику события нажатия этой кнопки. Как это можно сделать?

Спасибо.

Нравится

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

Владислав, кнопку «Сохранить» в Terrasoft Administrator обрабатывает ядро, поэтому получить доступ к обработчику кнопки из конфигурации нет возможности.

Напишите триггер на tbl_Service, если есть большое желание.
По нажатию дискетки в TSAdmin сервис сериализуется в колонку XMLData.
Поделитесь задачей для которой понадобились данные действия

Понятно. Спасибо.

А задача такая: в зависимости от некоторых условий (например, смотря кто вошел в систему) по разному сохранять сервис. И,соответственно, сохраняемые данные будут разными. А решается это всё на этапе между нажатием "сохранить" и запросом к БД "INSERT INTO" :) Так вот.

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

Здравствуйте!
У меня во вновь созданном разделе без видимых причин не активизируется кнопка "Добавить", хотя данные в реестре есть, показываются, корректируются, и т.д. Ввод новых данных из-за этого невозможен.
Привожу код скрипта Workspace. Скрипт создан по материалам статьи, приведеннной на сайте. Таким образом создал уже не один раздел, но с этим проблемы. Отладкой проверял, код, изменяющий статус кнопки не выполняется.

//-----------------------------------------------------------------------------
// scr_TechViewActWorkspace
//-----------------------------------------------------------------------------

var TechViewActWorkspace = new Object();

function InitializeGridData() {
var GridWindow = wndGridData.Window;
PrepareGridWindow(GridWindow, dlTechViewAct);
PrepareCommonDetails('ActID');
}

function Initialize() {
InitializeGroups('tbl_TechViewActGroup', 'ds_TechViewActInGroup', 'ActID');
InitializeGridData();
//InitializeDatePeriod();
OpenGroupsDataset();
}

function RefreshTechViewAct() {
RefreshWorkspace();
}

function InitializeWorksDetail() {
TechViewActWorkspace.WorksWindow = wndWorksDetail.Window;
SetAttribute(TechViewActWorkspace.WorksWindow,
'ParentItemFieldName', 'ActID');
SetAttribute(TechViewActWorkspace.WorksWindow,
'WorkspaceGridDataset', BaseWorkspace.GridDataset);
TechViewActWorkspace.WorksWindow.Prepare();
TechViewActWorkspace.WorksDataset = TechViewActWorkspace.
WorksWindow.ComponentsByName('dlData').Dataset;
}

function RefreshWorksDetail() {
if (TechViewActWorkspace.InitializeWorksFlag != true) {
InitializeWorksDetail();
TechViewActWorkspace.InitializeWorksFlag = true;
}
var ActID = BaseWorkspace.GridDataset.ValAsGUID('ID');
SetAttribute(TechViewActWorkspace.WorksWindow, 'ParentItemID',
ActID);
RefreshDetailData(BaseWorkspace.GridDataset, 'ID',
TechViewActWorkspace.WorksDataset, 'ActID');
}

function RefreshDetails() {
if (dlTechViewAct.Dataset.State == dstInactive) {
return;
}
if (pcDetails.ActivePage.Name == pgGroupsDetail.Name) {
RefreshGroupsDetail(BaseWorkspace, wndGroupsDetail,
'ActID', 'ds_TechViewActInGroup', 'tbl_TechViewActGroup', "Акт техосмотра");
} else {
if (pcDetails.ActivePage.Name == pgWorksDetail.Name) {
RefreshWorksDetail();
}
}
}

// --------------------------------------------------------
// Event handlers
//

function wnd_TechViewActWorkspaceOnPrepare(Window) {
Initialize();
}

function dlGroupsOnDatasetAfterPositionChange(Dataset) {
scr_BaseWorkspace.dlGroupsOnDatasetAfterPositionChange(Dataset);
RefreshWorkspace();
}

function dlTechViewActOnDatasetBeforeOpen(Dataset, DoOpen) {
var IsInSingleRowMode = GetIsInSingleRowMode();
if (IsInSingleRowMode != true) {
ApplyStandardWorkspaceFilter();
}
}

function wnd_TechViewActWorkspaceOnNotify(ScriptableService, Sender, Message, Data) {
if ((Message == MSG_GROUPSCHANGED) &&
(pcDetails.ActivePage.Name == pgGroupsDetail.Name)) {
RefreshDetails();
return;
}
scr_BaseWorkspace.wnd_BaseWorkspaceOnNotify(ScriptableService, Sender, Message, Data);
}

function dlTechViewActOnDatasetAfterPositionChange(Dataset) {
RefreshDetails();
}

function dlTechViewActOnDatasetRefreshRecord(Dataset, KeyValue, AddNewRecordOnPage) {
if (AddNewRecordOnPage) {
AddItemInGroup(BaseWorkspace.GroupsDataset, 'ds_TechViewActInGroup', KeyValue, 'ActID');
RefreshDetails();
}
}

function pcDetailsOnChangeActivePage(Pages) {
RefreshDetails();
}

Нравится

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

Проверьте следующее:
1) есть ли у пользователя права на добавление записей в этом разделе (через Администрирование)
2) установлена ли в датасете раздела галки "Добавление" и "Генерировать запрос на вставку"

Возможно в скрипте родительского окна прописано ограничение на количество кнопок

1. Пользователь supervisor.
2. Обе галки включены.

Какое окно считается родительским? Для окон этого раздела я скрипт составлял сам и не представляю, где это ограничение можно прописать.

А в скрипте к гриду (wnd_TechViewActGridAreaScript) никаких действий с кнопками не производится?

Нет. Скрипт простой:

//-----------------------------------------------------------------------------
// scr_TechViewActGridArea
//-----------------------------------------------------------------------------

function Initialize(Window) {
SetAttribute(Window, 'EditWindowUSI', 'wnd_TechViewActEdit');
SetAttribute(Window, 'ParentItemFieldName', 'ActID');
}

// --------------------------------------------------------
// Event handlers
//

function wnd_TechViewActGridAreaOnPrepare(Window) {
Initialize(Window);
wnd_BaseGridAreaOnPrepare(Window);

}

Тогда надо проверить scr_BaseGridArea и scr_BaseGridAreaUtils - не вносились ли туда изменения?
Также можно поискать по тексту всех скриптов подстроку "btnAdd.IsEnabled"

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

Проблема: Не отображается кнопка экспорт в Excel у одного из пользователей. Системные настройки в порядке, у других пользователей все отображается. Попытка залогиниться тем же пользователем с другого компьютера - кнопка на месте.

Таким образом, выяснили, что проблема в компьютере. Система стоит давно, прежде проблем не наблюдалось. В системе установлен MS Office 2010

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

Добавить его в конфигурацию:

1. Войти в TSAdmin.exe;
2. Найти поиском компонент scr_MSOfficeUtils и открыть его двойным кликом либо по Enter;
3. Внутри скрипта найти процедуру GetIsMSOfficeApplicationIstalledViaRegistry и в перечислении версий Excel занести полный список: SupportedMSOfficeVersionArray = new Array('14.0', '12.0', '11.0', '10.0', '9.0');
Сделать это нужно единоразово и работать будет для всех пользователей, которым позднее будет установлен MSOffice 2010. Загружать конфигурацию через TSAdmin.exe можно с любого компьютера.

Нравится

Поделиться

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