Добрый день
В карточке КЕ я создала новую Деталь (наз-ся учет выдачи КЕ). Подскажите, пожалуйста, как для этой детали добавить деталь Файлы и ссылки? В инструкции написано, как Файлы и ссылки добавлять для раздела, а мне нужно - для детали раздела. Я создала объект "Файлы и ссылки для детали учет выдачи КЕ", а дальше что делать?

Нравится

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

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

Как устроена деталь "Файлы и ссылки" для обычного раздела я изучила. Я не пойму, как зарегистрировать эту деталь в моей детали, если в инструкции указано только для разделов:

2. Регистрация детали [Файлы и ссылки] в разделе:
1. Перейдите в раздел [Рабочие места].
2. Выберите необходимый раздел и перейдите на деталь [Детали].
3. В меню кнопки [Добавить] выберите пункт [Новую деталь].
4. В открывшейся карточке заполните параметры регистрации детали. После
сохранения карточки укажите связи с разделом на детали [Связь с разделом].

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

Мне будет неудобно с деталью второго уровня. Т.е. делать либо так, либо делать новый раздел и связанную деталь в разделе КЕ?

Это зависит от того, что Вы в итоге хотите получить.
Можно и новый раздел «Учёт выдачи КЕ» со своими деталями. Аналогично, скажем, активностям по контакту.

Мне нужна новая деталь к разделе КЕ, чтобы в этой новой детали была деталь "Файлы и ссылки". Как я понимаю, чтобы была именно деталь "Файлы и ссылки" - лучше сделать новый раздел «Учёт выдачи КЕ» с деталью "Файлы и ссылки" (по инструкции), затем сделать связанную деталь "Учёт выдачи КЕ" в разделе КЕ. Правильно?

Можете и так.

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

Добрый день
Допустим, у меня есть некий список записей в реестре КЕ. Теперь мне нужно обновить этот список : т.е. добавить в каждую запись определенное значение в поле "Внутренний Инвент.номер". Что я сделала:
1) создала шаблон, где указала только значения в поле "Инвент.номер" и "Внутренний Инвент.номер"
2) пытаюсь закачать шаблон т.обр., чтобы система нашла по "Инвент.номер" нужные записи КЕ и в них заполнила поле "Внутренний Инвент.номер":

В итоге: у меня создается новая запись КЕ, т.е. имеющаяся не обновляется. Что не так я делаю?

Нравится

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

Здравствуйте, Вы пишите что создали шаблон, и указали там “Инвент.номер”, в то же время, видно что колонка в объекте, для идентификации записи называется “Инв. номер”.

Необходимо что бы имя поля совпадало 1 к 1, то есть, что бы в шаблоне было написано не “Инвент.номер” а именно “Инв. номер”.

Рекомендуем не создавать шаблоны самостоятельно, а пользоваться кнопкой “Скачать шаблон” после того как Вы выберете объект. Там заголовки колонок будут названы корректно.

Если проблема повторится и после указания верного заголовка, обратитесь в support@terrasoft.ru с предоставлением доступа к вашему сайту.

Добрый день
Я именно скачала Шаблон, в нем поле указано "Инв.номер". Я обратилась по этому вопросу в техпод Террасофт

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

Добрый день
Подскажите, пожалуйста, как лучше сделать логику заполнения поля в карточке КЕ:
нужно, чтобы поле содержало строго 10 символов (или цифр?), при заполнении этого поля должна быть проверка на уникальность (значения этого поля не должны повторяться).
Примеры заполнения поля: 0000000001, 0000000002, ..., 0000000011, ....

Заранее спасибо

Нравится

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

Здравствуйте, Татьяна!

С примером настройки автонумерации в 5.x вы можете ознакомиться в этом посте - ссылка.

Подскажите, пожалуйста, как на с# сделать проверку поля, чтобы в нем было не более 10-ти символов?

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

понятно. А на С# как написать, как подсчитать кол-во символов?

А если надо, чтобы первые две цифры в значении поля были 69, как можно написать условие проверки на С#?

В MSDN описана работа со строками в C#, смотрите там.

Решила сделать сист.настройку "Текущий номер КЕ" (числовое, не кешируется. Наименование - KELastNumber), без маски номера.

В дизайнере процессов Конф.единица делаю:

Сохранила, опубликовала без ошибок.
При создании новой КЕ - в поле ITNumber (в котором и должен подставляться текущий номер) вообще нет никаких значений. В чем моя ошибка, подскажите, пожалуйста.

// не поняла, должна ли в схеме "Сгенерировать номер по порядку" указываться моя новая системная настройка KELastNumber и где именно указывается связь этой настройки с полем ITNumber в карточке КЕ

