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

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

Реализовал следующий код:

define("BaseAddressPageV2", ["BusinessRuleModule"], function(BusinessRuleModule) {
    return {
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "merge",
                "name": "Address",
                "values": {
                    "bindTo": "Address",
                    "controlConfig": {
                        "focus": {"bindTo": "onAddressFocused"},
                        "blur": {"bindTo": "onAddressBlur"}
                    }
                }
            }
        ]/**SCHEMA_DIFF*/,
        methods: {
            onAddressFocused: function(config) {
                                this.showAddressMask(config.scope, true);
            },
            onAddressBlur: function(config) {
                                this.showAddressMask(config.scope, false);
            },
            showAddressMask: function(scope, isShow) {
                if (isShow) {
                    var AddressMaskMessage = this.get("Resources.Strings.AddressMaskMessage");                  
                    scope.showValidationMessage(AddressMaskMessage);              
                } else {
                    scope.showValidationMessage("");
                }
            }
        }
    };
});

При фокусе и потере фокуса события срабатывают, но после выполнения функции showValidationMessage, подсмотренной в baseedit.js, сообщение не появляется.

Подскажите пожалуйста чего не хватает.

Нравится

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

а в scope у вас что? showValidationMessage - это метод контрола, на странице такого нет.
а лучше попробуйте сами отладиться

Андрей, в приложение файл config.txt с копией дерева config из консоли.

Насколько я понимаю при подписке на focus контрола, в функцию передается объект со стандартной функцией applyHighlight(она тоже срабатывает, т.к. синяя рамка отрисовываеться) которая подписана на focus контрола и scope(сам контрол).

В файле можно увидеть что в прототипе scope(контрола) есть функция showValidationMessage.
Т.е. я вызываю функцию контрола showValidationMessage, но ничего не появляется.

Что я делаю неправильно?

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

Функция showValidationMessage должна выполняться в контексте Terrasoft.BaseEdit.

В данном случае обработчик фокуса не содержит аргументов, т.е. scope – пустой.

"Павел Баштовой" написал:Функция showValidationMessage должна выполняться в контексте Terrasoft.BaseEdit.

В данном случае обработчик фокуса не содержит аргументов, т.е. scope – пустой


содержит, в т.ч. и TextEdit, в котором метод showValidationMessage присутствует, но не работает

"Дашкевич К." написал:Т.е. я вызываю функцию контрола showValidationMessage, но ничего не появляется.

Пожалуйста, уточните, что происходит при вызове этой функции, есть ли ошибки?

Также проблема может быть связана с пустым AddressMaskMessage.

"Павел Баштовой" написал:
Дашкевич К. пишет:

Т.е. я вызываю функцию контрола showValidationMessage, но ничего не появляется.

Пожалуйста, уточните, что происходит при вызове этой функции, есть ли ошибки?

Также проблема может быть связана с пустым AddressMaskMessage.

Ошибок нет, функция выполняется, но текст не выводиться.
Можно поподробнее про AddressMaskMessage.

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

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

Зато с помощью функции showValidationMessage, получается менять текст, уже выведенный с помощью стандартного механизма валидации.
Проблема в том что функция showValidationMessage выводит текст в элемент с классом class="base-edit-validation", но не отображает его style visibility=hidden. Буду искать функцию которая отвечает за его отображение.
Может подскажите как из моего контекста изменить style элемента компонента TextEdit.

Можно попробовать переопределить класс, добавив .AddClass.

Также можно вызвать SetValidationInfo c параметром isValid="true", в baseedit.js

Павел, спасибо за наводку в SetValidationInfo нашел функцию отображения контейнера с текстом валидации.

В итоге выглядит так:

define("BaseAddressPageV2", ["BusinessRuleModule"], function(BusinessRuleModule) {
    return {
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "merge",
                "name": "Address",
                "values": {
                    "bindTo": "Address",
                    "controlConfig": {
                        "focus": {"bindTo": "onAddressFocused"},
                        "blur": {"bindTo": "onAddressBlur"}
                    }
                }
            }
        ]/**SCHEMA_DIFF*/,
        methods: {
            onAddressFocused: function(config) {
                this.showAddressMask(config.scope, true);
            },
            onAddressBlur: function(config) {
                this.showAddressMask(config.scope, false);
            },
            showAddressMask: function(scope, isShow) {
                var AddressMaskMessage = this.get("Resources.Strings.AddressMaskMessage");
                var validationEl = scope.getValidationEl();
                validationEl.setVisible(isShow);
                scope.showValidationMessage(isShow ? AddressMaskMessage : "");
            }
        }
    };
});
Показать все комментарии

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

