Добрый день коллеги! Подскажите пожалуйста, где найти "кусок кода" который отвечает за генерацию исходного кода страницы, на основании того, что мы "нарисовали" в дизайнере страницы. (Наподобии того, как ViewGenerator.js в 7х).
Ситуация следующая: после добавлении на страницу поля с типом "дата", связывании с DataSource, и компиляции - если отрыть страницу на клиенте - начинают не корректно работать остальные поля.
Если сравнивать исходный код рабочей страницы и "не рабочей" - то в последнем варианте для добавленного поля(контрол называется DateShowedEdit), в методе:

 protected virtual Terrasoft.UI.WebControls.Controls.DateTimeEdit CreateDateShowedEdit(){
        _dateShowedEdit= new Terrasoft.UI.WebControls.Controls.DateTimeEdit();
                        _dateShowedEdit.UId = new Guid("eeb97a42-0dfd-4403-b26c-1404462054a0");
                        _dateShowedEdit.Name = "DateDescr";
                        _dateShowedEdit.CreatedInSchemaUId = new Guid("18696044-f617-4347-8ec0-da74ef4166da");
                        _dateShowedEdit.ModifiedInSchemaUId = new Guid("18696044-f617-4347-8ec0-da74ef4166da");
                        _dateShowedEdit.CreatedInPackageId = Guid.Empty;
                        _dateShowedEdit.Tag = "";
                        _dateShowedEdit.CaptionColor = System.Drawing.Color.FromArgb(0,2,77,156);
                        _dateShowedEdit.Width = System.Web.UI.WebControls.Unit.Percentage(100);
                        _dateShowedEdit.DataSource = "DataSource";
                        _dateShowedEdit.ColumnUId = new Guid("a7a265bd-c473-48cf-aa29-4aee72410f18");
                        return _dateShowedEdit;
}

отсутствует свойство Kind - которое есть во всех других полях с типами дата:
например для поля EndDate:

_endDateEdit.Kind = Terrasoft.Common.DateTimeValueKind.Date;

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

Нравится

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

В 5.Х генерация происходит на уровне ядра системы, без исходников ядра её так просто не посмотреть.

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

Эта строка со свойством Kind в метаданных соответствует таким:

Метаданные для чтения:

"Kind": 1,

Реальные метаданные:

"AQ1": 1,

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

Александр, Добрый день!
Судя по всему я ошибся в том - что причиной ошибки может быть отсутствие свойства Kind (метаданные сгенерились по принципу который Вы написали - но на неправильную работу контрола это не повлияло). Временно, я обошел эту проблему с помощью "костыля" - поле не связывал с DataSource - но при инициализации страницы если данные в DataSource есть - вручную сетил в value контрола - а при сохранении - инсерт напрямую в БД.
Возможно Вы подскажете, какие варианты можно попробовать чтобы найти причину ошибки?
И еще интересует вопрос - если смотреть код на клиенте через консоль браузера, он весь в сжатом виде. В 7й версии такое сжимание js кода можно откючить в webConfig, есть ли похожие настройки для 5-ки?
Спасибо за помощь!:smile:

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

"Повалий Влад" написал:И еще интересует вопрос - если смотреть код на клиенте через консоль браузера, он весь в сжатом виде. В 7й версии такое сжимание js кода можно откючить в webConfig, есть ли похожие настройки для 5-ки?

Такой возможности нет. Разработка под 5.X — это больше серверная логика.

Спасибо, попробую создать заново.

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

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

Возникла такая задача: при выборе клиента в Заказе автоматически заполнять поля в Доставка -> Информация о получателе -> Контактный телефон(ContactNumber) и Имя получателя(ReceiverName). В замещающую страницу OrderPageV2 был добавлен код:

methods: {

init: function() {
this.callParent(arguments);
this.on("change:Client", function() {
var modelPage = this.Ext.getCmp("OrderPageV2Container").model;
var infoClient = modelPage.get("Client");
this.set("ReceiverName", infoClient.displayValue);
this.set("ContactNumber", "12345");
},
this);
}
},

Поля ReceiverName и ContactNumber автоматически заполняются, НО при нажатии на кнопку Сохранить, данные из полей пропадают. После закрытия заказа и открытия его заново, данные поля заполнены верно.

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

