изображение
Технические вопросы
5.x

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

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

Нравится

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

Constantine, прикрепила во вложенном файле пример реализации.

"Бондарь Наталия" написал:Constantine, прикрепила во вложенном файле пример реализации.

Простите за глупый вопрос. А зачем в одном методе подряд 3 раза вызывать установку свойства:

controlImage.UsePrimaryImageColumn = false;
controlImage.UsePrimaryImageColumn = true;
controlImage.UsePrimaryImageColumn = false;

Одного раза вполне достаточно, чтобы свойство UsePrimaryImageColumn установилось в false.
Или я что-то неправильно понял???

"Бабуков Андрей Александрович" написал:
Бондарь Наталия пишет:

Constantine, прикрепила во вложенном файле пример реализации.

Простите за глупый вопрос. А зачем в одном методе подряд 3 раза вызывать установку свойства:

controlImage.UsePrimaryImageColumn = false;

controlImage.UsePrimaryImageColumn = true;

controlImage.UsePrimaryImageColumn = false;

Одного раза вполне достаточно, чтобы свойство UsePrimaryImageColumn установилось в false.

Или я что-то неправильно понял???

Когда-нибудь останется работа только для машин и IT'шников :)

меня тоже интересует этот момент:smile:

Constantine, Андрей,

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

К сожалению, с кодом оказались проблемы.

При первой загрузке файла - все отлично и прекрасно, но дальше начинаются неприятности....
Если загрузить новый файл - в базе происходит обновление, но файл отображается предыдущий.... Переоткрытие карточки не приносит никаких плодов. При этом, если зайти с другого браузера - файл подтягивается новый. Более того - очищаем поле с картинкой, файл продолжает отображаться....
Переоткрываем карточку - пусто, отлично! Загружаем третье фото - барабанная дробь.... видим самое первое изображение:smile:

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

Заранее премного благодарен

Добрый день, Константин!

Если нужно очистить профиль в BPMonline, то это можно сделать в конфигурации:

Но судя по описанию, то профиль нужно очищать в браузере.

"Арсений Белецкий" написал:

Добрый день, Константин!

Если нужно очистить профиль в BPMonline, то это можно сделать в конфигурации:

Но судя по описанию, то профиль нужно очищать в браузере.

С уважением,

Белецкий Арсений

Группа компаний Terrasoft


Арсений, возможно я не совсем правильно разъяснил ситуацию. Проблема именно в том, что я создал поле Фото в карточке Контакта. Обработка отображения и загрузки файла выполнена по аналогии с инструкцией Наталии. Выше я описал поведение этого поля, когда клиент работает с системой. Вопрос в том, каким образом предотвратить такое неадекватное поведение?

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

Константин, попробуйте открыть карточку ContactEditPage в дизайнере страниц (в конфигурации), открыть ее процесс, и в событии ParentPageLoadCompleteAfterBaseScript

дописать предпоследней строчку кода InitializeContactPhoto();

В примере, который дала Наталья есть следующая строка

Page.AddScript(string.Format("{0}.setImage({1});", Page.ContactPhotoImage.ClientID, Json.Serialize(controlImage, new ControlImageJsonConverter())));

не понимаю Json-это namespace или класс JsonSerializer

