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

function GetCanReadTableGroup(Dataset) {
var Result = true;
if ((Dataset.ServiceTypeCode != 'MemoryDataset') && !Connector.CurrentUser.IsAdmin) {
var Module = System.ExtractUSIModule(Dataset.USI);
Result = System.GetHasLicense(Module);
if (Result) {
var TableGroup = GetParentTableGroup(Dataset);
if (TableGroup){
Result = Connector.CurrentUser.GetCanReadTableGroup(TableGroup);
}
}
}
return Result;
}

Именно на "ServiceTypeCode".
Версия приложения 3.3.2.311.
В чем может быть проблема?
И каким образом можно отменить событие по двойному нажатию?

Нравится

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

скорее всего, у вас в функцию не передается Dataset

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

Здравствуйте.
Необходимо переопределить событие grdDataOnDblClick элемента grdData окна wnd_CallGridArea. Для этого открываем сервис wnd_CallGridArea, выбираем визуальный элемент grdData.
Переходим на события элемента и двойным кликом мыши нажимаем на событие grdDataOnDblClick
После чего будет создана функция :
function grdDataOnDblClick(Control) {
//TODO
}
Сохраняем сервисы scr_CallGridArea, wnd_CallGridArea

После чего будет создана функция :
function grdDataOnDblClick(Control) {
//TODO
}
Сохраняем сервисы scr_CallGridArea, wnd_CallGridArea

Деталь загружается, вместе со звонком. Это конечно не критично, но лучше бы данную информацию подгружать по желанию пользователя, т.е. допустим по нажатию на определенную кнопку, выдавалось окно данной детали с данными. Возник новый вопрос, как можно передать ContactID из dldata и отфильтровать по нему, в новом окне, данные (окне детали)?

А как открываете окно, с помощью ShowEditWindowEx?

Тогда примерно так. В окне, где кнопка:

var ContactID = dlData.Dataset('ContactID');
...
var Attributes = GetNewDictionary();
...
Attributes.Add(ContactID',ContactID);
...
ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues);

В окне, которое открывается:

var ContactID = GetAttribute(Self, 'ContactID');

И затем по нему фильтруем.

Александр, редактировать данные мне не нужно. Эти данные только для отображения, дополнительная информация по абоненту из других таблиц. В этих таблицах есть ContactID, по которому будет осуществляться фильтрация. Если я правильно понял, var ContactID = GetAttribute(Self, 'ContactID') добавлять на событие OnPrepare?

Этого недостаточно, нужно ещё наложить фильтр. Не пробовал, но примерно так:

ApplyDatasetFilter(dlData.Dataset, 'ContactID', ContactID, true);

Но надо проверить, как обычно делают такую фильтрацию на открытии.

Александр, все получилось. Спасибо за помощь.

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

Настроил запрос для шаблона сообщения для отправки уведомления по e-mail.

Запрос - Счет-Продукты в Счете.

Все работает, но отображаются данные в письме только для Мастера, для Детали не отображаются.

Пробовал разные варианты формата макросов для отображения данных Детали, но Деталь в письме так и не отображается (Продукты в Счете). Хотя как видно на скриншоте в запросе все отображается. Что некорректно?

Нравится

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

Та же проблема, обошли костылем

Так ведь шаблоны можно редактировать не вручную, а по вкладке Add-Ins в редакторе письма. Если в Аутлуке включена интеграция с Террасофтом, там есть кнопки "Макросы" и "Детали".

У меня при попытке сгенерировать макрос для детали в ячейку таблицы написало:

<#Контакты в задаче.Номер>

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

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

Добрый день!
Появилась необходимость сделать кликабельную ссылку в карточке Продажи (Террасофт 3.4.0.48.).
Создала поле, в которое пользователь вводит ссылку. К этому полю прикрепила кнопку, по нажатию на которое выполняется действие amiOpenLink. Обра

function amiOpenLinkOnExecute(ActionMenuItem, Sender) {
var URLName = dlData.Dataset.Values('TenderTarget');
URLName = (URLName != null) ? URLName : '';

 var browser = new ActiveXObject("InternetExplorer.Application");
    browser.Navigate(URLName);
    browser.Visible = true;    
}

Этот вариант решения работает хорошо, но я бы хотела открывать не строго в InternetExplorer, а в браузере по умолчанию. В Мозиле или в хроме, например. Если ссылка прикрепляется как файл, то именно это и происходит. Однако, выцепить коды какими именно открывается браузер по умолчанию у меня не получилось. Нашла на форуме строку:

 var browser = new ActiveXObject("Shell.Explorer.2");

