Добрый день!

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

Спасибо!

Нравится

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

Добрый день.

Для корректной работы приложения, укажите базовою валюту в справочнике [Валюты]

Доброго дня, ще одна невідповідність. Чомусь в закупку тягне ціну валюти, замість ціни в гривнях

Добрый день.

Предоставьте PrintScreen [Прайс-лист] продукта. Возможно у Вас валюта в [Прайс-лист] указана в долларах, в таком случае будет выполнен пересчет цены согласно базовой валюты.

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

Коллеги, добрый день.
Имеем следующую проблему:
При копировании из окна браузера текста на армянском языке и вставке его в поле Lookup Data (для поиска адреса) вставляются знаки вопроса вместо текста на армянском.
При вводе на армянском языке с раскладки клавиатуры этого текста - всё нормально.
Вопрос с копированием-вставкой крайне важен, хочется узнать ответ. Спасибо.

Нравится

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

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

Не смог повторить это поведение - с Google Translate все корректно копируется. Может быть все зависит от версии - проверял на 7.6.0.

Верю что норм на 7.6.0, гуд реклама:)
Интересует 3.3.2.1

Такое ощущение что не даёт сохранить текст на армянском в ANSI

Для линейки 3.Х полноценная поддержка Unicode появилась в 3.4.0. При необходимости с 3.3.2 можно обновится до 3.4.0, перезаказать лицензии (платно).

Здорово.
А патч реально какой-то получить для адекватной работы с этим полем?

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

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

Для начала можно проверить на демоверсии, решает ли 3.4.0 Вашу изначальную потребность.

После обновления бинарников с 3.3.2.1 на 3.4.0.178, есть ошибка открытия конфигурации при входе scr_TaskUtils объект System уже создан.
Конфигурация у нас нетиповая, какие можете дать рекомендации?
Обновить хотим только ядро для поддержки юникода.

Можете использовать отладку и понять, в каком именно месте скрипта scr_TaskUtils возникает проблема. В зависимости от этого и смотреть, это сбой в стандартной логике или в доработках.

Благодарю. Где могу посмотреть порядок открытия конфигурации (в плане загрузки скриптов)?

Чтобы посмотреть и отредактировать скрипты, нужно вместо TSClient.exe запустить TSAdmin.exe, в дереве справа найти нужный скрипт (вручную или поиском).

Посмотрите по коду scr_TaskUtils, как там используется System. У меня встречаются только System.MessageDialog и System.Now. Может, у Вас есть ещё что-то.

Ещё, после запуска на 3.4 при добавлении лота в заказ вылезает ошибка "Для поля "CreatedByName" нет поля в источнике данных. Что это может быть? Дебаггер отправил на метод Scr_DB AppendRecordInDataset(Dataset, FieldNames, FieldValues, DontDisableEvents), но там также ничего не менялось, может в 3.4 этот метод отличается?
Мой:

function AppendRecordInDataset(Dataset, FieldNames, FieldValues, DontDisableEvents) {
	if (FieldNames.length != FieldValues.length) {
		throw DifferentElementCountInNameAndValueArrays;
	}		
	if (!DontDisableEvents) { 
		Dataset.DisableEvents();
	}
	try {
		Dataset.Append();
		Dataset.ValAsGUID('ID') = Connector.GenGUID();
		var Field;          
		for (var i = 0; i < FieldNames.length; i++) {
			Field = Dataset.DataFields(FieldNames[i]); 
			if (Field){
				Dataset.Values(FieldNames[i]) = FieldValues[i];
			}			
		}
		Dataset.Post();
	}
	finally {			 		
		if (!DontDisableEvents) { 	
			Dataset.EnableEvents();	
		}
	}
}		

Бред или нет, но проблема только в одном датасете, он после Append и постинга в себя он ругается на то что для поля для отображения нет поля в источнике данных. Если отдельно взять и вместо справочного поля создать два текстовых - один для ИД, второй для Name, то всё нормально. Как может такое быть, что один конкретный датасет, после перехода только ядра на версию 3.4 перестал себя вести прилично? Не понимаю...Сервис датасета прикладываю.