Татьяна, смотрите, как сделано в других разделах и делайте всё аналогично.
Если не хотите аналогично, изучайте схему «Сгенерировать номер по порядку», переделывайте её по-своему.
По стандартной логике, название системных настроек должно быть совпадающим с названием схемы плюс «LastNumber» и «CodeMask» соответственно.

Я хочу воспользоваться станд.логикой, смотрю, как сделано в других разделах. Изменила название своей новой сист.настройки ConfigurationItemLastNumber (чтобы соответствовала станд.логике), добавила сист.настройку маска номера КЕ (ConfigurationItemCodeMask). Все равно не работает, ничего в поле ITNumber в карточке КЕ не записывает. Подскажите, пожалуйста, на что еще обратить внимание?

нужно ли чистить Redis?

Да, попробуйте очистить Redis и профиль.

Если после этого функциональность не заработает, следовательно ошибка в реализации и её следует искать в программном коде. В таком случае, нужно будет отладиться.

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

Такую функциональность вообще можно реализовать на уровне СУБД.

1. В bpm'online создайте системную настройку, в которой будет храниться номер последней созданной записи.
2. Потом на уровне СУБД реализовать триггер, который будет срабатывать на добавление новой записи. В этом триггере нужно считывать номер из системной настройки, вычислять значение нового номера = номер из системной настройки + 1, устаналивать его в нужное поле в таблицу и обновлять значение системной настройки новым номером.

мне не нужно хранить номер последней записи, т.к. к ней не нужно добавлять +1.
Мне нужно сделать проверку на уникальность, т.е. новая запись в этом поле должна быть не равна имеющимся.

Татьяна, чтобы сделать проверку на уникальность, можете на нажатии OK в обработчике сделать запуск Select, который ищет в разделе записи с таким же значением. И если находит таковых больше нуля, показывать пользователю сообщение. А если таких нет — запускать базовую логику кнопки OK, которая проведёт сохранение и закрытие карточки.

В системе есть похожие проверки с помощью Select? Если -да, то где я могу их посмотреть?

Правильно понимаю?:

var select = new Select(userConnection)
.Column("%Имя колонки Инвент.номер%")
.From(%раздел КЕ%)
.Where(Column.Const("%Имя колонки Инвент.номер%")).IsEqual(%Введенный Инвент.Номер%);

А IsEqual(%Введенный Инвент.Номер%) - здесь что имеется в виду?

Нет, неправильно. В Const передавать значение, а не название поля.

в Const передавать значение: это значение ч/з Guid получать?

и еще вопрос: не поняла, select – это что будет? Да или НЕТ? Т.е. как я пойму, что в таблице найдены значения колонки?

Татьяна, класс Select — это представление обычных SQL-запросов. Напишите сначала запрос в СУБД, убедитесь, что он работает правильно и возвращает что нужно, и тогда переписывайте на C#.

// выбираю все записи в КЕ, где значение колонки ITNumber равно конкретному значению, выбранному не из справочника.

// На обработчике нажатии ОК в карточке КЕ:

var text = Page.ITNumberEdit.Value;

var select = new Select(userConnection)
.Column(Column.Asterisk())
.From("ConfigurationsItem")
.Where(Column.Const("text")).IsEqual("ITNumber");

// дальше нужно сравнивать, найдено или нет такое же значение?

Не забудьте также, что при редактировании записи (а не созании новой) в базе уже будет запись с таким кодом. То есть в запросе нужно отбросить запись с Id как у записи, открытой в карточке.

И кавычки вокруг text лишние.

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

Татьяна, напишите сначала SQL-запрос, который удовлетворяет нужную потребность, затем переведите на C#. Поскольку проверяется только факт наличия или отсутствия, лучше вытягивать не все колонки, а только Id.

Затем делаете чтение из Select и если в нём было хотя бы значение, то одно, если нет — то другое.

using (var dbExecutor = UserConnection.EnsureDBConnection()) {
	using (IDataReader dr = select.ExecuteReader(dbExecutor)) {
		if (dr.Read()) {
			//do something
		} else {
			//do something else
		}
 
	}
}

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

var text = Page.ITNumberEdit.Value;

SELECT *
FROM ConfigurationsItem
WHERE ITNumber = text;

так?

var text = Page.ITNumberEdit.Value;

SELECT Id
FROM ConfigurationsItem
WHERE ITNumber = text;

так?

Татьяна, ну возьмите базу и проверьте.

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