Но она не срабатывает и выдает ошибку.

Нравится

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

используйте

System.OpenFile(URL, 1);

система сама разберется, что это URL, а не FilePath и откроет браузер по-умолчанию

"Андросов Дмитрий" написал:
System.OpenFile(URL, 1);

Спасибо! Не срабатывал этот вариант оттого, что писала для проверки в поле yandex.ru, а ссылку нужно было писать http:\yandex.ru или www.yandex.ru.

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

Добрый день. У нас на версии Terrasoft 3.1 сегодня при попытке соединения с Outlook возникла такая ошибка:

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

Нравится

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

Здравствуйте.
Однозначно ответить сложно, но точно - проблема локальная. Возможно Вы удаляли папку Cache при запущенном Outlook и Terrasoft. Далее при каких-то действиях система не находит эту директорию и возникает такое сообщение. Попробуйте проверить, что отсутствуют процессы Outlook и Terrasoft, переименовать папку Cache (произвольно) и выполнить действия заново.

Если мне не изменяет память, то папки Cache в террасофт 3.1 (в программ файлз\террасофт) вообще быть не должно. На всякий случай создали (ее не было), но она пустая.

А напомните, где в этой версии чистится кеш?

Папка Cache в 3.1 находится в директории, куда установлен Terrasoft. Создавать руками её не нужно. Она должна автоматически создаться. Попробуйте её удалить и перезапустить приложение. Возможно у Вас какие-то проблемы с правами доступа. Групповые политики, например.

Все получилось, спасибо

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

Поставлена следующая задача:

Карточка Аудит деталь Объекты (в текущем элементе) поле
В зависимости от Тип объекта:
- поле Контрагент, если выбран тип объект проверки Контрагент;
- поле Подразделение, если выбран тип объекта проверки Подразделение;
- поле Объект-процесс, если выбран тип объекта проверки Процесс
Первой выводим запись с «Текущее»=Истина

вроди бы всё очень просто,но документация по FastReport очень не доходчива,в связи с этим прошу помочь мне написать с нуля скрипт с коментариями,или дать ссылку на что то подобное,чтобы я мог на примере этого в дальнейшем разбираться со скриптами и выполнять поставленные мне задачи

Нравится

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

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

Нравится

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

Можно попробовать создать представление(view) с именем tbl_OfferingInMovementLog, в котором прописать

select * from myNewDB.dbo.tbl_OfferingInMovementLog

Также прописать триггеры InsteadOfInsert, InsteadOfUpdate для этой вьюхи:

insert into myNewDB.dbo.tbl_OfferingInMovementLog
select * from inserted

А таблицу tbl_OfferingInMovementLog удалить из БД Террасофт, перекинув все данные в копию таблицы в другой базе.

Но, это конечно, так сказать костыль. Просто перенести всю базу нельзя? Или, к примеру, чистить таблицу с логами по JOB'У каждый месяц\пол года\год?

Но, это конечно, так сказать костыль. Просто перенести всю базу нельзя? Или, к примеру, чистить таблицу с логами по JOB'У каждый месяц\пол года\год?

Чистить таблицы логов не получится, т.к. нужно иметь всю историю. С просто перенести всю базу есть некоторые сложности.
Также хотелось бы перенести таблицу tbl_Files, которая на данный момент занимает больше всего места и имеет тенденцию разрастаться в некоторой повышающей прогрессии.
Эту таблицу наверное не получиться перенести с помощью вышеприведенного "костыля"?

Других вариантов переноса таблиц нет?

Если перенести некоторые таблицы в отдельную файловую группу, то по идее, это делается на урове SQL сервера, и Terrasoft даже не должен это заметить

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


Эту таблицу наверное не получиться перенести с помощью вышеприведенного "костыля"?

получится.

Здравствуйте.
Что касается переноса таблицы tbl_Files с помощью, вышеописанного, механизма то, по идее, для базы не должно быть разницы в том, что это за таблица. По поводу альтернативной файловой группы - вариант, но это уже чисто администрирование сервера БД и нужно проверять. Это подойдёт, если проблема с местом на диске. Но если всё это рассматривается по причине использования SQL Express и база упирается в предельный объём, то вариант с файловой группой не поможет, так как СУБД всё равно будет видеть базу как одно целое и соответственно будет считать её объём, как сумму размера файловых групп.
Вынести часть таблиц в отдельную базу не получится в виду архитектуры приложения (при подключении указывается одна база данных).