Добрый день.
Для начала необходимо убедится, что в сервисе tbl_Partable (логичное его имя) присутствует поле CreatedByID.
В сервисе scr_Partable включены поля (Всегда выбирать в запросе):

  • CreatedByID
  • CreatedByName

Такие сообщение появляются только в том случае, когда поле не участвует в запросе, т.е. его отключили. Отключили в сервисе запроса или с помощью одной из функции DisableAllColumns или EnableColumns(с параметром false)

Уже делал.
Удивительно, но проблема только с одним датасетом и только после перехода на новое ядро.
Кэш чистил.
Проблема осталась.

Ещё попробуйте пересохранить сервисы, связанные с этой таблицей: tbl, sq, ds. Что-то в них измените, потом верните как было и нажмите сохранение.

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

Добрый день! Подскажите пожалуйста, как разграничить права группе пользователей на кнопку "Копировать" в каком-нибудь определенном разделе? Нужно сделать её недоступной.

Нравится

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

Добрый день!

Мне нужно ограничить доступ пользователям на кнопку "Копировать" в одном из разделов, т.е. сделать её недоступной определенной группе пользователей. Подскажите пожалуйста каким образом можно это реализовать?

Нравится

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

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

Например, в scr_BaseGridAreaUtils есть базовая функция выдачи прав на кнопки UpdateButtonsByDataset. Там выставляется доступность кнопок.

Можно в этой функции проверить Dataset на нужный раздел, затем проверить вхождение пользователя в группу (см. в функции IsUserInGroupExists в scr_UsersGroupsGridArea) и включить или выключить кнопку.

Другой вариант, переопределить события dlDataOnDatasetAfterOpen, dlDataOnDatasetAfterDelete, dlDataOnDatasetAfterPost, dlDataOnDatasetRefreshRecord в нужном разделе и кроме базовой логики доступности кнопок добавить свою для включения этой кнопки.

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

Коллеги, приветствую.
Знаю, что не предусмотрено, знаю что много и долго, но...
Какие имеются возможности для полного перевода клиента 3.3.2 Terrasoft CRM с возможностью смены языков "на лету"?
Необходима реализация модуля переводов как названий кнопок, полей, элементов интерфейса, так и справочных значений, с возможностью выбора языков в настройках клиента.
Некоторые идеи есть, возможно кто-либо встречался уже с этой задачей? Очень будет интересно послушать пути решения :-)

Нравится

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

В Лабитеке решали такой вопрос. Можете попробовать связаться с ними.

Интересуют непосредственно варианты перевода справочников:)

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

Да никто не просит.
Я и спрошу, и разработаю:)
Вопрос был к тем, у кого был опыт и идеи для дальнейшей дискуссии по интересам.

По справочникам (правда, в другом продукте) делали дополнительную таблицу
-ObjectId
-RecordId
-LanguageId
-Name

И View для каждого справочника, который в зависимости от языка пользователя возвращал название для данной записи нужного объекта на выбранном языке.
И работали уже не с таблицами, а с View

Соответственно, в каждом справочнике деталь с языками и названиями

Ещё, говорят, были мысли о китайской локализации. Но вовремя одумались, осознав масштаб работ.

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

"Нестеров Артем Валерьевич" написал:Проект интересный, по результатам, либо возникающим вопросам - отпишусь:)

Проект интересный и очень объемный, так что можно блог писать :D

а в bpm'online 7 такой вопрос кто-то решал?

Есть русская версия, есть английская. А как бы объединить, давая пользователям возможность переключаться между интерфейсами?

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

"Демьяник Алексей Олегович" написал:Данная задача будет реализована в версии 7.8.0.

Какая отличная новость для нашего мулти-язычного региона!

Работа кипит.
Нужна функция, которая собирает все названия датасетов окна в массив.