Ольга, Json это формат обмена данными между клиентом и сервером (http://flexjson.sourceforge.net/).

просто компилятор ругается на эту строчку, я подключила Terrasoft.UI.WebControls.Utilities.Json.Converters, Newtonsoft.Json
всё равно пишет "Имя Json отсутствует в текущем контексте", вот и пытаюсь понять, где взять и что ещё подключить

Ольга, а Terrasoft.Common.Json подключен?

подключила, не ругается...спасибо

Показать все комментарии
Технические вопросы
5.x

На сервере ручками сменили часовой пояс, после этого стал ругаться
Часовой пояс вернули: установили как (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:

Показать все комментарии
Автонумерация
Технические вопросы
5.x

Создала системную переменную, в дизайнере объектов присвоила полю значению по умолчанию из этой переменной.Что ещё нужно сделать? потому как инкремента поля не происходит, при добавлении новой записи выставляется в 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, то триггер - вполне разумное решение. :)

Показать все комментарии
карточка
События
Технические вопросы
5.x

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

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

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

Нравится

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

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

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

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

Есть карточка Заказы, как по событию выбора Контрагента(поле-справочник), прочитать 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 "Отправлять в базовый".

Показать все комментарии
Технические вопросы
5.x

Опять сваливается при нажатии на кнопку почты.....
Описанное здесь 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

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

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


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

Показать все комментарии
Технические вопросы
5.x

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

Нравится

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

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

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

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

Показать все комментарии
Технические вопросы
5.x

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

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

Нравится

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

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

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

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

Показать все комментарии
Технические вопросы
5.x

В бизнес-процессе функцией вычисляю строку и записываю ее в параметр процесса, потом вставляю в колонку Заметки активности. Все работает, только новую строку не могу вставить.
Как новую строку вставить?

[#Читать данные добавленного лота аукциона.Результат выборки.Ссылка#] + "\n\n" + [#Читать данные добавленного лота аукциона.Результат выборки.Описание ссылки#] + "\n\n" + [#Читать данные добавленного лота аукциона.Результат выборки.Заметки#]

Какой нибудь спецсимвол вместо "\n"?

Нравится

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

Добрый день.

Символы отображаются в заметках или нет ни перехода, ни текста?

В заметках символы "\n" не отображаются, но и перехода на новую строку нет, это на детали Заметки
А в колонке реестра, что интересно, переводы строк есть, как и хотелось

Здравствуйте Александр.
Деталь "Заметки" отображает HTML текст, а реестр нет. Поэтому Вам нужно как-то определится, где Вам нужен перевод строки. Если на детали, то вместо "\n\n" вставьте "[br /]". Примечание, квадратные скобки заменить знаками > <. Но учтите, что в реестре у Вас так запись и отобразится "[Данные1][br /][Данные2]", и мало того, что никаких переходов, так еще и теги будут выводиться. Я рекомендую Вам не выводить колонку "Заметки" в реестр. Если Вы хотите туда что-нить запихнуть, то удаляйте при этом теги. В качестве обходного решения могу Вам порекомендовать такой вариант. В дизайнере объекта создайте колонку с типом "неограниченный текст". Потом перейдите в дизайнер процессов и при сохранении записи, т.е. на событии "...Saving" уберите теги и вставьте в новую колонку. Старую колонку сделайте системной, чтобы пользователи не путались при вытаскивании колонок в реестр и не вытащили ее случайно. Опубликуйте объект и наступит Вам счастье.:cool:

Супер. Это то что хотелось услышать :-) Именно с фразы

"Бабуков Андрей Александрович" написал:Деталь "Заметки" отображает HTML текст, а реестр нет. Поэтому Вам нужно как-то определится, где Вам нужен перевод строки. Если на детали, то вместо "\n\n" вставьте "[br /]".

все встало на места.
THNX.

Когда-нибудь...., но не при нашей жизни..... ;-)

Показать все комментарии
Технические вопросы
5.x

Как скрыть рабочее место от определенных пользователей?

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

Нравится

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

Добрый день.

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

Александр, добрый день!

Прошу описать постановку задачи, чего необходимо добиться:
1. Скрытие какого-то раздела? Для этого у нас есть базовые средства.
2. Скрытие набора разделов от определенных пользователей. Нужно тогда собрать все такие разделы в определенное рабочее место и настроить доступ. Если у какого то клиента нет доступа по всем разделам из рабочего места то и само рабочее место не будет видно.

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

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

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

Добрый день!

Вопрос по этой теме: Как в разделе Задачи и Документы скрыть у пользователя доступ к чужим задачам и документам. В настройках Администрирование я могу или дать полный доступ к разделу или скрыть раздел, а пользователю нужен доступ только к своим Задачам и Документам. Нельзя что бы видел складской сотрудник задачу, которую создает бухгалтер или директор.

Спасибо

Людмила, согласно распределению прав доступа, автор записи всегда имеет полный набор прав на созданную им запись. Права для других пользователей и ролей определяются настройками прав по умолчанию. Для решения задачи Вам необходимо: 1. Раздать для ролей пользователей права доступа по умолчанию (раздел "Администрирование" - "Права доступа по умолчанию"). А именно, удалить все настройки с детали [Права по умолчанию]. В результате, создаваемые записи будут доступны только автору и пользователю с правами администратора. 2. Переопределить права на уже созданные записи посредством детали [Доступ] (деталь в разделе). Если записей много, можно воспользоваться скриптом перераздачи прав. 

Наталья , спасибо большое !

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