Есть где-то пример подобной реализации?

Нравится

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

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

Файлы хранятся в следующих таблицах:
Контрагенты - AccountFile
Активности - ActivityFile
Продажи - OpportunityFile
Другой объект:
Object - ObjectFile

Все объекты унаследованы от базового объекта File.
Если файлов в системе нет, то Вы можете сделать следующее:
1) Создать объект, унаследовавшись от File (UsrAllObjectsFile)
2) Добавить в него справочные поля интересующих объектов.
3) Удалить деталь "Файлы" во всех разделах.
4) Добавить свою деталь во все разделы (на примере Активностей):

UsrFiles: {
	schemaName: "FileDetailV2",
	entitySchemaName: "UsrAllObjectsFile",
	filter: {
	masterColumn: "Id",
	detailColumn: "UsrActivity"
}
}

(и разместить ее куда-то на страницу)

5) Добавить логику заполнения поля Контрагент при добавлении файла в деталь/изменении значения в поле "Контрагент" основной записи.

Недостатки:

  • Не тестировалось
  • Может замедлить быстродействие

Преимущества:

  • Записи будут отображаться на одной детальке

Другой вариант - заместить FileDetailV2 и тянуть записи из всех связанных объектов через настройки фильтрации. Но с быстродействием есть большие вопросы.

Третий вариант - заместить ObjectFile, добавив в него поле "Контрагент" и организовать логику его заполнения. А дальше сделать несколько деталей, скопировав FileDetailV2 (одну и ту же деталь нельзя использовать несколько раз на странице редактирования), и указать для разных деталей (разные объекты) полем для связи с разделом "Контрагенты".

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

"Андросов Дмитрий" написал:

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

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

Данная задача может быть решена разными способами - вариант с представлением еще один способ решения.

"Андросов Дмитрий" написал:Алексей, может лучше использовать представление?

Спасибо! Кажется, это самый простой вариант!

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

Добрый день!
При вставке элемента RICH_TEXT, его панель выглядит следующим образом:

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

Исходный код:
{
"operation": "insert",
"parentName": "CustomSelectedResultControlBlock",
"propertyName": "items",
"name": "CustomDetailedResult",
"values": {
"bindTo": "DetailedResult",
"layout": {"column": 0, "row": 0, "colSpan": 24, "rowSpan": 3},
"contentType": Terrasoft.ContentType.RICH_TEXT,
"labelWrapConfig": {
"classes": {
"wrapClassName": "justify-top"
}
},
"controlConfig": {
"imageLoaded": {
"bindTo": "insertImagesToNotes"
},
"images": {
"bindTo": "NotesImagesCollection"
}
}
}
}

Нравится

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

Здравствуйте, Наталья!

Странно - с кодом все хорошо. Данная конструкция вставляется как поле на странице редактирования вместо "Результат подробно"? Предоставьте, пожалуйста, весь код страницы редактирования ActivityPageV2.

Алексей,
Вот код страницы:

define("ActivityPageV2",
function() {
return {
entitySchemaName: "Activity",
attributes: {
},
methods: {
},
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
diff: /**SCHEMA_DIFF*/[
{
"operation": "remove",
"name": "CustomDetailedResult"
},
{
"operation": "insert",
"parentName": "CustomSelectedResultControlBlock",
"propertyName": "items",
"name": "CustomDetailedResult",
"values": {
"bindTo": "DetailedResult",
"layout": {"column": 0, "row": 0, "colSpan": 24},
"contentType": Terrasoft.ContentType.RICH_TEXT,
"controlConfig": {
"imageLoaded": {
"bindTo": "insertImagesToNotes"
},
"images": {
"bindTo": "NotesImagesCollection"
}
}
}
}
]/**SCHEMA_DIFF*/
};
});

Наталья, добрый день!