Такой функции, скорее всего, нет. Можете её написать.
Можно по аналогии с функцией GetControlByDataFieldName из scr_DB, только в цикле искать не визуальные компоненты, а даталинки.

function IsDataControl(Control) {
	var DatasetLink = Control.DatasetLink;
	var DataFieldName = Control.DataFieldName;
	return ((DatasetLink != undefined) && (DataFieldName != undefined));
}
 
function GetControlByDataFieldName(Window, DataFieldName) {
	for (var i = 0; i < Window.ComponentCount; i++) {
		Component = Window.Components(i);
		if (IsDataControl(Component)) {			
			if (Component.DataFieldName == DataFieldName) {
				return Component;
			}
		}
	}
	return null;
}

Так как лучше сделать вывод перевода справочников?
Создан один большой общий глобальный справочник для джоина на него остальных -
ID (ид записи)
ItemID (ид записи присоединяемого справочника)
LanguageID (язык перевода)
Name - (Собственно сама строка перевода)

Тут всё понятно, без проблем.
А вот как сделать вывод перевода из этого справочника в необходимом окне, при этом и при этом не потерять стандартный функционал для заполнения - вопрос.
На текущий момент решение (но мне не очень нравится):
1.Джоиним каждый справочник на справочик переводов
2.В каждом переводимом справочнике создаём колоночку(TName, для того, чтобы не убивать стандартный Name из функционала заполнения. Эта колонка нужна для того, чтобы была возможность заджоинить сам справочник на необходимое окошко и подогнать в неё данные selectquery по параметрам джоина)
3.Используем данные из этой колоночки в сервисе окна

Можете несколько месяцев подождать и сделать структуру базы аналогично 7.8.

Готового решения нет, пробуйте сами разные варианты. Ещё можно для каждого языка создать view с одинаковым набором полей, ведущую себя как обычная таблица справочника. И подставлять одну из этих view. При добавлении данных в справочник триггер пишет в таблицу справочника и в общий справочник перевода. Если значение в справочнике есть, но нет локализоции на нужный язык — подставлять на базовом языке из таблицы. При попытке его редактировать — создавать новое значение в справочнике перевода и далее показывать его.

"Можете несколько месяцев подождать и сделать структуру базы аналогично 7.8."
Только здесь и сейчас :-D
Ок, значит будем первооткрывателями.

Как можно реализовать подмену данных Name в справочнике?
Если банально в справочнике писать SQL Text column(с идентичным запросом) вместо обычного типа Name, то террасофт вываливается с ошибкой OLE Error, хотя в SQL студии всё работает корректно.
Более того, данные в Lookup Data Control всё равно тянутся из первичной колонки для отображения, не с SQL запроса в подмене Name.

Можете сделать справочник по view вместо таблицы.

И что нам это даст?
У меня проблема сейчас в том, что я подменил выбор поля Name в справочнике текстом запроса.
При открытии самого справочника - всё хорошо и корректно данные подтягиваются, а вот при попытке вывалить список LookupDataControl - валится ошибка, непонятно с чего.

Почему, если скажем в tbl_Dictionary выбирать Name как обычной колонкой в сервисе, то все лукапдатаконтролы прогружаются нормально, а если написать выбор Name как SQL Text column [tbl_Dictionary].[Name], то в самом справочнике прогружается нормально, а вот при загрузке контроллов спровочника в других окнах всё валится с ошибкой?

Ну, значит так нельзя делать. Пробуйте другим способом. Возможно, получится с колонкой подзапроса или ещё как-то.

Попробовал воспроизвести, в какой-то момент было сообщение о несовместимости типов. Возможно, в ядре для колонок различного типа (обычная, SQL и др.) используются разные классы данных.

С колонкой подзапроса аналогично

В таком случае ищите другие способы. Штатно никто такое со справочниками не делал.

Господа из ТС ничего не ответят по данному вопросу?

