Доброго дня!

BPM 7.5. Может глупый вопрос задаю. Как я понял, и поддержка вроде подтвердила, имя лукапной колонки в объекте должно 1 в 1 совпадать с именем того объекта, на который эта колонка ссылается, иначе не будут работать некоторые штуки - например, не будет возможность сделать EntitySchemaQuery запрос - будет ошибка, что таблица не найдена.

А что делать в случае, когда несколько колонок объекта ссылаются на один и тот же объект, как их именовать?

Заранее благодарю!

Нравится

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

Добрый день!

Вы сами ответили на свой вопрос.
В приложении bpm'online такая реализация не возможна, когда «несколько колонок объекта ссылаются на один и тот же объект» .
Выход: только через создание нескольких view, но с разными именами или дублирующих справочников.

Приятного дня!

"Вильшанский Дмитрий" написал:

Добрый день!

Вы сами ответили на свой вопрос.

В приложении bpm'online такая реализация не возможна, когда «несколько колонок объекта ссылаются на один и тот же объект» .

Выход: только через создание нескольких view, но с разными именами или дублирующих справочников.

Приятного дня!

Если я правильно понял вопрос, то и поддержке и Вам можно поставить двойку.
Интересно, как Вы объясните наличие и работоспособность полей "Контрагент" и "Поставщик" в карточке "Счет". Они вполне успешно ссылаются на контрагентов.

Спасибо за ответ!

Жаль..
По моему такая возможно должна быть из коробки каким-то образом реализована. Например, есть сущность "Candidate", у него поля "Assigned recruited", "Assigned searcher", оба должны брать значения из объекта "Employees" (или "Contacts"). Получается я должен создавать вьюшки для рекрутёров и сёрчеров, а в "Employees" добавлять признаки "Is recruiter", "Is searcher" ? Как-то не по феншую :(

"Валерий Андрусик" написал:Если я правильно понял вопрос, то и поддержке и Вам можно поставить двойку.
Интересно, как Вы объясните наличие и работоспособность полей "Контрагент" и "Поставщик" в карточке "Счет". Они вполне успешно ссылаются на контрагентов.

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

Однако, я ранее сталкивался с проблемой, когда необходимо было выполнить EntitySchemeQuery запрос из JS такого вида:

var esqCand = this.Ext.create("Terrasoft.EntitySchemaQuery",
{
		rootSchemaName: "UsrVacancyCandidates"
});
esqCand.addAggregationSchemaColumn("UsrCandStat.Value", Terrasoft.AggregationType.MAX, "Value");

При этом колонка UsrCandStat (ссылка на таблицу UsrCandStat ) таблицы UsrVacancyCandidates называлась не так, как таблица, а, например, UsrCandSt. И запрос падал с ошибкой, пока я не переименовал (по совету поддержки) поле 'UsrCandSt' на такое же имя, как таблица, на которую она ссылается ('UsrCandStat').

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

"trickbz" написал:При этом колонка UsrCandStat (ссылка на таблицу UsrCandStat ) таблицы UsrVacancyCandidates называлась не так, как таблица, а, например, UsrCandSt. И запрос падал с ошибкой, пока я не переименовал (по совету поддержки) поле 'UsrCandSt' на такое же имя, как таблица, на которую она ссылается ('UsrCandStat').

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

"trickbz" написал:
Валерий Андрусик пишет:

Если я правильно понял вопрос, то и поддержке и Вам можно поставить двойку.

Интересно, как Вы объясните наличие и работоспособность полей "Контрагент" и "Поставщик" в карточке "Счет". Они вполне успешно ссылаются на контрагентов.

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

Однако, я ранее сталкивался с проблемой, когда необходимо было выполнить EntitySchemeQuery запрос из JS такого вида:

var esqCand = this.Ext.create("Terrasoft.EntitySchemaQuery",

{

                rootSchemaName: "UsrVacancyCandidates"

});

esqCand.addAggregationSchemaColumn("UsrCandStat.Value", Terrasoft.AggregationType.MAX, "Value");

При этом колонка UsrCandStat (ссылка на таблицу UsrCandStat ) таблицы UsrVacancyCandidates называлась не так, как таблица, а, например, UsrCandSt. И запрос падал с ошибкой, пока я не переименовал (по совету поддержки) поле 'UsrCandSt' на такое же имя, как таблица, на которую она ссылается ('UsrCandStat').

Первоначальный вопрос был не до конца понят.
Ответ:
1. Имя лукапной колонки должно совпадать 1 в 1 со справочником – да
2. Если необходимо, что бы несколько колонок ссылалось на один и тот-же справочник, необходимо в конфигурации добавить новое поле, типа справочник и указать нужную сущность
Как пример действительно подойдет Invoice (поля Account и Supplier).
3. Все используемые имена должны совпадать в конфигурации и на карточке 1:1 c учетом реестра
4. Пример агрегирующего вызова:

var select = Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: "Invoice"     
});
select.addAggregationSchemaColumn("Supplier.Name", Terrasoft.AggregationType.COUNT, "Count");
select.filters.add(select.createColumnFilterWithParameter(
                Terrasoft.ComparisonType.EQUAL, "Supplier.Name", "Test"));
