Outlook цепляется к Террасофт (3.4.0) только при условии, что Outlook был запущен после Террасофт .
Из-за этого, а также из-за случайных событий из категории «человеческий фактор» интеграция бывает не включена, из-за чего некоторые письма не цепляются в Террасофт.

Дело в том, что свойство «Автоматическое соединение с активной Terrasoft» дает возможность соединяться только с активной Terrasoft. Если Террасофт не был запущен перед Outlook соединения не будет. Меня в идеале интересует вариант, когда при запуске Outlook происходит имитация нажатия кнопки «Соединить» во вкладке «Надстройки» с автоматическим вводом логина-пароля (которые где-нибудь хранятся – файл, реестр, файл конфига Террасофт) и соединением с базой. Причем, не важно включен сам Террасофт или нет.

Вопрос: возможно ли автоматизировать со стороны Outlook’а – например, при его запуске – процесс соединения с базой (ведь интеграцию можно включить, не запуская Террасофт)

Нравится

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

Дмитрий, добрый день!

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

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

Насколько я уточнял у наших разработчиков, то такую реализацию мы не выполняли.

Также, поймите, что нам интересно, что бы клиент работал в первую очередь с Terrasoft, а потом уже с Outlook :wink: .

Если бы в Террасофт был почтовый клиент наши пользователи там бы уже давно и работали, "однако но".

Кроме вышеуказанной проблемы не-100% подключения интеграции, есть еще такая: у нас существует часть пользователей, которым совершенно нечего делать в террасофт - пока. Однако почта им нужна)

Логин, пароль, название конфигурации можно хранить где угодно, куда дотянется Outlook или плагин Террасофта - не вижу здесь принципиальной проблемы.

Чисто логически вижу два решения:
1. Изменения в плагине для Outlook
2. Навешенный сверху макрос, который бы запускал соединение.

нашел вот
msdn.microsoft.com/en-us/library/office/ff869298(v=office.14).aspx

как мне из VBA вызвать методы плагина Террасофт?)

Здравствуйте, Дмитрий!

Запускать макрос можно путем обращения к COM-объекту Outlook.

Обработка событий от плагина Outlook происходит в скрипте scr_MSOutlookLibrary.

Сессия также устанавливается по ряду событий из конфигурации функцией GetMAPISession.

Примеры взаимодействия можно посмотреть в скриптах конфигурации scr_OutlookUtils и scr_MSOutlookLibrary.

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

На сервере ручками сменили часовой пояс, после этого стал ругаться
Часовой пояс вернули: установили как (UTC+03:00) Волгоград, Москва, Санкт-Петербург
Проверила в реестре по пути HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones это Russian Standart Time, в реестре присутствует. В какую сторону рыть

Нравится

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

UTC +3 - это может быть и не Москва(зима), а Москва (без перехода на летнее время), которая сейчас и является Russian Standart Time. Если у вас клиент об этом знает (какое-то там обновление Windows),а сервер нет, или наоборот, то они друг друга плохо понимают

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

Добрый день!

Насколько я понял, вопрос решен, в случае возникновения или актуальности текущего вопроса, прошу сообщать.

Рады будем помочь!

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

Вообще то мелкомягкие давно (ещё в 2011ом годе) уже для всех своих виндов сделали патч, который выставляет нормальные часовые пояса, то есть Москва это +4 без всяких переходов на лето/зиму и категорически рекомендует его устанавливать.
Думаю все дело в этом.

Вот здесь лежит:
http://support.microsoft.com/kb/2570791/ru

Спасибо! Обновление решило проблему.

Оказалось, что проблема была решена для часового пояса Москва +4. Если часовой пояс Минск +2 ,проблема сохраняется.

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

Как можно прочитать из http://support.microsoft.com/kb/2633952/ru :

Как сообщалось ранее в статье 2625508 базы знаний Майкрософт, Беларусь отказалась от перехода на зимнее время в 2011 г. и теперь постоянно использует летнее время. В этой статье пользователям предлагается обходной путь с переходом на зимнее калининградское время. Это обновление Windows делает переход постоянным и добавляет Минск в отображаемое имя зимнего калининградского времени. Новое отображаемое имя зимнего калининградского времени — "(UTC+03:00) Калининград, Минск".

Надеюсь, это поможет :smile:

Батька всегда шел своим путем! :lol:

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

Создала системную переменную, в дизайнере объектов присвоила полю значению по умолчанию из этой переменной.Что ещё нужно сделать? потому как инкремента поля не происходит, при добавлении новой записи выставляется в 0, а в БД эта возможность заблокирована.

Нравится

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

Посмотрите, как это сделано в процессе объекта "Документ".
нумерация документа