Не забудьте также, что при редактировании записи (а не созании новой) в базе уже будет запись с таким кодом. То есть в запросе нужно отбросить запись с Id как у записи, открытой в карточке.

Добрый день

var select = new Select(UserConnection);
- ошибка "имя UserConnection отсутствует в текущем контексте" исчезла.

осталось две ошибки

Татьяна, почитайте текст сообщения. Оно требует подключения нужного using (пространства имён).
Они подключаются в дереве элементов БП. Какого именно — можно помотреть в аналогичных случаях других карточек, где есть работа с классом Select.

Открыла исх.код на странице редактирования Конф.единицы - там нет using Terrasoft.Core.DB.Query;
Заходила в каждый элемент БП страницы редактирования Конф.Единицы и объекта Конф.единица - не нашла, где идет подключения using. Не там смотрю?

Using в дереве справа в редакторе процессов БП. Откройте любой другой аналогичный процесс и посмотрите, что подключать.

добавила в Usings:
Пространство имен: System.Data.IDataReader
Псевдоним: IDataReader

При опубликовании осталась только одна ошибка:

Если добавить в Using : Terrasoft.Core.DB.Query, то при опубликовании выходит ошибка о том, что Terrasoft.Core.DB.Query является типом, а не пространством имен.

Добавьте лучше Terrasoft.Core.DB

Terrasoft.Core.DB - это я уже добавила ранее

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

смотрела на странице редактирования карточки задачи, инцидента, запроса на изменение - все тоже самое, что и здесь. Подскажите, где еще можно уточнить? Может быть, какие -нибудь ссылки на документацию по С# ?

Либо не добавлено нужное Using, либо добавлено ненужное, либо опечатки в коде.
Раз везде работает, а тут нет, значит, не то же самое.
Попробуйте сравнить существующий код с новым, скопировать из существующего.
Документация по работе с Select.

В документации:
Select.ExecuteReader(DBExecutor) - метод
Terrasoft.Core.DB - пространство имен > Select - класс > ExecuteReader - метод : ExecuteReader(DBExecutor) - метод

в Using у меня указано Terrasoft.Core.DB

Тем не менее при опубликовании выходит ошибка:

Не знаю, может у Вас там в названии «ExecuteReader» нелатинские буквы оказались?

все латинское - проверяла.

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

Нет, ошибка сохраняется:

Причем, если я напишу "Execute" вместо «ExecuteReader», то ошибка уже:


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

Можно настроить уникальность на уровне базы.

Написала на обработчике нажатия ОК, после чего откомпилировалось без проблем:

var recordId = new Guid(Page.GetParameterValue("recordId").ToString());
var text = Page.ITNumberEdit.Value;

/*var select = SELECT ("recordId")
.FROM ("ConfigurationsItem")
.WHERE (("ITNumber" = text)&&("Id" != recordId));*/

var select = new Terrasoft.Core.DB.Select(context.UserConnection)
.Column(Column.Asterisk())
.From("ConfigurationsItem")
.Where(Column.Const(text)).IsEqual("ITNumber") as Terrasoft.Core.DB.Select;

using (var DBExecutor = UserConnection.EnsureDBConnection())
{
using (var reader = select.ExecuteReader(DBExecutor))
{
if (reader.Read())
{
//do something
Page.BaseMessagePanel.AddMessage(Warning, "Внутр.инвент.номер (ИТ) должен быть уникальным! ", MessageType.Warning);
return false;
}

else

IsServicesClosing = false;
var configurationItem = Page.DataSource.ActiveRow as Terrasoft.Configuration.ConfigurationItem;
if (configurationItem == null || configurationItem.StatusId == configurationItem.GetTypedOldColumnValue("StatusId")) {
return true;
}

if (!SetWrittenOffOnEditEnabled()) {
var entitySchemaManager = Page.Schema.SchemaManagerProvider.GetManager("EntitySchemaManager") as EntitySchemaManager;
var schema = entitySchemaManager.GetInstanceByName("ServiceInConfigurationItem");
var entitySchemaQuery = new EntitySchemaQuery(entitySchemaManager, schema.Name);
var idColumn = entitySchemaQuery.AddColumn(schema.PrimaryColumn.Name);
entitySchemaQuery.Filters.Add(entitySchemaQuery.CreateFilterWithParameters(
FilterComparisonType.Equal, "ConfigurationItem", configurationItem.Id));
var collection = entitySchemaQuery.GetEntityCollection(UserConnection);
IsServicesClosing = collection.Count > 0;
}
}}
return true;

Но если изменили поле ITNumber в карточке КЕ и хотим сохранить карточку, то система выдает ошибку:

Это значит, что у Вас в конфигурации нет объекта «ConfigurationsItem».