по поводу переноса файлов (tbl_Files) из БД, напомню, есть вариант с Filestream http://www.community.terrasoft.ru/forum/topic/7454

"Котенко Александр" написал:Вынести часть таблиц в отдельную базу не получится в виду архитектуры приложения (при подключении указывается одна база данных).

Были ADO-подключения отдельных таблиц?

Да, можно и через ADO. Но инсерты, апдейты нужно будет все ровно прописывать руками. Лично мне уж проще через вьюху+триггеры.

А повлияет ли перенос файлов + логи в другую БД с помощью вьюхи+триггеры на увеличение быстродействия клиента в целом (или наоборот быстродействие замедлится)? Или же значение быстродействия не зависит, где будут находится эти таблицы - в общей БД или в другой.
И какие есть возможности увеличения быстродействия Клиента террасофт? Оптимизация запросов, увеличение оперативной памяти на сервере/клиенте ...или ещё что-то?

"Alex GF" написал:Оптимизация запросов, увеличение оперативной памяти на сервере/клиенте

Оптимизация скриптов, датасетов, запросов, индексов, представлений, увеличение оперативной памяти и производительность ЦП и файловой системы на сервере и клиенте.

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

Доброго времени суток, коллеги!

Возникла хотелка сохранять файлы из соответствующей детали не поштучно, а кучей - все выделенные. Вариант https://community.terrasoft.ru/forum/topic/7719 не помог, видимо из-за разницы в платформах.
Как правильно реализовать на ServiceDesk 3.х?

Нравится

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

Должно работать на SD 3.x.
Почему у вас не получилось? Какие то ошибки? Предоставьте, пожалуйста, более подробную информацию.

Никаких ошибок, но и действий никаких не происходит. Оно должно отработать на Файлы - Операции - Сохранить в файл?

По идее да. Но нужно выделить через Ctrl несколько файлов на детали. Если будет выделен один - один и сохранится.

Выяснил, что не проходит проверка
if (Dat('ItemTypeID') != ft_File) {
continue;
}
и оно улетает на следующий круг цикла

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

Dat('ItemTypeID')

при сохранении именно файла, и если это значение не совпадает с ft_File - замените.

Не пойму, как заполучить Dat('ItemTypeID'). Инструкция Log.Write(1, Dat('ItemTypeID')) падает на ошибке типов

Какой у вас отладчик стоит?

Боюсь, что никакого, потому и ковыряю через запись в лог :-) Или что-то подтянулось при установке ServiceDesk, но не знаю как это запустить.

Есть возможность поставить Visual Studio? Думаю, все ровно пригодится, если будете дорабатывать конфигурацию в будущем.