select.getEntityCollection(function(result) {
                if (result.success) {
                               var collection = result.collection;
                               collection.each(function(item) {
                                               console.log(item.get("Count"));
                               }, this);
                }
}, this);
Показать все комментарии

Добрый день.

При замещении базового объекта возникает следующая ошибка:

Ошибка сохранения: Введение ограничения внешнего ключа (FOREIGN KEY) "FK2J2iqfKkMp0jtMuJaM78caLDQY" для таблицы "DocumentProduct" может привести к появлению циклов или множественных каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION либо измените другие ограничения внешнего ключа (FOREIGN KEY).
Нельзя создать ограничение. См. предыдущие ошибки.

Нашла аналогичный топик:

https://community.terrasoft.ru/forum/topic/11534

Там предлагается делать следующее:

ALTER TABLE DocumentProduct
DROP CONSTRAINT FK2J2iqfKkMp0jtMuJaM78caLDQY

Но у меня в sql возникает другая ошибка:

Сообщение 3728, уровень 16, состояние 1, строка 1
FK2J2iqfKkMp0jtMuJaM78caLDQY не является ограничением.
Сообщение 3727, уровень 16, состояние 0, строка 1
Нельзя удалить ограничение. См. предыдущие ошибки.

Нравится

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

Здравствуйте Александра,

обычно такая ошибка в SQL Server Management Studio возникает при втором и больше выполнении срипта на удаление объекта. После первого выполнения скрипта соостветстсвующее ограничение удаляется из системной таблицы sys.foreign_keys. Если выполнить тот же скрипт еще раз, то система не сможет больше найти нужную запись в sys.foreign_keys, поэтом скажет, что данный объект не является ограничением. Пожалуйста перекомпилируйте объект еще раз.

"Александр Ведмидь" написал:

Здравствуйте Александра,

обычно такая ошибка в SQL Server Management Studio возникает при втором и больше выполнении срипта на удаление объекта. После первого выполнения скрипта соостветстсвующее ограничение удаляется из системной таблицы sys.foreign_keys. Если выполнить тот же скрипт еще раз, то система не сможет больше найти нужную запись в sys.foreign_keys, поэтом скажет, что данный объект не является ограничением. Пожалуйста перекомпилируйте объект еще раз.

Компилировала несколько раз, перезапускала IIS, все то же самое.

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

Здравствуйте Александра,

Разобрался с причиной проблемы на похожем примере с таблицей AccountBillingInfo, дело в том, что базовый AccountBillingInfo содержит поле AccountId, которое ссылается на таблицу Account с каскадным удалением. При замещении объекта система пытается создать такую же каскадную связь для этого поля, что приводит к ошибке, которую мы видим в дизайнере.
Чтобы найти это ограничение выполняем скрипт:

SELECT fk.name [constraint name], obj.name [parent table name], o.name [referenced table name]
FROM sys.foreign_keys fk
INNER JOIN sys.objects o
ON fk.referenced_object_id = o.object_id
INNER JOIN sys.objects obj
ON fk.parent_object_id = obj.object_id
WHERE (fk.delete_referential_action_desc = 'CASCADE' or fk.update_referential_action_desc = 'CASCADE') and obj.name IN ('Account', 'AccountBillingInfo', 'Contact', 'Country')

После чего можем либо удалить найденное ограничение (подставьте найденное имя ограничения)
ALTER TABLE [dbo].[AccountBillingInfo]
drop CONSTRAINT [FKMEzS5qAz0Eo3Zxv0YomqG1h6Js]

либо убрать каскадную связь на удаление

--drop constraint at first
ALTER TABLE [dbo].[AccountBillingInfo]
drop CONSTRAINT [FKMEzS5qAz0Eo3Zxv0YomqG1h6Js]
--create again without cascade actions
ALTER TABLE [dbo].[AccountBillingInfo] WITH CHECK ADD CONSTRAINT [FKMEzS5qAz0Eo3Zxv0YomqG1h6Js] FOREIGN KEY([AccountId])
REFERENCES [dbo].[Account] ([Id])
--ON DELETE CASCADE
GO

И перекомпилировать объект.
Больше ошибка на моей конфигурации не воспроизводилась.

Работает! Огромное спасибо!

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

Здравствуйте, уважаемая поддержка и пользователи BPM 7.5 (и других версий тоже)!

Изучаем BPM, и пока что работаем без SVN.
Работа происходит очень топорно:
1. На тестовом сервере имплементируется решение путём изменения объектов, схем, и т.п.
2. Решение работает.
3. На будущем продакшн сервере повторяется та же последовательность действий...

1. В итоге делается double work
2. В процессе повторения действий на будущем продакшн сервере легко ошибиться.
3. Не видно, кто и что менял. Да и что сам менял.
4. Нельзя откатить часть того, что менял, кроме как ресторить бэкап БД.
5. Нельзя сравнить старое с новым.
6. И т.п. и т.д.

Не смог найти нормальной документации по теме - как прикрутить SVN к BPM 7.5.
С BPM знаком пару недель, поэтому голова кругом от других задач, дык еще и SVN нет.

Возможно, есть какая-то подробная документация у поддержки или пользователей, которые уже подняли SVN для BPM 7.5. Поделитесь, пожалуйста!

Доброго дня!

Нравится

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

Добрый день!

На данный момент Вы можете воспользоваться документацией по установке и настройке SVN, перейдя по следующей ссылке:

http://academy.terrasoft.ru/documents/?product=SDK&ver=7.5.0 ,

раздел "Разработка конфигураций на платформе" -> "Работа с системой управления версиями" -> "Система управления версиями: назначение, установка, настройка"

SVN documentation

Если Вы не найдете ответы на свои вопросы, сообщите нам. Всегда рады помочь!

А я правильно понимаю, что к on-demand SVN не прикручен?

"Мамедов Фариз Эльдарович" написал:А я правильно понимаю, что к on-demand SVN не прикручен