В предоставленном коде не вижу ничего, что могло бы повлиять на отображение иконок в панели инструментов детали. Возможно, в Вашей конфигурации переопределены некоторые базовые стили, в частности, стили класса .t-btn-image.

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

Олег, хорошо, воспользуюсь Вашим советом.
А можно пока скрыть панель инструментов в этом элементе до прояснения ситуации?

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

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

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

Нравится

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

Здравствуйте, Олег!

Уточните, пожалуйста, каким образом происходила регистрация страницы редактирования?

Регистрация страницы происходила в БД с помощью хранимой процедуры tsp_RegisterPage, в которой я указал объект справочника и схему страницы

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

Уточните со скриншотами какая именно кнопка пропала. А так же точный текст параметров которые вы указывали при выполнении хранимой процедуры.

Текст хранимой процедуры:
EXEC [dbo].[tsp_RegisterPage]
@ModuleEntityName = N'SxProdAndServItem',
@PageName = N'SxProdAndServItemPage',
@TypeColumnUId = NULL,
@TypeValue = NULL,
@AddMenuCaptionRus = NULL,
@AddMenuCaptionEng = NULL,
@CardHeaderCaptionRus = NULL,
@CardHeaderCaptionEng = NULL

Я имел ввиду кнопку добавления записи справочника(здесь страницы редактирования нет):

Здесь справочник, для которого я регистрировал страницу:

Здравствуйте, во первых при выполнении хранимой процедуры вам необходимо было указывать имена:

@AddMenuCaptionRus = 'добавить товар\услугу',
@AddMenuCaptionEng = 'добавить товар\услугу',
@CardHeaderCaptionRus = 'товар\услуга',
@CardHeaderCaptionEng = 'товар\услуга'

Без них страница реестра не сможет дать имя кнопке добавления на странице списка.
Во вторых, необходимо добавить и страницу реестра и указать ее в свойствах справочника, согласно инструкции:
kartochkaireestrdlyaspravochnikovv7.5.doc

Спасибо, Вы очень помогли!

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

Добрый день!

Для доступа к справочникам есть Operations permissions "CanManageLookups". Обычно она выделяется администратору.
Но есть некоторые справочники, к которым должен быть доступ у других пользователей (например, для ввода курса валют). Как можно дать доступ к этим справочникам определенным ролям, не включая Access rights "Operations" для каждого объекта всех справочников?

Нравится

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

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

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

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

Здравствуйте!
Есть задача добавить поле с выпадающим списком(наполнение справочника), значение которого будет является быстрым фильтром для реестра справочников.
Отображаться данная страница справочника будет всего в одном месте (в процессе).
Также необходимо добавить некоторую логику на возможность выбора/отмены выбора значений в реестре справочника и кастомные стили.

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

Нравится

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

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

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

Здравствуйте. Насколько мне известно у автогенерируемых страниц весьма урезанный функционал.
Поле добавить можно, но вот расширить функционал LookupPage - нет.

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

Также при изменении типа должна отрабатывать фильтрация.

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

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

Естественно, страницу, ссылающуюся на города, придется создать.

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

Здравствуйте! Пример создание преднастроенной страницы для процесса описан

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

Вам необходимо
1) создать страницу редактирования
2) унаследоваться от LookupPageV2
3) добавить на страницу поле "Тип продукта", которое будет смотреть в соответствующий справочник
4) добавить фильтрацию по значению в этом поле (для отображения записей, соответствующих значению в этом поле)
5) добавить мультивыбор. Пример реализации рекомендую посмотреть ActivityParticipantDetailV2, метод openContactLookup (выбор контакта) и addCallBack (добавления выбранных записей на деталь. В Вашей задачи решение, скорее всего будет другим, например, запись в параметр страницы).
6) Обработка заданного параметра дальнейшими элементами процесса.

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

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

В разделе контрагенты по действию открываю справочник выбора контакта:

var lookup = {
        config: {
                entitySchemaName: "Contact",
                columnName: "Owner",
                multiSelect: false              
        },
        callback: this.lookoupOwnerCallback
};
lookup.config.actionsButtonVisible = false;
LookupUtilities.Open(this.sandbox, lookup.config, lookup.callback, this, null, false, false);