Нравится

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

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

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

Спасибо. Данное вами решение помогло.

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

Здравствуйте. В стандартном разделе есть функционал по кнопке "Действие" - выбрать несколько записей. При этом интерфейс строк раздела меняется, и в строках появляется поле чекбокса для выбора записи. Это все ок. Вопрос: Как реализовать механизм "выбрать все записи"? (отметить все записи галочками, одним кликом).

Нравится

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

Здравствуйте, Олег.
Вы задали данный вопрос в раках обращения 0300891
По нему Вы получите ответ.

Олег, во вложении инструкция для 7.3, но думаю, что для 7.6 тоже подойдет.
dobavlenie_deystviya_vybrat_vse.docx

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

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

Интересует вопрос получения данных контактов через Коллекции, данные в мануале ( https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/rabota-s-obekta... ) пишут, что при использовании $top=60 как GET переменную можно получить коллекции 60-ти контактов, но выдает поток только на один контакт.

Нравится

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

Добрый день.

Версия BPM 7.2

Есть ли возможность запускать бизнес-процесс в фоновом режиме? Сейчас использую такой код при нажатии на кнопку:

ProcessModuleUtilities.executeProcess(processArgs);

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

Спасибо!

Нравится

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

Добрый день!

Проблема может заключатся в логике выполнения самого процесса (нет прав доступа на записи, некорректная обработка записи).
Если логика процесса не подразумевает взаимодействие с пользователем(отобразить страницу редактирования, вопрос пользователю и т.д.) то процесс по умолчанию будет отрабатывать в фоновом режиме.
Вы верно указали, для запуска процесса используется метод executeProcess(processArgs).
Начните с простого, запустите процесс по кнопке, который обработает 1 запись и посмотрите результат.

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

На текущий момент удаленный web-сервис недоступен, возникает ошибка соединения, сообщение об ошибке попадает в лог - но во время всего этого страница пользователя блокируется, до тех пор, пока процесс не прекратит работу.

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

В какую сторону мне посмотреть?

Артем,
Попробуйте поставить в начале процесса элемента “Таймер” с какой-то задержкой. В результате будет создан триггер, который продолжит выполнение процесса в указанное время, от этого же пользователя в фоновом режиме.

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

Добрый день!

Существует ли возможность указания в url'е группы для перехода, а так же доп.фильтра?

Нравится

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

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

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

"Демьяник Алексей" написал:Вы можете создать собственные команды для командной строки для перехода в динамические группы. В результате выполнения команды будет открываться та или иная группа с предустановленными фильтрами.

Спасибо, Алексей! А команду можно указать в url'е?

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

Эмулировать команду в url нет возможности.

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

Доброго времени суток! Возникла следующая проблема:
В бизнес-процессе есть запрос:

EntitySchemaQuery CountOfOrderesq = new EntitySchemaQuery(UserConnection.EntitySchemaManager,"UsrOrderProvidersProduct");
CountOfOrderesq.IsDistinct = true;
CountOfOrderesq.AddAllSchemaColumns();
CountOfOrderesq.Filters.Add(CountOfOrderesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrOrderId", OrderId));
CountOfOrderesq.Filters.Add(CountOfOrderesq.CreateFilterWithParameters(FilterComparisonType.Greater, "UsrShipped", 0));
var CountOfOrders = CountOfOrderesq.GetEntityCollection(UserConnection);

Далее его результат вызывается в цикле

foreach (var Order in CountOfOrders){
        EntitySchema Activityschema = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
        var OrderNumber = Order.GetTypedColumnValuestring>("UsrClientsOrderId.Number");//вот здесь
        var ClientsOrder = Order.GetTypedColumnValueGuid>("UsrClientsOrderId");
        var ActivityEntity = Activityschema.CreateEntity(UserConnection);
        ActivityEntity.SetDefColumnValues();
        ActivityEntity.SetColumnValue("Title", "Повторная комплектация по заказу клиента " + OrderNumber);
        ActivityEntity.SetColumnValue("UsrComplicateAftProvidersOrder", true);
        ActivityEntity.SetColumnValue("TypeId", "ad9476d6-cec0-4c69-b361-c80db1670fb5");//тип комплектация
        ActivityEntity.SetColumnValue("OrderId", ClientsOrder);
        ActivityEntity.Save();
        ActivityEntities.Add(ActivityEntity);
}

При выполнении появляется ошибка:

Terrasoft.Common.ItemNotFoundException: Значение с именем "UsrClientsOrderId.Number" не найдено
в Terrasoft.Core.Entities.EntityColumnValueCollection.GetByName(String name)
в Terrasoft.Core.Entities.Entity.InternalGetColumnValue(String valueName)
в Terrasoft.Core.Entities.Entity.GetTypedColumnValue[TResult](String valueName)
в Terrasoft.Core.Process.UsrProcess1.ScriptTask1Execute(ProcessExecutingContext context)
в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Sql-текст запроса:

SELECT DISTINCT
 [UsrOrderProvidersProduct].[Id] [Id],
 [UsrOrderProvidersProduct].[CreatedOn] [CreatedOn],
 [UsrOrderProvidersProduct].[CreatedById] [CreatedById],
 [CreatedBy].[Name] [CreatedBy.Name],
 [CreatedBy].[PhotoId] [CreatedBy.PhotoId],
 [UsrOrderProvidersProduct].[ModifiedOn] [ModifiedOn],
 [UsrOrderProvidersProduct].[ModifiedById] [ModifiedById],
 [ModifiedBy].[Name] [ModifiedBy.Name],
 [ModifiedBy].[PhotoId] [ModifiedBy.PhotoId],
 [UsrOrderProvidersProduct].[ProcessListeners] [ProcessListeners],
 [UsrOrderProvidersProduct].[UsrProductId] [UsrProductId],
 [UsrProduct].[Name] [UsrProduct.Name],
 [UsrProduct].[PictureId] [UsrProduct.PictureId],
 [UsrOrderProvidersProduct].[UsrQuantity] [UsrQuantity],
 [UsrOrderProvidersProduct].[UsrUnitId] [UsrUnitId],
 [UsrUnit].[Name] [UsrUnit.Name],
 [UsrOrderProvidersProduct].[UsrOrderIdId] [UsrOrderIdId],
 [UsrOrderId].[Number] [UsrOrderId.Number],
 [UsrOrderProvidersProduct].[UsrCompleted] [UsrCompleted],
 [UsrOrderProvidersProduct].[UsrShipped] [UsrShipped],
 [UsrOrderProvidersProduct].[UsrClientsOrderIdId] [UsrClientsOrderIdId],
 [UsrClientsOrderId].[Number] [UsrClientsOrderId.Number],
 [UsrOrderProvidersProduct].[UsrMust] [UsrMust],
 [UsrOrderProvidersProduct].[UsrProcessed] [UsrProcessed],
 [UsrOrderProvidersProduct].[UsrTotalAmountWithoutVAT] [UsrTotalAmountWithoutVAT]
 
 FROM [dbo].[UsrOrderProvidersProduct] [UsrOrderProvidersProduct]

 WITH(NOLOCK) LEFT OUTER JOIN [dbo].[Contact] [CreatedBy]
 WITH(NOLOCK) ON ([CreatedBy].[Id] = [UsrOrderProvidersProduct].[CreatedById]) LEFT OUTER JOIN [dbo].[Contact] [ModifiedBy]
 WITH(NOLOCK) ON ([ModifiedBy].[Id] = [UsrOrderProvidersProduct].[ModifiedById]) LEFT OUTER JOIN [dbo].[Product] [UsrProduct]
 WITH(NOLOCK) ON ([UsrProduct].[Id] = [UsrOrderProvidersProduct].[UsrProductId]) LEFT OUTER JOIN [dbo].[Unit] [UsrUnit]
 WITH(NOLOCK) ON ([UsrUnit].[Id] = [UsrOrderProvidersProduct].[UsrUnitId]) LEFT OUTER JOIN [dbo].[ORDER] [UsrOrderId]
 WITH(NOLOCK) ON ([UsrOrderId].[Id] = [UsrOrderProvidersProduct].[UsrOrderIdId]) LEFT OUTER JOIN [dbo].[ORDER] [UsrClientsOrderId]
 WITH(NOLOCK) ON ([UsrClientsOrderId].[Id] = [UsrOrderProvidersProduct].[UsrClientsOrderIdId])

 WHERE [UsrOrderProvidersProduct].[UsrOrderIdId] = @P1 AND [UsrOrderProvidersProduct].[UsrShipped] > @P2

Подскажите пожалуйста решение проблемы. Заранее спасибо!

Нравится

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

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

Попробуйте убрать Id в Вашем запросе:

var OrderNumber = Order.GetTypedColumnValue("UsrClientsOrder[s]Id[/s].Number");//вот здесь
var ClientsOrder = Order.GetTypedColumnValue("UsrClientsOrder[s]Id[/s]");

Приставка Id добавляется автоматически к колонкам типа Guid.

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

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

Олег,

попробуйте переименовать колонку в объекте (убрать id) и применить рекомендацию выше.

Сообщите, пожалуйста, результат.

Андрей,

Заменили данное поле на "UsrClientOrder", ошибка повторяется снова.

var ClientsOrder = Order.GetTypedColumnValue("UsrClientsOrderId");
Так же уточню, что эта строка работает, ошибка появляется именно в обращении к "UsrClientsOrderId.Number".

Олег,
давайте попробуем следующим образом:

var countColumnName = Order.AddColumn("UsrClientsOrderId.Number").Name;
var OrderNumber = Order.GetTypedColumnValue<string>(countColumnName);

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

var OrderNumber = Order.GetTypedColumnValue<string>("UsrClientsOrderIdNumber");

Выяснилось, что колонки в коллекции называются так же как в запросе, но БЕЗ точки.

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

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

так же бы не рекомендовал при составление EntitySchemaQuery запросов включать все столбцы из EntitySchema, когда в результате к примеру вам нужны только 2 или 3 столбца. Это очень сильно влияет на производительность ваших страниц.

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

Спасибо за советы! Один вопрос, а каким образом присваивается Алиас к к колонке в запросе?

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

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

в вашем примере вы получаете все колонки из EntitySchema  CountOfOrderesq.AddAllSchemaColumns(); а я бы рекомендовал получать именно те колонки которые потом будут использоваться в обработке запроса. По вопросу Алиаса для колонки в EntitySchemaQuery:  ESQ.AddColumn("ReverseRelationType.Id", "ReverseRelationTypeId")  , где  ReverseRelationTypeId это и есть наш Алиас.

Спасибо!

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

При создании email вручную-поле "От кого" заполняется автоматически. При переходе в элемент "Email" в ходе БП - данное поле не заполняется автоматически. Чтобы решить данный вопрос был добавлен данный код в карточку редактирования Email

                        methods: {
                                onEntityInitialized: function() {
                                        this.callParent(arguments);
                                        this.set("Sender", "shop@ringo.info");
                                }
                        },

Но это проблемы не решило, подскажите, что я делаю не так?

Нравится

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

Странновастенько... debbuger что говорит?

В какой объект в студии смотреть?

EmailPageV2

Такого объекта в студии не нашел :sad:

Прошу прощения, исправил свой комментарий)