Если у вас нет действий, связанных с свн в настройке конфигурации - запросите техподдержку, чтобы они вам включили поддержку свн (это пара параметров в webconfig'ах)
Если же действия ("Открыть список хранилищ", "Обновить пакет из хранилища" и т.д.) есть - просто следуйте статье в академии
Но учтите, что привязать к свн вы сможете только новые пакеты - если надо фиксировать уже созданные элементы, придется их пересоздавать в пакете, привязанном к свн

"Андросов Дмитрий" написал:Но учтите, что привязать к свн вы сможете только новые пакеты - если надо фиксировать уже созданные элементы, придется их пересоздавать в пакете, привязанном к свн

А перенести элементы в новый пакет нельзя?

Владимир, уточните задачу и версию приложения. Зачем переносить схемы в новый пакет? Для синхронизации с SVN?

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

Доброго дня,

Есть ли возможность дебажить C# код и получать подсказки о том, какие классы, методы, свойства и т.п. доступны? Если возможно, то как?

Спасибо

Нравится

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

Добрый день!

К сожалею полноценная отладка, как Вы спрашиваете не возможна.
1. Но вы можете отлаживаться наше предложение, как предложение размещенное на сервере IIS
Здесь приведена ссылка, как это возможно сделать.
http://www.cyberguru.ru/microsoft-net/asp-net/aspnet-debugging-iss-remo…
2. Когда Вы компилируете с конфигурации наше приложение, то часть исходных файлов выгружается локально по указанному в web.config пути

(<add key="CompilerSourcesTempFolderPath" value="…).
Показать все комментарии
Технические вопросы
7.x

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

Есть сущность Вакансия. В ней добавлено виртуальное вычисляемое поле в клиентском коде модуля, Recent vacancy status. Необходимо отобразить это поле на list page вакансий (не знаю как это называется на русском в терминологии BPM). Однако, его нет в списке. Есть ли возможность добавить?

1

"UsrMostFarthestCandStatusVirtual":
{
        type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
        referenceSchemaName: "UsrVacancies",
        dataValueType: Terrasoft.DataValueType.TEXT
}

2

Спасибо

Нравится

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

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

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

Доброго дня,

Пропал стандартный справочник 'AddressType' из UI. Поискал его в базе SQL запросом - есть, должен быть в папке General, однако там его нет.

пропал лукап, какая досада

Возможно, это результат прямого вмешательства в БД, либо какой то баг BPM, который кто-то случайно воспроизвёл.

Вот SQL запрос.

SELECT
        *
FROM SysSchema sch
JOIN SysLookup l ON l.SysEntitySchemaUId = sch.UId
JOIN SysLookupFolder lf ON lf.Id = l.SysFolderId
WHERE sch.Name = 'AddressType'

Результат: addresstypelookupdisappeared.xlsx

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

Заранее благодарю!

Нравится

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

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

Для того чтобы имелась возможность редактировать данный справочник необходимо зарегистрировать его нажав [Add], при добавлении укажите уже имеющийся в системе Объект и Страницу редактирования.

Спасибо за ответ!
Мне как раз дали задачу удалить ненужные значения из справочника AddressType, чтобы не запутывать сотрудников :sad: Какой наиболее безболезненный путь вы посоветуете для решения этой задачи?

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

Сказали сделать такое:
1. Удалить из CommunicationType - alternate phone, primary phone, extension number, business phone, fax
2. AddressType - удалить всё, кроме home i business
Подозреваю, в дальнейшем также будут подобные запросы :lol: Как добавления, так и удаления значений..

Я пока сказал заказчикам, что поддержка посоветовала мне не удалять существующие значения из справочников, т.к. это может "поломать" приложение.

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

"trickbz" написал:Я пока сказал заказчикам, что поддержка посоветовала мне не удалять существующие значения из справочников, т.к. это может "поломать" приложение.

Да, это "поломает" импорт из Excel, так как он завязан на ID конкретных типов :(

В справочнике, кажется, есть поля "Использовать для контрагентов" и "Использовать для контактов"

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

Доброго дня!

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

Спасибо

Нравится

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

Данную функциональность возможно реализовать переопределив метод onGridRowChanged базового модуля BasePageV2 в пользовательском пакете.
Добавив туда логику в начало метода:
1. на проверку изменений if this.isChanged()
2. задать вопрос с помощью showConfirmationDialog
3. если ответ положительный сохранить this.save();

Спасибо, Валерий, попробую, обязательно отпишусь!

Добавил код ниже в клиенсткий код страницы UsrVacanciesPage. Работает.
Но есть пару вопросов:
1. Я добавил это лишь в UsrVacanciesPage. Возможно, это нужно будет добавить в базовую страницу BasePageV2 , чтобы это было унифицированно для всех страниц. Я так понимаю, её нужно "заместить", "унаследоваться", и переопределить под себя. Однако я еще не пробовал делать этого. Вы не подскажите алгоритм и ньюансы?
2. Диалог появляется уже тогда, когда выбрана другая сущность в списке и отображаются её детали., дальше диалог блокирует ввод пользователя. Возможно ли сделать так, чтобы диалог появлялся ДО того, как происходит переход на другую сущность, чтобы пользователь видел текущую сущность и её детали, и лишь после нажатия кнопки на диалоге переходил на слудующую?
3. Как мне сделать, чтобы кнпока "Yes" называлась скажем "Save changes" и "No" - "Discard changes"?
4. Может есть какая-то документация?

onGridRowChanged: function()
{
	if (this.isChanged())
	{
		var cfg = {
			style: Terrasoft.MessageBoxStyles.BLUE
		};
		var changedEntityPrimaryColumnValue = this.get(this.primaryDisplayColumnName);
		this.showConfirmationDialog(
			"You have unsaved changes on the the '" + changedEntityPrimaryColumnValue + ' page. Do you want to save changes?",
			function getSelectedButton(returnCode)
			{
				if (returnCode === Terrasoft.MessageBoxButtons.YES.returnCode)
				{
					this.save();
				}
			}, ['yes', 'no'], cfg
		);
	}
},

По пунктам:
1. Вы правильно думаете, что необходимо расширить страницу BasePageV2, тогда все внесенные изменения распространяться на все страницы.
Расширение страницу BasePageV2 необходимо делать в пользовательском модуле, и таким образом все страницы унаследованные от BasePageV2 получат новую логику автоматически.

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

3. Это возможно сделать. Ниже приведен пример из модуля OrderPageV2:

this.Terrasoft.utils.showMessage({
   caption: this.get("Resources.Strings.LinkProductCaption"),
   buttons: [{
      className: "Terrasoft.Button",
      returnCode: "ButtonAll",
      style: "blue",
      caption: this.get("Resources.Strings.QuestionAllCaption"),
      markerValue: this.get("Resources.Strings.QuestionAllCaption")
   }, {
      className: "Terrasoft.Button",
      returnCode: "ButtonChoice",
      style: this.Terrasoft.controls.ButtonEnums.style.GREY,
      caption: this.get("Resources.Strings.QuestionChoiceCaption"),
      markerValue: this.get("Resources.Strings.QuestionChoiceCaption")
   }, "cancel"],
   defaultButton: 0,
   style: this.Terrasoft.MessageBoxStyles.BLUE,
   handler: function(buttonCode) {
      if (buttonCode === "ButtonAll") {
         this.connectProducts(contractId);
      }
      if (buttonCode === "ButtonChoice") {
         this.openProductLookupToLink(contractId);
      }
      if (buttonCode === "cancel") {
         this.openContractPage(contractId);
      }
   },
   scope: this
});

4. К сожалению документации нет.

"Вильшанский Дмитрий" написал:1. Вы правильно думаете, что необходимо расширить страницу BasePageV2, тогда все внесенные изменения распространяться на все страницы.
Расширение страницу BasePageV2 необходимо делать в пользовательском модуле, и таким образом все страницы унаследованные от BasePageV2 получат новую логику автоматически.

Спасибо за ответ!
А вы не могли бы по шагам в обзорном виде расписать как правильно замещать страницы? Никогда этого не делал, боюсь что-то поломать. Нужно ли копировать полный код замещаемого модуля? Если не нужно, то какой минимальный скрипт дожен быть скопирован? Как правильно в этом скрипте заместить метод, может какой то особый синтаксис?

Код копировать не надо, нужно указать в качестве родителя BasePageV2, особого синтаксиса нет.
Минимальный код нового модуля:

define("BasePageV2", [],
                function() {
                               return {
                                               diff:  []
                               };
                });

Замещение метода происходит путем вставки нужного кода в метод, который имеет такое же название как родитель.
Если необходимо добавить вызов код родительского метода это делается строкой:
this.callParent(arguments);

Пример двух методов из страницы ActivityPageV2

                methods: {
                /**
                * Получает признак отображения меню добавления.
                * @overridden
                * @return {Boolean}
*/
                getAddButtonMenuVisible: function() {
                                return true;
                },
 
                /**
                * Инициализирует контекстную справку
                * @overridden
                */
                                initContextHelp: function() {
                                this.set("ContextHelpId", 1010);
                                this.callParent(arguments);
                },

Здесь ссылка на видео, где это объясняется подробней

https://www.youtube.com/watch?v=T5uciYziKxY&feature=youtu.be&t=1h5m7s

Также прикрепляю файл "Требования к формату схемы, необходимые для корректной работы мастеров", в котором описано какие маркерные комментарии необходимы при создании страницы
trebovaniyakformatushemyneobhodimyedlyakorrektnoyrabotymasterov.doc

Спасибо, Дмитрий, всё получилось!
Также я нагуглил вот такое, может кому пригодится
http://www.community.terrasoft.ru/system/files/bocu/rasshirenie_i_zames…

Еще вопрос - а что такое "markerValue" ?

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

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

Мне нужно создавать что-то в "Идеях", чтобы это было рассмотрено?

Спасибо!

MarkerValue это способ находить элемент в DOM'e. Можно находить по ID, а можно находить по MarkerValue. Например если ID автогенерируемый, а Вам необходимо с данным контроллером проделать конкретные действия, то для этого можно использовать MarkerValue.

Пример:

"trickbz" написал:
trickbz пишет:

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

Данная идея будет зарегистрирована как пожелания и будет рассмотрена департаментом разработки для реализации подобного функционала в будущих версиях.
Спасибо!

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

Мне нужно создавать что-то в "Идеях", чтобы это было рассмотрено?

Спасибо!

Данная идея будет зарегистрирована как пожелания и будет рассмотрена департаментом разработки для реализации подобного функционала в будущих версиях.

Показать все комментарии
7.x
7.5
e-mail
mail
валидность
количество
корректный
проверка
увеличить
email

В базовой версии приложения 7.х для поле «E-mail» стоит проверка того, чтобы после точки количество символов было от 2 до 4 (например, mailtest@yandex.ru или mailtest@gmail.com).

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

Если все таки необходимо изменить диапазон, то алгоритм реализации будет следующим:

  1. Перейти в раздел «Конфигурация»;
  2. Добавить «Замещающий клиентский модуль» (Рис. 1) и указать в поле «Родительский объект» - «EmailHelper» (Рис. 2);

  3. Рис. 1


    Рис. 2

  4. Далее необходимо в разделе «Конфигурация» открыть родительский объект «EmailHelper» и скопировать весь код;
  5. В замещенный объект вставить ранее скопированный код;
  6. Далее в строке:
  7. var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;

    изменить диапазон проверки с 2 до 4 на желаемый (выделено черным). Например, с 2 до 10 символов (Рис. 2).

  8. И сохраняем изменения объекта (Рис. 3). В результате должна возникать сообщение, что изменения успешно сохранены;

  9. Рис. 3

  10. Компилируем конфигурацию ("Скомпилировать измененное");
  11. Обновляем страницу приложения в браузере.

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

Нравится

Поделиться

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

Добрый день!

Как быстро создать новый тип активности в 7.3?
Пробовала через Мастер раздела, но выдает ошибку, что активность можно добавить только через справочник. Хотя новый тип документа через мастер раздела добавить получилось.
В чем может быть проблема?

Нравится

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

Добрый день,

как и говорится в уведомлении, новый тип активности можно создать, добавив сперва соответствующую запись в Справочник "Типы активностей"

Спасибо!

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

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

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

Допустим, есть таблица UsrIssues, в ней есть лукапная колонка UsrIssueType - внешний ключ на таблицу UsrIssueType. Т.е. исходные данные для SQL - строки "UsrIssues" и "UsrIssueType". Необходимо получить UId колонки UsrIssueType, тот, что мы получаем, открывая метаданные объекта UsrIssue, и поиском по тексту ищем строку "UsrIssueType", и копируем UId сверху.

Вообщем, вопрос - можно ли забрать данные из метаданных с помощью SQL.

Спасибо!

Нравится

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

Можно:

select p.name, p.value
from sys.extended_properties p
inner join sys.tables t on p.major_id = t.object_id
inner join sys.columns c on c.object_id = t.object_id
where t.Name = 'FIAS' --таблица
and c.Name = 'Address' --колонка
and p.Name = 'TS.EntitySchema.UId' --extended property name

Здесь пример запроса получение UId для таблицы 'Contact'и колонки 'SalutationTypeId'

SELECT value AS [UId]
FROM sys.extended_properties AS ep
INNER JOIN sys.tables AS t ON ep.major_id = t.object_id
INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id
WHERE class = 1
and ep.name = 'TS.EntitySchemaColumn.UId'
and t.name = 'Contact'
and c.name = 'SalutationTypeId'
order by t.name;

Спасибо обоим! Валерий, у меня получилось длиннее, спасибо за коротку версию :lol:

declare @detailObjectName nvarchar(255) = 'UsrCandNotewortev';
declare @typeColumnName nvarchar(255) = 'AnniversaryType';
declare @typeColumnNameFull nvarchar(255) = @typeColumnName + 'Id';
declare @majorId int, @minorId int;
 
select top 1 @majorId = p.major_id, @minorId = p.minor_id
FROM sys.extended_properties p
INNER JOIN sys.TABLES t ON p.major_id = t.object_id
INNER JOIN sys.COLUMNS c ON c.object_id = t.object_id
WHERE 
	t.Name = @detailObjectName
	AND c.Name = @typeColumnNameFull
	AND p.name = 'TS.ColumnName' 
	AND p.value = @typeColumnNameFull;
declare @typeColumnUId uniqueidentifier = 
(
	select top 1 CONVERT(uniqueidentifier, p.value) 
	from sys.extended_properties p 
	where 
		p.major_id = @majorId 
		and p.minor_id = @minorId 
		and p.name = 'TS.EntitySchemaColumn.UId'
);
select @typeColumnUId as TypColumnUId

Сделал функцией:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[GetColumnUId]
(
	@tableName nvarchar(255)
	,@columnName nvarchar(255)
)
RETURNS uniqueidentifier
AS
BEGIN
	declare @columnUId uniqueidentifier;
 
	SELECT @columnUId= CONVERT(uniqueidentifier, value)
	FROM sys.extended_properties AS ep
	INNER JOIN sys.tables AS t ON ep.major_id = t.object_id
	INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id
	WHERE 
		class = 1
		and ep.name = 'TS.EntitySchemaColumn.UId'
		and t.name = @tableName
		and c.name = @columnName
	order by t.name;
 
	return @columnUId;
END
GO

Вариант покороче, ну точно попроще, оказывается, есть спец-таблица..

declare @tableName nvarchar(255) = 'UsrVacancies';
declare @columnName nvarchar(255) = 'UsrCustomer';
 
select
	sch.Name TableName
	,esr.ColumnName
	,esr.ColumnCaption
	,ColumnUId
from SysEntitySchemaReference esr
join SysSchema sch on sch.Id = esr.SysSchemaId
where 
	sch.Name = @tableName
	and esr.ColumnName like @columnName
Показать все комментарии