Работает нормально, без ошибок.
Далее добавляю фильтрацию (в config добавляю свойство filters):
var lookup = {
        config: {
                entitySchemaName: "Contact",
                columnName: "Owner",
                multiSelect: false,
                filters: [
                        function () {
                                debugger
                                var filterGroup = Ext.create("Terrasoft.FilterGroup");
                                filterGroup.add("IsOurType",
                                        Terrasoft.createColumnFilterWithParameter(
                                                Terrasoft.ComparisonType.EQUAL,
                                                "Type",
                                                "60733efc-f36b-1410-a883-16d83cab0980"));
                                return filterGroup;
                        }
                ]              
        },
        callback: this.lookoupOwnerCallback
};
lookup.config.actionsButtonVisible = false;
LookupUtilities.Open(this.sandbox, lookup.config, lookup.callback, this, null, false, false);

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

Ошибка из консоли: "Uncaught TypeError: a.on is not a function"

Нравится

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

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

Пример решения этой задачи есть на SDK.

"Демьяник Алексей" написал:

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

Пример решения этой задачи есть на SDK.

Алексей, по статье в SDK я создавал фильтр для колонки Owner страницы редактирования контрагента и там он работает, но если этот же фильтр применять при открытии справочника контактов с помощью LookupUtilities вне страницы редактирования (в моем случае в разделе контрагента) фильтр не работает выпадает ошибка, подробно описал выше.

Изменил объявление справочника:

var lookup = {
	config: {
		entitySchemaName: "Contact",
		columnName: "UsrOwnerOPKA",
		multiSelect: false,
		lookupListConfig: {
			filters: [
				function () {
					debugger
					var filterGroup = Ext.create("Terrasoft.FilterGroup");
					filterGroup.add("IsOurType", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Type", "60733efc-f36b-1410-a883-16d83cab0980")); 
				}
			]
		}
	},
	callback: this.changeOwner
};

После этого ошибки нет, но и фильтры не работают, функция не вызываеться.

в filters ставьте не массив, а саму функцию

"Андросов Дмитрий" написал:

в filters ставьте не массив, а саму функцию

Не помогло.

В filters передал Terrasoft.FilterGroup и заработало:

var filterGroup = Ext.create("Terrasoft.FilterGroup");
filterGroup.add("IsOurType",
   Terrasoft.createColumnFilterWithParameter(
   Terrasoft.ComparisonType.EQUAL,
   "Type",
   "60733efc-f36b-1410-a883-16d83cab0980"));
 
var lookup = {
        config: {
                entitySchemaName: "Contact",
                columnName: "Owner",
                multiSelect: false,
                filters: filterGroup         
        },
        callback: this.lookoupOwnerCallback
};
lookup.config.actionsButtonVisible = false;
LookupUtilities.Open(this.sandbox, lookup.config, lookup.callback, this, null, false, false);

так у вас функция ничего не возвращает)). Ваш вариант не будет работать, если в фильтре будет использовать в качестве значения параметра какая-то переменная - он будет создан один раз и использоваться всегда в первоначальном виде.

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

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

Доброго времени суток!
У листинга есть список Параметров. При создании параметров надо выбирать к какому типу листинга они относятся, типа фильтрация. Как можно отменить для всех созданных параметров эту фильтрацию? Или хотя бы изменить. Просто допустим есть Параметр Торг для типа листинга Аренда. Мне надо добавить его и на листинг с типом Продажа. Если создавать заново, то мы создадим дубликат с таким именем. А дубликатов быть не должно.

Нравится

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

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

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

Спасибо!

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

Доброго времени суток!
Каким образом можно сменить подпись уведомления о новой визе в ком. панели? Чтоб выводилось в формате, к примеру: Заявка [номер], [цель], [получатель].

Нравится

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

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

На примере раздела "Заказы" логика реализована в OrderVisaNotificationProvider. Вам необходимо заместить логику этой схемы.

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

Уже разобрался. Формирую строку в БП, записываю в цель визы, и вывожу в ком. панель вместо имени объекта.

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

Добрый день!

Не удается обновить систему с 7.6 на 7.7

Выполняю команды для обновления баз данных:

1) успешно Terrasoft.Tools.WorkspaceConsole.exe -operation=PrevalidateInstallFromRepository -workspaceName=Default -sourcePath=C:\inetpub\wwwroot\Bpmonline_Copy\Packages -destinationPath=C:\inetpub\wwwroot\Bpmonline_Copy\Temp\ -logPath=C:\inetpub\wwwroot\Bpmonline_Copy\Log\ -cultureName=ru-RU -updateSystemDBStructure=true -autoUpdateConfigurationVersion=true

2) успешно Terrasoft.Tools.WorkspaceConsole.exe -workspaceName=Default -operation=InstallFromRepository -sourcePath=C:\inetpub\wwwroot\Bpmonline_Copy\Packages -destinationPath=C:\inetpub\wwwroot\Bpmonline_Copy\Temp\ -logPath=C:\inetpub\wwwroot\Bpmonline_Copy\Log\ -ContinueIfError=true -regenerateSchemaSources=true -updateDBStructure=true -updateSystemDBStructure=true -installPackageSqlScript=true -installPackageData=true -autoUpdateConfigurationVersion=true

3) успешно Terrasoft.Tools.WorkspaceConsole.exe -operation=ReGenerateSchemaSources -workspaceName=Default -logPath=C:\inetpub\wwwroot\Bpmonline_Copy\Log\ -ignoreLocking=True -schemaManagerNames=ProcessSchemaManager

4) возникла ошибка Terrasoft.Tools.WorkspaceConsole.exe -operation=ExecuteProcess -workspaceName=Default -processName=CreateTagTablesAndConvertFoldersProcess -excludedSchemas=Contact

Поиск процесса CreateTagTablesAndConvertFoldersProcess в рабочем пространстве Default
Процесс "CreateTagTablesAndConvertFoldersProcess" не найден в рабочем пространстве Default
Работа утилиты закончена.

подскажите плиз куда копать?

Нравится

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

Не удается обновить систему с 7.6 на 7.7

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

При компиляции конфигурации 'Default' возникли ошибки и(или) предупреждения:
UsrSourceCode1.Custom.cs(1,1) ошибка CS0116: Пространство имен не может напрямую включать в себя такие члены, как поля или методы
UsrSourceCode1.Custom.cs(2,27) ошибка CS1001: Ожидался идентификатор
UsrSourceCode1.Custom.cs(3,32) ошибка CS1001: Ожидался идентификатор
UsrSourceCode1.Custom.cs(3,33) ошибка CS1001: Ожидался идентификатор
UsrSourceCode1.Custom.cs(5,1) ошибка CS1022: Ожидалось определение типа или пространства имен, либо признак конца файла

=== 13:22:07.3074 (UTC) ===

=== 13:49:10.2951 (UTC) ===
При компиляции конфигурации 'Default' возникли ошибки и(или) предупреждения:
UsrSourceCode1.Custom.cs(1,1) ошибка CS0116: Пространство имен не может напрямую
включать в себя такие члены, как поля или методы
UsrSourceCode1.Custom.cs(2,27) ошибка CS1001: Ожидался идентификатор
UsrSourceCode1.Custom.cs(3,32) ошибка CS1001: Ожидался идентификатор
UsrSourceCode1.Custom.cs(3,33) ошибка CS1001: Ожидался идентификатор
UsrSourceCode1.Custom.cs(5,1) ошибка CS1022: Ожидалось определение типа или прос
транства имен, либо признак конца файла
Работа утилиты закончена.

=== 13:49:11.1858 (UTC) ===
C:\inetpub\wwwroot\silasveta11\Terrasoft.WebApp\DesktopBin\WorkspaceConsole>Terr
asoft.Tools.WorkspaceConsole.exe -operation=ExecuteProcess -workspaceName=Defaul
t -processName=CreateTagTablesAndConvertFoldersProcess -excludedSchemas=Contact
Поиск процесса CreateTagTablesAndConvertFoldersProcess в рабочем пространстве De
fault
Процесс "CreateTagTablesAndConvertFoldersProcess" не найден в рабочем пространст
ве Default
Работа утилиты закончена.

=== 13:50:19.9984 (UTC) ===

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

В рамках технический поддержки данный вопрос рассматривается по обращению № 0290614.

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