Да, спасибо, все сработало. Но эта логика работает при создании новой карточки КЕ, а если берем уже существующую, то ее ИД нужно убрать из выборки.

var recordId = new Guid(Page.GetParameterValue("recordId").ToString());

Подскажите, пожалуйста, как это учесть в Select ?

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

Добрый день

Есть шаблон для отправки уведомлений (напр., о регистрации Инцидента). В этом шаблоне мне нужно сделать вывод данных не из %Symptoms% , а из %Notes%. Я внесла это изменение в шаблон - но в самом уведомлении подтянулось "Нет данных" (хотя в Инцидент.Заметки имеется текст!). Подскажите, в чем моя ошибка? Заранее спасибо

Нравится

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

Notes — не совсем обычное поле, в нём хранится форматированный текст. Можете показать, как в нему в шаблоне обращаетесь?

в шаблоне обращаюсь - %Notes%

- это как к колонке с объекте Инцидент и запрос на обслуживание

Татьяна, логика заполнения макросов значениями задана в схеме FillEmailTemplateUserTask в куске кода:

string dataEmpty = "Нет данных";
foreach (var columnNamePass in subjectMacros) {
	string columnName = string.Empty;
	string value = string.Empty;
	try {
		columnName = columnNames[columnNamePass];
		value = (entity.GetColumnValue(columnName) ?? dataEmpty).ToString();
	} catch {
		//value = "<Колонка [" + columnNamePass + "] не найдена>";
		value = dataEmpty;
	}
	Subject = Subject.Replace("%"+columnNamePass+"%",value);
}
foreach(var columnNamePass in bodyMacros) {
	string columnName = string.Empty;
	string value = string.Empty;
	try {
		columnName = columnNames[columnNamePass];
		value = (entity.GetColumnValue(columnName) ?? dataEmpty).ToString();
	} catch {
		//value = "<Колонка [" + columnNamePass + "] не найдена>";
		value = dataEmpty;
	}
	Body = Body.Replace("%"+columnNamePass+"%",value);
}

«Нет данных» выводится при любой исключительной ситуации во время попытки считать поле из Entity или при его пустом значении. Более подробно можно выяснить, проведя отладку этого места, используя Visual Studio.

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

Добрый день
Подскажите, можно ли добавить новую деталь Заметки-1 по аналогии с деталью Заметки в существующем разделе, используя рук-во по добавлению новой детали (5.4.6) или в данном случае нужно как-то действовать по другому алгоритму?

Нравится

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

Эта деталь устроена иначе. Фактически, это не деталь с записями, а текстовое бесконечное поле Notes в объекте. Деталь инициализируется в схеме «Инициализировать детали», см. там по слову «Notes». Чтобы сделать ещё одну деталь, нужно вносить в скрипт доработки и добавить в объект ещё одно бесконечное поле.

А где найти этот скрипт?

В схеме «Инициализировать детали».

А где найти эту схему?

В разделе «Конфигурация».

Сделала по инструкции новую Деталь в карточке КЕ. После перезахода в систему - деталь не появилась. Нужно ли чистить Redis или проблема в чем-то другом?

// новая деталь никак не связана с Заметками

// новая деталь никак не связана с Заметками

или какой-то доступ к этой детали нужно создавать? у меня права сист.администратора

Да, нужно почистить Redis, чтобы деталь появилась.

У нас один сервер редис для тестовой и боевой. Если очистить кеш - то придется чистить на двух. Новую деталь я делаю на тестовой системе, на продуктиве - пока нет. После чистки - деталь появится на тестовой?

Если у Вас настроено на один сервер, но разные номера баз, то можно чистить отдельно. См. документацию по Redis.
Конечно, при чистке всего редиса деталь появится там, где она есть и не появится там, где её нет.

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

Для очистки redis не обязательно использовать команду flushall, вы можете очистить редис для конкретной базы с помощью команды flushdb. Более подробно читайте с посте - ссылка.

У нас один сервер redis на нем две базы: 0 -это боевая, 1 -это тестовая . я попытался вести flushdb 1 -получил ошибку без аргументов. Что это значит?

У нас один сервер redis на нем две базы: 0 -это боевая, 1 -это тестовая . я попытался вести flushdb 1 -получил ошибку без аргументов. Что это значит?

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

Перед выполнением команды flushdb нужно указать базу, для которой вы хотите её применить. Сделать это можно с помощью команды select <номер базы>. Подробнее можете ознакомиться, например, по этой ссылке.

спасибо

спасибо

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

Добрый день!