Посмотрела,скопировала к себе этот кусок - не работает.Не пойму, как работает это действие "Сгенерировать порядковый номер" - оно использует системные настройки(Текущий номер и Маска)?

Да, нужно создать системные настройки.

Системные настройки уже созданы, я как раз не могу найти, где при создании Действия процесса, нужно указывать конкретные системные настройки?, или это определяется по имени

Да, по имени. В коде схемы "Сгенерировать номер по порядку" есть:

	var entitySchemaName = entitySchema.Name;
	string codeMaskSettingName = entitySchemaName + "CodeMask";
	string lastNumberSettingName = entitySchemaName + "LastNumber";

Сделала ранее по аналогии, как в схеме Документ - не работает, потом так

В скрипт вставила код из схемы "Сгенерировать номер по порядку"

object EntitySchema = Entity.Schema;
if (EntitySchema != null) {
	var entitySchema = EntitySchema as Terrasoft.Core.Entities.EntitySchema;
	var entitySchemaName = entitySchema.Name;
	string codeMaskSettingName = entitySchemaName + "CodeMask";
	string lastNumberSettingName = entitySchemaName + "LastNumber";
 
	var connection = context.UserConnection;
	string sysSettingsCodeMask = (string)SysSettings.GetValue(connection, codeMaskSettingName);
	int sysSettingsLastNumber = (int) SysSettings.GetValue(connection, lastNumberSettingName);
 
	SysSettings.SetValue(connection, UserConnection.RootAdminUnitGroupId, lastNumberSettingName, ++sysSettingsLastNumber);
 
	var code = string.Format(sysSettingsCodeMask,sysSettingsLastNumber);
	var update = new Update(UserConnection, Entity.Schema.Name)
	.Set("Number", Column.Parameter(code))
	.Where("Id").IsEqual(Column.Parameter(Entity.PrimaryColumnValue));
update.Execute();
}

При компиляции ругается

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

Все-таки рекомендую сделать по аналогии с "Документом". Что именно у Вас не получилось?

Здравствуйте, Дмитрий
Сделала по аналогии с "Документом"