Если поставите, то перед строкой
if (Dat('ItemTypeID') != ft_File) {

наберите

debugger;

и посмотрите что же все таки в Dat('ItemTypeID').

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

HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings

JitDebug = 1

переустановил SreviceDesk с предлагаемыми дебаггерами. Теперь на точке "debugger;" открывается microsoft script debugger. Как в нём значение переменной посмотреть?

Здравствуйте.
Посмотрите, пожалуйста, рекомендации по использованию "debugger", перейдя по ссылке: file:///C:/Windows/help/debug/SDbug.htm

Александр, спасибо за подсказку!
Dat('ItemTypeID')=null после Dat.Open()!
Почему? IDs[i] не пуст и вполне реальный.

Андрей, Dataset.RecordsCount возвращает 1?
Если да - значит либо колонка как-то по другому называется, либо действительно у вас в колонке "Тип файла" пусто. Может вы их как-то нестандартно заливали?

пс: чтобы наверняка, выполните SELECT на сервере.

Что-то вроде (покажет все файлы для контрагента горсовет)

SELECT ItemTypeID from tbl_Files
where FileID in (select FileID from tbl_FileInAccount where AccountID in (select ID from tbl_Account where Name = 'ОАО Горсовет'))

А null там потому, что Dat открывается пустым. А пустой он потому, что в sq_FileInItem есть связка
INNER JOIN
[dbo].[tbl_FileInAccount] AS [FileInItem] ON [FileInItem].[FileID] = [tbl_Files].[ID]
На каком-то этапе [dbo].[tbl_FileInAccount] должно было подмениться на [dbo].[tbl_FileInIncident]?
Собственно, по тексту заменил
var Dat = Services.GetNewItemByUSI('ds_FileInItem');
на
var Dat = Services.GetNewItemByUSI('ds_FileInIncident');
И счастье получил. Но ведь это не правильно. При сохранении файлов из задачи или ещё откуда-то косяк будет.

Андрей, в более новых версиях уже есть массовое сохранение. Вот коробочная функция:

function SaveToFile(){
	var Dataset = FilesDetailGridArea.Dataset;
	var SelectedIDs = grdData.SelectedIDs;
	if (SelectedIDs.Count == 0) {
		return;
	}
	var Message;
	var InitialDir = EmptyStr;
	var FileName = System.CreateObject('TSObjectLibrary.Value');
	if (SelectedIDs.Count > 1) {
		var WindowCaption = "Сохранить файлы";
		var DirectoryName = System.CreateObject('TSObjectLibrary.Value');
		if (!(System.SelectDirectory(WindowCaption, InitialDir, 
			DirectoryName))) {
			return;	
		}
		var SavedFilesCount = 0;
		Dataset.DisableEvents();
		for (var i = 0; i < SelectedIDs.Count; i++) {
			var RecordID = SelectedIDs(i);
			Dataset.Locate('ID', RecordID);
			var FileType = GetFieldValueFromDisabledField(Dataset, 'ItemTypeID');
			FileName.Value =
				GetFieldValueFromDisabledField(Dataset, 'Link');
			if (!SaveToFileByFileType(Dataset, RecordID, FileName, 
				DirectoryName.Value, FileType)) {
				continue;
			}	
			SavedFilesCount++;
		}
		Dataset.EnableEvents();
		Message = FormatStr(FilesSavedMessage, SavedFilesCount, 
			SelectedIDs.Count);
		ShowInformationDialog(Message);
	} else {
		FileName.Value =
			GetFieldValueFromDisabledField(Dataset, 'Link');
		if (!SaveToFileByFileType(Dataset, FilesDetailGridArea.RecordID, 
			FileName, '', FilesDetailGridArea.FileType)) {
			return;
		}	
		if (FilesDetailGridArea.FileType != ft_File) {
			return;
		}
		Message = FormatStr(OpenFileForEditMessage,	FileName.Value);
		if (ShowConfirmationDialog(Message) == mrYes) {
			if (!OpenFileWithFullAccess(FileName.Value, true, ft_File)) {
				return;
			}
		}
	}
}
 
function SaveToFileByFileType(Dataset, RecordID, FileName, FilePath, FileType) {
	if (!FilePath) {
		FilePath = '';
	}	
	switch(FileType) {
		case ft_File:
			var FileExtension = '.' + ExtractFileExtension(FileName.Value);
			var FileFilterValue = '*' + FileExtension;
			FileFilterValue = FileFilterValue + '|' + FileFilterValue;
			var WindowCaption = "Сохранить файл";
			var InitialDir = EmptyStr;
			var IsSaving = true;
			if (FileName.Value == EmptyStr) {
				return false;
			}
			if (FilePath != '') {
				FileName.Value = FilePath + '\\' + FileName.Value;
			} else 
				if (!(System.PromptForFileName(FileName, 
					FileFilterValue, FileExtension,	WindowCaption, 
					InitialDir, IsSaving))) {
					return false;
				}
			var File = LoadFileFromDatabase(RecordID, 
				FileName.Value, false);	    
			if (!File) {
				return false;
			}
			break;
		case ft_Link:
		case ft_FolderLink:
			var FileExtension = 'lnk';
			var FileFilterValue = '*lnk';
			FileFilterValue = FileFilterValue + '|' + FileFilterValue;
			var WindowCaption = "Сохранить файл";
			var InitialDir = EmptyStr;
			var IsSaving = true;
			if (FileName.Value == EmptyStr) {
				return false;
			}
			var DestinationFileName = FileName.Value;
			FileName.Value = ExtractFileNameWithoutExtension(FileName.Value);
			if (FilePath != '') {
				FileName.Value += '.' + FileExtension;
				FileName.Value = FilePath + '\\' + FileName.Value;
			} else 
				if (!(System.PromptForFileName(FileName, 
					FileFilterValue, FileExtension,	WindowCaption, 
					InitialDir, IsSaving))) {
					return false;
				}
			var LinkCaption = ExtractFileNameWithoutExtension(FileName.Value);
			System.CreateFileLink(DestinationFileName, '', 
				LinkCaption, ExtractFilePath(FileName.Value));
			break;
		case ft_URL:
			var FileExtension = 'url';
			var FileFilterValue = '*url';
			FileFilterValue = FileFilterValue + '|' + FileFilterValue;
			var WindowCaption = "Сохранить файл";
			var InitialDir = EmptyStr;
			var IsSaving = true;
			if (FileName.Value == EmptyStr) {
				return false;
			}
			var URLPath = new String(FileName.Value);
			var Index = URLPath.indexOf('://') == -1 ? 0 : 
				URLPath.indexOf('://') + 3;
			var URLFileName = URLPath.substr(Index, URLPath.length);
			Index = URLFileName.indexOf('/') == -1 ? URLFileName.length : 
				URLFileName.indexOf('/');
			URLFileName = new String(URLFileName.substr(0, Index));
			FileName.Value = URLFileName;
			if (FilePath != '') {
				FileName.Value += '.' + FileExtension;
				FileName.Value = FilePath + '\\' + FileName.Value;
			} else 
				if (!(System.PromptForFileName(FileName, 
					FileFilterValue, FileExtension,	WindowCaption, 
					InitialDir, IsSaving))) {
					return false;
				}
			var URLFileStream = new ActiveXObject('ADODB.Stream');
			URLFileStream.Type = 2;
			URLFileStream.Mode = 3;
			URLFileStream.Open();
			URLFileStream.WriteText("[InternetShortcut]",1);
			URLFileStream.WriteText("URL=" + URLPath,1);
			URLFileStream.Position = 0;
			URLFileStream.SaveToFile(FileName.Value, 2);
			URLFileStream.Close();
			URLFileStream = null;	
			break;	
	}	
	return true;
}

Дмитрий, это был суперский вариант!
Не понятыми остались строки

                Message = FormatStr(FilesSavedMessage, SavedFilesCount, 
                        SelectedIDs.Count);
                ShowInformationDialog(Message);

на них вылетало в дебагер. Прикрыл эти строчки и всё работает!

В этих строках просто выводится сообщение пользователю сколько файлов сохранено. Можете заменить эти 2 строки на:

ShowInformationDialog('Операция завершена. Файлов сохранено: ' + SavedFilesCount);

Да, без завершающего окошка как-то скучно.
В общем, спасибо всем, вопрос изначальный можно считать решенным.
И всё-таки интересно, жесткая привязка tbl_FileInAccount в общей выборке sq_FileInItem - это ошибка, или так задумано?

Так задумано. Она действительно меняется "на лету" в зависимости от раздела, но в инструкции, на которую вы дали ссылку, этот момент не учтен.

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

как записать значение перечисления для заполнения поля 1С?
поле

Нравится

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

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

Проблема все еще актуальна

Какая версия 1с?

Тогда рекомендую поставить утилиту для 8.2:
http://www.community.terrasoft.ru/catalog/3796
А затем используйте совет описанный тут:
http://www.community.terrasoft.ru/forum/topic/12260#comment-52599

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

Итак, Есть ли возможность создания отчета с выборкой данных на основе представлений в бд?
Если да, то как это сделать?

Нравится

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

Здравствуйте, Николь!

Создание отчета на основе представления в БД возможно. Для этого необходимо создать в БД представление. Далее создать в Конфигурации объект, где установить признак для свойства [Представление в БД]:
[IMG]http://s012.radikal.ru/i319/1505/52/ada72265755d.jpg[/IMG]
Для отчета использовать этот объект.
Важно, объект в Конфигурации должен иметь такое же название, как и представление в БД.
Для примера, в системе есть объекты, имя которых начинается на "VW..."

Я так понимаю вопрос по 3.х?
Если да, то в принципе почти также как и в 5.х, 7.х:

создаете сервис таблицы, называете его так, как представление в БД, и _обязательно_ на вопрос "Сохранить изменения в БД?" отвечаете "Нет". Это необходимо, что бы не была создана таблица на уровне БД,

Ну а далее стандартный механизм.

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

Итак, Есть ли возможность создания отчета с выборкой данных на основе представлений в бд?
Если да, то как это сделать?

Нравится

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

Здравствуйте, Николь!

Создание отчета на основе представления в БД возможно. Для этого необходимо создать в БД представление. Далее создать в Конфигурации объект, где установить признак для свойства [Представление в БД]:
[IMG]http://s012.radikal.ru/i319/1505/52/ada72265755d.jpg[/IMG]
Для отчета использовать этот объект.
Важно, объект в Конфигурации должен иметь такое же название, как и представление в БД.
Для примера, в системе есть объекты, имя которых начинается на "VW..."

А где находится этот признак?

Признак появился начиная с версии 5.х. Комментарий выше дан без учета этого нюанса :)))

вот здесь кратенько написано как сделать представление... это для версии 3.х

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