В версии 5.3.3.68 (Лояльность) существует для "Воздействия" возможность указать на вкладке детали "Дни недели", собственно, дни недели действия воздействия в одной части детали и время в другой части детали (в зависимости от указанного слева дня) - коробочная версия:

Рисунок 1

Но это две зависимых страницы. У меня вопрос в следующем: существует ли способ создать страницу детали похожего плана с 2-мя независимыми гридами, привязанных к двум разным таблицам? Вариант разнести страницы на 2 различные детали не подходит.

Среди перечня возможных вариантов ничего подходящего не нашел:
Рисунок 2

Прошу помощи!

Нравится

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

Виталий, этот вопрос рассматривался тут.

Вас понял - буду тестировать. Спасибо!

Пока что 2 вопроса:
1) Какую родительскую страницу указывать для самой страницы детали (т.е. самый верхний объект)? Тоже страницу реестра файлов к комментариям?
2) Какой объект указывать при добавлении детали? Таблицы у меня 2, а объект можно указать лишь один.

1. В примере по ссылке «Cтраница реестра комментариев» унаследована от «Базовая страница реестра».
2. Для детали там указан объект «Комментарий».

Впрочем, не уверен, что в этом примере детали именно независимые.

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

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

Добрый день

В карточке Инцидента:
Если в поле Заявитель.Инцидент выбран Контакт, где ТИП=Сотрудник, то: поле Происхождение.Инцидент должен автоматически подтягиваться значение из справочника "Обнаружено сотрудником".

Подскажите, пожалуйста, как из Инцидента обратиться к справочнику Контактов, а из него - к справочнику Типов. Заранее спасибо

Нравится

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

Получать значение из другой таблице по Id можно при помощи функции GetEntityTypedColumnValue. Пример её использования.
По Id контакта получаете значение его поля «Тип» и сравниваете с Id записи «Сотрудник» в справочнике типов.

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

Добрый день

Подскажите, как сделать следующее:
при нажатии на ОК в карточке Инцидента поле "План.дата завершения" становилась недоступной для редактирования всеми пользователями системы.

Нравится

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

Недоступность задаётся методом Page.PlanEndDateEdit.SetEnabled(false) у контрола. Можете на при открытии карточки на событии PageLoadComplete проверять нужное условие и в зависимости от этого делать доступным или нет.

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

Добрый день

Если я создаю Активность (Задачу) из Изменения , а к этому Изменению привязано несколько Инцидентов , то:

при нажатии на ОК в Активности нужно подвязать номер Инцидента. А если их несколько, то неудобно заходить на вкладку Инциденты в Изменении и смотреть эти номера. Можно ли при нажатии на ОК в Активности сделать сообщение с выбором этих номеров ? Т.е. я выбираю этот номер Инцидента и он указывается в поле Инцидент.Активность.

Заранее спасибо

Нравится

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

Это можно с помощью действия OpenLookupUserTask, вот пример работы с ним.

А если другой вариант:
если я в карточке Активности с типом Задача создам кнопку "молния", и при нажатии на нее - если поле изменение.активность заполнено, а поле Инцидент.Активность не заполнено, то: система выдаст список номеров Инцидентов, подвязанных к этому Изменению.

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

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

Подскажите, фильтр указывать где именно в страницу карточки задачи ?

чтобы именно при нажатии на "молнию" срабатывал фильтр?

И как сделать кнопку-молнию в опред.поле?

Кнопка «молния» добавляется в дизайнере карточки как дочерний элемент-кнопка к полю ввода.
Как прописывается логика её наполнения отфильтрованными значениями, см. тут.

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

Добрый день! Коллеги, поскажите пожалуйста, как можно получить значения выпадающего списка (comboBox).
Список значений формировался не через связь со справочником, а добавлением значений вручную, методом

AddItem()

например:

Page.usrComboBox.AddItem("test1","test1");
Page.usrComboBox.AddItem("test2","test2");
...

вопрос - где в Page.usrComboBox хранятся эти данные?
Спасибо!

Нравится

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

Влад,

Текущее значение можно получить так:

Page.usrComboBox.Value

Или Page.usrComboBox.SelectedItem, а точнее его ключ и значение:
Page.usrComboBox.SelectedItem.Text
Page.usrComboBox.SelectedItem.Value
Плюс отвечая на вопрос по поводу хранения всех данных, если вы не используете источник данных и добавляете значения в ручную, можно их кешировать в какой-то переменной для последующего использования. А выбранное пользователем значение читается как описано выше.

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

usrComboBox.value 

- в данном случае выбрасывает искючение (изза того что value - не uid а string)

Вопрос решен, спасибо!

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