Платформа 3.Х уже несколько лет не развивается, так что маловероятно, что господа из ТС будут что-то глобально переделывать в ядре под такое специфическое использование.

Мне фактического подтверждения ошибки и объяснения процесса было бы предостаточно.

Это не ошибка, в системе Terrasoft 3.X не предусматривалось использование нескольких языков в справочниках. Это уже Ваши разработки.

Сами же говорили, что:

Знаю, что не предусмотрено, знаю что много и долго, но...

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

В чем может быть причина того что в ТС не отображаются входящие письма из Outlook у которых нет своих контактов в ТС?

Нравится

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

Terrasoft не является почтовой программой. В нём отображаются только те письма, которые можно к чему-то привязать: контактам и/или контрагентам. Если привязать не к чему — письмо интегрироваться не будет.

Такой ответ заказчика не устраивает)))
Есть вариант посторонней программой на С# закидывать письма с Ooutlook в Terrasoft? Но может все же есть более простой вариант?

Можно и не сторонней, а в самом Terrasoft доработать функцию анализа почты SaveMailItem в скрипте scr_MSOutlookLibrary.

Только сначала нужно понять, к чему вязать такие письма и как определять. К примеру, стандартная логика привязки к контакту и контрагенту — по адресу. К инциденту — по номеру, упомянутому в теме.

Можете попробовать просто отключить проверку наличия связей и грузить всегда. Для этого в функции изменить проверку условия CanSaveInDB. Но будет ли корректно работать — надо проверять.

Щас разберемся, тут логика в том что контакты создаются по письмам

Если там какая-то своя логика, то нужно в ней разбираться. Стандартно такого нет.

"Зверев Александр" написал:Можно и не сторонней, а в самом Terrasoft доработать функцию анализа почты SaveMailItem в скрипте scr_MSOutlookLibrary.

Очень долго я пытался что сделать... А оно оказывается работает отдельно от клиента и как мне перезапустить этот функционал?

Попробуйте перезапустить Outlook.

"Зверев Александр" написал:

Попробуйте перезапустить Outlook.


как то просмотрел, спасибо)))

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

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

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

В нашей системе часто используется функционал загрузки данных из 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 :)

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

Добрый день.

Есть некий web-service (wcf и использует wsHttpBinding) и методы для работы с ним.
Необходимо из террасофта работать с данными методами.

Есть понимание как это сделать в Visual Studio например на с#
Для этого к проекту добавляется ServiceReference (с указание ссылки на наш веб-сервис), на его основе создается объект и дальнейшая работа (авторизация и обращение к методам) происходит через этот объект. Примерно так...

SomeServiceReference.ServiceClient client = new SomeServiceReference.ServiceClient();
if (client.ClientCredentials != null)
{
client.ClientCredentials.UserName.UserName = "UserName";
client.ClientCredentials.UserName.Password = "Password";
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
}

try
{
return client.InvokeMethod( parameter );
}
catch( Exception ex )
{
client.Abort();
throw ex;
}
finally
{
if( client != null ) client.Close();
}

В с# также есть возможность программно создать экземпляр System.ServiceModel.WSHttpBinding и с помощью него организовать взаимодействие со сторонним веб-сервисом.
А вот как организовать подобную схему из Террасофта не понятно.

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

Спасибо.

Нравится

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

Приветствую Вас!

у нас есть отчет "Звонки за период" типа Excel
Проблема в том что он выгружает разные данные за один и тот же период, если загружать отчет подряд несколько раз (все разы разные данные)

Посмотрели в профайлере какие запросы выполняются в момент создания отчета, картинку прикладываю

какая то не понятная логика там, начала top 10000 потом top 20000 и т.д. Зачем это делается?
есть предположение что данные где то кэшируется, поэтому результат в итоге не верный каждый раз.

Вопрос 1 : почему так происходит, и как этого избежать? (может быть отключить кеширование?)
Вопрос 2: можно ли как то поменять сам sql текст запроса который генерируется для отчета Excel. ?