Такого объекта нет в списке выгруженных при компиляции

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

Для отладки в браузере:
1) Очистите кэш браузера
2) В ресурсах (source) найдите схему EmailPageV2.

Эта схема будет содержать весь код схемы в иерархии пакетов

Для отладки в VisuakStudio:
1) Сгенерируйте исходный код (либо для всех, либо для измененных - особой разницы нет)
2) Скомилируйте измененное (либо все)

После этого схема появится. Она будет иметь название [#Package#].EmailPageV2, где [#Package#] - название пакета.

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

Для отладки в браузере:
1) Очистите кэш браузера
2) В ресурсах (source) найдите схему EmailPageV2.

Эта схема будет содержать весь код схемы в иерархии пакетов

Для отладки в VisuakStudio:
1) Сгенерируйте исходный код (либо для всех, либо для измененных - особой разницы нет)
2) Скомилируйте измененное (либо все)

После этого схема появится. Она будет иметь название [#Package#].EmailPageV2, где [#Package#] - название пакета.

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

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

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

Возникает проблема в
(anonymous function) (SchemaBuilderV2.js:338)
(anonymous function) (SchemaBuilderV2.js:126)
(anonymous function) (commonutils.js:1463)

в строке:

generatorConfig.entitySchemaName = schemaResponse.entitySchemaName; //schemaResponse = undefined

Что нужно проверить, чтоб schemaResponse был "живым"?

Нравится

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

Опишите подробнее на каком этапе появляется ошибка?

Очистил кэш браузера, всё заработало.

Видимо после добавления нового поля нужно было кэш чистить...

"AlexLS" написал:Что нужно проверить, чтоб schemaResponse был "живым"?

Добрый день!!!

проверять ничего не требуется, нужно знать четкие правила, что при создание новых разделов, страниц редактирования, деталей их обязательно нужно регистрировать в базе данных в таблицах SysModule, SysModuleLcz, SysModuleEdit, SysModuleEditLcz, SysDetail. И тогда подобные ошибки возникать у вас или вообще не будут или будут возникать очень редко.

"Власов Михаил Викторович" написал:их обязательно нужно регистрировать в базе данных в таблицах SysModule, SysModuleLcz, SysModuleEdit, SysModuleEditLcz, SysDetail

Михаил, спасибо за ответ! А как это правильно делать, где-то сказано?

"AlexLS" написал:Михаил, спасибо за ответ! А как это правильно делать, где-то сказано?

По данному вопросу есть информация на Академии, плюс данные вопросы уже не раз обсуждали на комьюнити, если поискать то можно найти ответа. Я своей практики написал сам SQL скрипты по регистрации Разделов, Страниц редактирования, Деталей и пользуюсь ими. Мне так удобнее и быстрее. Если нужно могу поделиться.

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

Михаил, спасибо!

Буду очень благодарен, если поделитесь (например, в личном сообщении)!

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

Ответ на вопрос, если кому понадобиться.
Есть две группы полей, надо их расположить рядом, чтобы они занимали по 50% от ширины(12 столбцов).
//грид для групп начало/конец
{
"operation": "insert",
"parentName": "GeneralInfoTab",
"propertyName": "items",
"name": "StartDueBlock",
"values": {
"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
"items": []
}
},
//группа начало
{
"operation": "insert",
"name": "StartGroup",
"parentName": "StartDueBlock",
"propertyName": "items",
"values": {
"layout": {
"column": 0,
"row": 0,
"colSpan": 12,
"rowSpan": 1
},
"controlConfig": {
"collapsed": false
},
"itemType": Terrasoft.ViewItemType.CONTROL_GROUP,
"items": [],
"caption": { "bindTo": "Resources.Strings.StartGroupCaption" }
}
},
//заполняем элементами группу начало
{
"operation": "insert",
"name": "el1",
"parentName": "StartGroup",
"propertyName": "items",
"values": {
"caption": { "bindTo": "Resources.Strings.el1Caption" }
}
},
{
"operation": "insert",
"name": "el2",
"parentName": "StartGroup",
"propertyName": "items",
"values": {
"caption": { "bindTo": "Resources.Strings.el2Caption" }
}
},
//группа завершение
{
"operation": "insert",
"name": "DueGroup",
"parentName": "StartDueBlock",
"propertyName": "items",
"values": {
"layout": {
"column": 13,
"row": 0,
"colSpan": 12,
"rowSpan": 1
},
"controlConfig": {
"collapsed": false
},
"itemType": Terrasoft.ViewItemType.CONTROL_GROUP,
"items": [],
"caption": { "bindTo": "Resources.Strings.DueGroupCaption" }
}
},
//заполняем группу завершение
{
"operation": "insert",
"name": "el3",
"parentName": "DueGroup",
"propertyName": "items",
"values": {
"caption": { "bindTo": "Resources.Strings.el3Caption" }
}
},
{
"operation": "insert",
"name": "el4",
"parentName": "DueGroup",
"propertyName": "items",
"values": {
"caption": { "bindTo": "Resources.Strings.el4Caption" }
}
}

Нравится

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