В скрипте SetGenerateParamScript сначала 1 строка идентична как в Документе
но поскольку не работала, добавила код на обновление поля....не работает (((

GenerateNumberUserTask.EntitySchema = Entity.Schema;
string code = "1";
var update = new Update(UserConnection, Entity.Schema.Name)
	.Set("Number", Column.Parameter(code))
	.Where("Id").IsEqual(Column.Parameter(Entity.PrimaryColumnValue));
update.Execute();

Такое ощущение что вообще не происходит наступление этого события, тем не менее Заказ в таблицу добавляется....

А какая у этого объекта PrimaryColumn?
Также, пожалуйста, т.к. у Вас On-Site версия - попробуйте запустить Profiler и посмотреть какие запросы идут на сервер после нажатия на "ОК".

Если я не ошибаюсь, то по умолчанию PrimaryColumn это Id (объект наследован от базового)
В профайлере обязательно посмотрю, пока сделала через триггер: после вставки читаю значение из системной таблицы, обновляю поле Number, потом обновляю значение системной переменной в таблице....Понимаю что не совсем правильно, но так хотя бы работает

Если у Вас On-Site, то триггер - вполне разумное решение. :)

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

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

Есть задача: на карточке редактирования добавить свою логику сохранения записи, при которой нужно выводить в messagePanel сообщение подобное "Поле {0} обязательно для заполнения" и не давать сохранять запись.

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

Нравится

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

Здравствуйте Constantine!
Это просто.
У карточки редактирования есть метод: "AreConditionsCorrect". Переопределив его и добавив свою логику (установив Page.[EditControl].Required = true [данный метод установит свойство поле обязательно для заполнения] и панель сообщений сама Вам выведет указанное в описании сообщение со ссылкой на поле) или Вы можете вернуть значение "false" из метода перед этим заполнив MessagePanel, и базовая логика сохранения не отработает.
А лучше, если Вы будете устанавливать свойство обязательности в своей логике, например при смене значения другого поля.
И наконец, почему бы Вам просто не изменить свойство в объекте, установив значение "Обязательно для заполнения на уровне приложения"?

Спасибо за совет, Андрей!
Я видимо не совсем правильно сформулировал саму задачу. Указанное сообщение я упомянул для примера, а логика разрешения/запрета сохранения записи не касается обязательных для заполнения полей.
Буду копать в сторону этого метода

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

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

Скриншот ошибки в прикрепленном файле.

Место ошибки в отладчике:
edtWorkspaceMenu.Value = MenuDataset.Values('ActionMenuItemCaption');

function wnd_CreateNewWorkspaceOnPrepare(Window) {
        Initialize();
        ShowControls(edtNew);
        RefreshDetails();
}
function ShowControls(Control) {
..............
if (!IsEnabled) {
                var MenuDataset = GetSingleItemByCode('mds_WorkspaceMenu', 'CreateNewWorkspace');
                MenuDataset.Open();
                MenuDataset = GetWorkspaceMenu(MenuDataset);
                MenuDataset.Locate('ActionMenuItemName', 'amiCommon');
                edtWorkspaceMenu.Value = MenuDataset.Values('ActionMenuItemCaption');
                ScriptObject.Menu =     MenuDataset.Values('ActionMenuItemName');
        } else {
                edtWorkspaceMenu.Value = '';   
                ScriptObject.Menu =     '';
        }
..............
}

Значение переменных в отладке:
MenuDataset.Values('ActionMenuItemCaption') равно null
edtWorkspaceMenu.Value равно ''

Ошибка появляется вне зависимости от пользователя (по Supervisor все также).

Нравится

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

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

Уточните, пожалуйста, у Вас версия 3.4. была установлена изначально, или Вы на нее переходили?

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

Прикладываю архив с сервисами. Рекомендуется загружать его вначале на тестовой базе данных.

Да действительно мы переходили на 3.4 и обновляли только ядро. Попробовал добавить высланные Вами сервисы, но видимо их недостаточно. На данный момент такая ошибка:
TSObjectLibrary.Services: Информация по сервису 'il_MainWorkspace' не найдена

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

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

Сервисы в приложении.

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

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

В Вашем вложении почему то не оказалось 'il_MainWorkspace'.

Виталий, сервисы прикрепила.

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

Есть карточка Заказы, как по событию выбора Контрагента(поле-справочник), прочитать Id выбранной записи контрагента , чтобы потом его использовать для выборки данных из связанной таблицы

Нравится

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

Опять не заметил, что для BPM

Извините, если я правильно поняла, этот код для Террасофт 3,а у меня BPMonline

Для BPM можно создать параметр AccountID,
а в скрипте на изменение написать

AccountID = Page.AccountEdit.Value.ToString(); //AccountEdit - название поля на страничке

Добрый день, Ольга!
Если я правильно понял вопрос, то Вам нужно просто в скрипте карточки после события "lookupGridPageClose" вызвать у UserTask'а, который "Открыть страницу справочника" спросить параметры.
Примерный код:

var values = (Dictionary <string, object>)OpenLookupUserTask.GetSelectedValues(UserConnection);
 if (values.Count.Equals(0)) {
	return true;
}
var id = String.Empty;
var text = String.Empty;
foreach(var value in values) {
	id = value.Key;
	var items = value.Value as Dictionary<string, object>;
	text = items["Name"].ToString();
}
Page.OwnershipEdit.SetValueAndText(id, text);

Александр, Андрей , спасибо ))

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

Здравствуйте Ольга!
Событие Init страницы наступает всегда. Т.е. Вы не можете отменить его наступление. Вы можете подписаться на это событие самостоятельно из дизайнера, добавив в событийный подпроцесс начальное сообщение "Init" (зелененький кружочек с конвертиком внутри). И от него вывести свой скрипт. Только не забудьте, если Ваша страница наследуется от какой-то базовой страницы, отправить сообщение "Init" в базовую, до или после своего скрипта. Это такой темно синий кружочек с конвертом внутри. И в свойствах этого сообщения укажите "Сообщение - Init" и поставьте checkbox "Отправлять в базовый".

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

Опять сваливается при нажатии на кнопку почты.....
Описанное здесь https://community.terrasoft.ru/forum/topic/9354 проверил, все нормально, но сваливается......
Кэш, профиль и редиску чистил.

Текст ошибки

Date: 06.06.2013 17:26:12
Date (UTC): 06.06.2013 13:26:12

Exception Message: Object reference not set to an instance of an object.
Exception Type: System.NullReferenceException
Exception Source: TSBpm

Exception Stack Trace:
at Terrasoft.WebApp.MainPageEventsProcessSchema`1.InitScriptTaskExecute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessScriptTask.Execute(ProcessExecutingContext context, Func`2 internalExecute)
at Terrasoft.WebApp.MainPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.MainPageEventsProcessSchema`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
at Terrasoft.Core.Process.ProcessFlowElement.OnExecuted(ProcessActivityAfterEventArgs e)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
at Terrasoft.WebApp.MainPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.MainPageEventsProcessSchema`1.ThrowEvent(ProcessExecutingContext context, String message)
at Terrasoft.UI.WebControls.PageSchemaUserControl.ThrowEvent(String message)
at Terrasoft.UI.WebControls.Controls.PageContainer.LoadFromAssembly()
at Terrasoft.UI.WebControls.Controls.PageContainer.LoadUserControl()
at Terrasoft.UI.WebControls.Controls.PageContainer.OnInit(EventArgs e)
at System.Web.UI.Control.InitRecursive(Control namingContainer)
at System.Web.UI.Control.InitRecursive(Control namingContainer)
at System.Web.UI.Control.InitRecursive(Control namingContainer)
at System.Web.UI.Control.InitRecursive(Control namingContainer)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