Нравится

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

Андрей, информации недостаточно, чтобы сказать что-то конкретное.

Что это за отчёт, по каким данным строится, стандартный он или самодельный?
Откуда в системе взялась таблица «tbl_Call_9ABFB7C1»? На стандартную не очень похожа.
В чём различие данных в разных запусках отчёта?

Да, и какая у Вас версия системы?

был лайт-переход с версии 3.3.2 на 3.4.1

"tbl_Call_9ABFB7C1" это псевдоним "[dbo].[tbl_Call]"

часть первого запроса из профайлера:
exec sp_executesql N'SELECT TOP 10000
[tbl_Call_9ABFB7C1].[CallNumber] AS [Col_0D6C9245],
[tbl_Call_9ABFB7C1].[PhoneNumber] AS [Col_8C1120A7],
[J0_tbl_ITService_CEE4647D].[Name] AS [Col_8497D798],
[J0_tbl_ITService_CEE4647D].[ID] AS [Col_8497D798ID],
[J1_tbl_Contact_C44A0EC8].[Name] AS [Col_3713C6C7],
[J1_tbl_Contact_C44A0EC8].[ID] AS [Col_3713C6C7ID],
[J3_tbl_ITService_CEE4647D].[Name] AS [Col_8C0C09B4],
[J3_tbl_ITService_CEE4647D].[ID] AS [Col_8C0C09B4ID],
[J2_tbl_ITServiceI_D7DD168A].[ID] AS [Col_D59DDC1B],
[J4_tbl_ITServiceC_8912228E].[Name] AS [Col_2BD3F2E3],
[J4_tbl_ITServiceC_8912228E].[ID] AS [Col_2BD3F2E3ID],
[J5_tbl_ITServiceP_26DC7F2F].[Name] AS [Col_36E2E264],
[J5_tbl_ITServiceP_26DC7F2F].[ID] AS [Col_36E2E264ID]
FROM
[dbo].[tbl_Call] AS [tbl_Call_9ABFB7C1] ....
.... и далее куча join'ов

Остальные такие же, отличается только количество TOP

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

Данные отличаются по количеству записей
например выгружаем звонки за прошлый месяц, получается 1360 записей,
сразу же делаем следующую выгрузку, получается 1425. И так каждый раз.

Причем если напрямую на сервере сделать последний запрос из профайлера (который select top 40000)
данные получаются корректные, т.е. как есть.

подозреваю, что именно из за того что делается несколько одинаковых запросов подряд (отличается только количество TOP), данные считаются неправильно, но может быть причина в другом.

Если это самостоятельно разработанный отчёт, то что-то определённое сказать сложно. Проверяйте его настройки, всё ли верно там заполнено. Проверьте свойства и отчёта, и запроса, по которому он строится. Вот инструкция, об Excel-отчётах на стр. 166, о запросах на стр. 182.

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

Есть ли у демоверсии собственное наполнение (База по клиентам), где его взять?

Нравится

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

Пытаюсь научиться работать с демо-версией.

Здравствуйте.
Демо-версия тем и отличается от обычной, что в ней присутствует некое наполнение данными для обучения. Но там, так-же, есть и ограничение на количество записей в реестре - 100. Что касается функционала, то он абсолютно идентичен стандартной версии. Демо можно получить можно по согласованию с менеджером, который ответственный по Вашей Компании.

Здравствуйте,
У меня тестовое задание. Менеджер сама сказала, что я могу использовать демо версию с наполнением. Если она не сказала каккую, то значит я сам должен найти её. Получается мне проще самому было завести данные. Только вот я не знаю в какой форме, то есть как грамотно заводить продажи, чтобы впоследжствии настроить фильтры по сумме сделок.

Возможно, Вам просто надо это?

Если же речь именно о платформе 3.Х, то можете уточнить у менеджера, где именно взять дистрибутив демоверсии с наполнением.

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