SessionID: t2uokzc0flbahd252pxm3per
Request URL: /0/ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a&ActiveTabId=PageContainer_5ca0dabc8c894e1a9bb536407e1c4ef2_055063c98180e011afbc00155d04320c_830581929880e011afbc00155d04320c&action=selectemailfolder
Request Path: /0/ViewPage.aspx
Request UrlReferrer: http://bpm/0/ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a&SysMa...
Request Type: GET
User Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)
User Host Address: 10.240.1.222
User: sham
Is Authenticated: True
Authentication Type: Forms
Is Secure Connection: False

Application Version: 5.4.0.1063
Application Path: C:\inetpub\wwwroot\BPMonline\Terrasoft.WebApp\
Application Virtual Path: /0
Application Trust Level: Full
Machine Name: BPM
Is Local: False

Process ID: 1644
Process Name: w3wp.exe
Process Account Name: PG-NHK\bpm
Thread Account Name: PG-NHK\bpm
OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1
Net Framework Version: 4.0.30319.233
DBExecutor Type: MSSqlExecutor

Нравится

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

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

PS: предварительно выгрузите (создайте бекап) схему MainPage.

Александр, Вам помогло?

Прошу прощения, еще не пробовал, так как я в отпуске, всем привет из солнечной Турции.

Гм....добрейшей души человечище вы, Дмитрий!
В после импорта опубликованной схемы, в ее процессе все подписи ромбиками с вопросами...... так что ориентироваться там занятие не для слабонервных....

Ну да это не так печально, как то что, все равно не помогло....

Александр, скопируйте идентификатор как отображено на скриншоте ниже

/system/files/1_2_3.png

И замените им идентификатор, который отметила Анна в посте http://www.community.terrasoft.ru/forum/topic/9354#comment-39634

"Шамуилов Александр" написал:

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


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

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

Следующий момент: Когда в конфигурации запускаешь страницу раздела существующую в поставке (напр Контрагент), то открывается страница и можно записи добавлять, редактировать. Если же я запускаю новую страницу раздела, то страница открывается, но при попытке добавить запись выходит ошибка NullReferenceException. Я правильно понимаю, связывание с карточкой редактирования происходит на этапе создания рабочего места

Нравится

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

Создала новый раздел Заказ, записи добавляются и в Заказ и в Деталь заказа-Продукты, но я нажимаю Изменить, то выходит ошибка . При этом и в основной таблице Заказ и в связанной таблице Продукты заполнены все справочники т.е. нет нулевых ссылок

Проверьте, что у Вас в объекте раздела указано значение для свойства "Отображаемое значение". Его необходимо обязательно указать, если для объекта используется страница редактирования.

Спасибо, работает

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

Упорно выдает ошибку компиляции на метод select.ExecuteReader(UserConnection.EnsureDBConnection))...

Using'и подключил уже какие только можно.....

Нравится

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

С ExecuteScalar та же история, работает Execute, но информация о количестве выбраных строк в количестве одной меня ни разу не спасает.....

В месте, где Вы определяете переменную select, приведите ее к типу Select.

Уже, но все равно спасибо.

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

В UpdateQuery присутствует Include фильтр. В простых SelectQuery я включаю его существующим методом ApplyDatasetIncludeFilter.
Но для UpdateQuery этот метод не проходит. Ошибку не выдает, но и фильтр не включает.
Стандартный вариант для UpdateQuery

SetParameterValue(UpdateQuery.Parameters, 'TypeID', ListCheckBox);
EnableUpdateQueryFilters(UpdateQuery, CountCheckBox > 0, new Array('TypeID'));

где ListCheckBox - это массив с данными, фильтр включает, но значения туда не передает. В результате получаю ошибку Incorrect syntax near ) - то бишь IN() - с пустым значением.
Как можно это исправить?

Нравится

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

Нашла сама ответ. Вместо вышеуказанных строчек надо использовать

AddIncludeValuesList(UpdateQuery.Filters.ItemsByCode('TypeID'), UpdateQuery.Parameters, ListCheckBox);
Показать все комментарии