Коллеги, добрый день.

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

Нравится

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

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

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

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

Нравится

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

Здравствуйте, Илья Сергеевич!

Перенести схемы можно с помощью функциональности экспорта/импорта схем. Подробнее с этим механизмом можно ознакомится на Академии Terrasoft:

https://academy.terrasoft.ru/documents/technic-sdk/7-9/perenos-izmeneni…

Описанный способ переноса схем имеет ряд ограничений, одним из них является то, что, если Вам помимо схем нужно перенести привязанные данные, то с помощью экспорта/импорта Вы этого не сделаете. Более расширенные возможности для переноса изменений имеет WorkspaceConsole.
Подробное описание этих возможностей Вы найдете по ссылке:

https://academy.terrasoft.ru/documents/technic-sdk/7-9/perenos-izmeneni…

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

"Севостьянов Илья Сергеевич" написал:имеется ли вообще возможность переноса схем и объектов созданных в пакете custom в обособленный пакет.

Предлагаю немного кривой способ:
1) Создать свой пакет под Custom (допустим унаследоваться от SalesEnterpriseSoftKeyRus), добавить в св-вах Custom только что созданый пакет в зависимости (вкладка зависимые пакеты)
2) пересохранить все схемы/объекты/коды в custom. При сохранении указать свой пакет
pic
3) Если схем много, то беда)))

Здравствуйте, Илья.

"Севостьянов Илья Сергеевич" написал:

Ознакомились с указанной статьей на академии касательно WorkSpaceConsole.

Но к сожалению в ней не содержатся сведения касаемо поставленного вопроса, там представлена информация по переносу пакетов преимущественно.

Не могли бы вы предоставить информацию касаемо того как переносить с его помощью схемы между пакетами (я так понимаю через WorkSpaceConsole имеется возможность произвести миграцию вместе с данными ?)

Одной из особенностей пакета Custom является тот факт, что его схемы можно перенести в другое приложение/другой пакет только при помощи экспорта и импорта. В отличие от других предустановленных пакетов, пакет [Custom] нельзя выгрузить в файловую систему при помощи утилиты WorkspaceConsole. Также, наследоваться от пакета [Custom] и устанавливать вместо данного пакета любой другой пакет в качестве корневого крайне не рекомендуется!
При необходимости разработать значительный объем новой функциональности более целесообразным будет создание нового пользовательского пакета с использованием SVN.

3) Если схем много, то беда)))

Да, беда.

Проблем целый ворох:
1) Обяъвленные в Custom сущности никак не расширить в пользовательском пакете, т.к. зависеть от Custom - нельзя (конфигуратор "защтой от дурака" просто не дает этого делать) вручную в SysPackageDependency можно реализовать необходимое дерево, но в таком случае:

  • Такой пакет фиксируется в хранилище, но с него потом никуда не устанавливается (Custom специфический пакет у него нет версии и хранилища - получаем ошибки при установке пакета), и единственный способ - ручной коммит с правкой descriptor.json в корне бранча в котором зависимость от Custom, и уже после установки SQL-сриптом возвращать зависимости в необходиомое состояние
  • Пользовательский пакет для такой системы обязан быть "текущим" иначе перестают работать все мастера (страниц, раздела, БП)

2) Расширение функционала сущностей из Custom можно делать в пакетах располагающихся "вилкой", т.е. параллельно Custom в дереве зависимостей, тогда приложение функционирует корректно, остаются все те-же проблемы с работой мастеров, но это можно преодолеть например со страницами и разделами - создавая все вручную, а вот с бизнес-процессами проблема просто нерешаема, в мастере просто нет возможности использовать сущности и поля из "параллельных пакетов"
3) Ни в коем случае нельзя устанавливать зависимость самого Custom от пакета в котором есть какая-либо замещающая схема или объект этого самого Custom - такой выпад - вообще приводит систему в неработоспособное состояние после компиляции с ошибкой "зависимости".

Дополню предыдущий комментарий, что c другими особенностями работы с пакетом [Custom] Вы можете ознакомиться в документации:

https://academy.terrasoft.ru/documents/technic-sdk/7-9/paket-custom

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

Каким образом можно привязаться на заход пользователя в систему? В частности нужно изменять значение системной настройки. По сигналу от SysAdminUnit (поля LoggedIn) в БП не выходит, очевидно потому-что значение поля задается не через Entity.

Нравится

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

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

При входе пользователя в систему запускается процесс GetRemindingCounter. Аналогично можно запустить ваш процесс.
Как вариант можно создать триггер на объект SysAdminUnit, который будет менять значение в таблице SysSettingsValue.

Сделал триггером, только на таблицу SysUserSession на добавление записи, т.к. в SysAdminUnit значение LoggedIn не всегда соответствует действительности.

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

Добрый день.

Есть р. Контакты с несколькими карточками редактирования в зависимости от типа контакта.

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

Предполагаемая реализация:
1. Создать Базовую клиентскую схему с нужным набором полей и логикой.
2. При создании нового типа контакта в событии ContactTypeInserting:
а) Произвести вставку в SysSchema новой записи клиентской схемы с указанием ParentId (Id Базовой клиентской схемы из п. 1)
б) Произвести регистрацию новой схемы редактирования в SysModuleEdit.

В связи с этим возникает ряд вопросов:
1. Каким образом программно вставить/ изменить код новой клиентской схемы?
2. Каким образом программно изменить значения локализованных строк новой клиентской схемы?
Возможно упустил ещё нюансы.

Прошу подсказать куда стоит копать.

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

Нравится

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

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

Решить задачу можно использованием бизнес-процесса. Процесс будет начинаться элементом "Сигнал" по событию добавления записей в объект "Тип контакта".

Далее элементом "Задание-сценарий" необходимо добавить соответствующие записи в таблицы:
1) SysSchema
2) SysModuleEdit

Записи можно добавить при помощи CRUD операций. Подробнее:
https://academy.terrasoft.ru/documents/technic-sdk/7-9/postroenie-zapro…

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

Алексей, спасибо за ответ.

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

Не могли бы подсказать, какие механизмы "из коробки" я мог бы использовать для генерации метаданных?

Игорь, здравствуйте!

Что можно сделать?

  • Настроить страницу редактирования, которая должна создаваться при добавлении типа
  • Сохранить значение MetaData этой схемы из таблицы SysSchema
  • Использовать это значение при генерации новых схем. В MetaData необходимо подменить UID, название и заголовок схемы

Альтернативный вариант - эмулировать создание страницы из мастера раздела. Однако быстрее и проще создавать страницу через SQL запросы.

"Демьяник Алексей" написал:В MetaData необходимо подменить UID, название и заголовок схемы

"Демьяник Алексей" написал:Однако быстрее и проще создавать страницу через SQL запросы.

Я так понимаю, что нужно ещё сгенерировать данные для таблиц SysSchemaContent, SysSchemaResources, SysSchemaProperties, SysSchemaSources и других.

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

Пример генерации карточки можно посмотреть при помощи SQL Profiler'а.

Необходимо учесть, что часть таблиц используется как развязка, а часть используется как хранение информации. Где присутствует поле из типом varbinary(MAX), в котором хранится сама схема или ресурс.

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

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

Нравится

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

Мы создавали VIEW с использованием Linked Server в MS SQL. А уже на основании VIEW делали объекты для деталей

"Владимир Соколов" написал:

Мы создавали VIEW с использованием Linked Server в MS SQL. А уже на основании VIEW делали объекты для деталей


Владимир можете поподробнее рассказать как Вы это делали или скинуть пример кода

"Головачев Дмитрий Александрович" написал:Владимир можете поподробнее рассказать как Вы это делали или скинуть пример кода

В том-то и прелесть, что нет кода.
1) Настраиваете Linked server, если базы у вас на разных серверах. Если на одном, то вообще всё просто - пишите VIEW как SELECT из другой базы. Не забудьте в этом VIEW добавить такие поля как Id, CreatedById, CreatedOn, ModifiedById, ModifiedOn (как в обычных таблицах)
2) В bpm'online создаете объект, отмечая, что он является отображением VIEW
3) Регистрируете деталь мастером, используете деталь на страницах.
4) Можно кодом спрятать кнопки Add, Edit, Copy, Delete. Или просто правами ограничить. Чтобы ошибки при этих действиях не сыпались.
И всё, в принципе

Как альтернативный вариант, если данные нужны в UI (в таком случае сохранение их в БД тоже Ваша задача)

Если у внешней БД есть API для HTTP запросов, и сервер БД корректно настроен на кросс-доменные запросы (см. настройка CORS).
В случаях с MS SQL Server и Windows Server это может быть ASP.NET Web API 2 with Entity Framework.

В клиентском коде JavaScript (клиентской схемы) используйте базовый XMLHttpRequest
кстати в BPMOnline есть и подключенный jQuery, т.е. и ее ajax к Вашим услугам.

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

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

Нравится

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

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

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

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

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

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

:smile:

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

ну на то он и сервер :) клиентские ресурсы само приложение и так "не слабо" задействует :)

Вот типичный пример илюстрирующий проблему.
К типовым обращениям добавлена некая логика, которой кстати непонятно почему нет в типовом решении, ну да ладно.
Реализуем статус "Прочитано/Не прочитано" на сообщениях, а так-же вводим сущность которая описывает содержит ли обращение одно или несколько непрочитанных сообщений.
Итого получаем некое поле для объекта Case для удобства пользователей значение которого выведено в колонке реестра:

Ну соответственно поле у активности с типом Email, которое так-же выведено в колонках соответствующей детали.

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

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

Вариант решения:
1. В процессе сгенерировать сообщение по Web-socket.
2. В схеме страницы редактирования подписаться на сообщения.
3. В методе “прослушки” сообщения вызывать метод который обновит страницу и отобразит актуальные данные.
Обновить страницу редактирования:
reloadEntity() – refresh page
Обновить реестр детали:
- this.updateDetails()
- this.updateDetail({detail: "DetailName"}); - где DetailName имя детали

Пример генерации и подписки на сообщение рассмотрен на форуме - http://www.community.terrasoft.ru/forum/topic/11784

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

Доброго дня
В мене винникла проблема в роботі з Terrasoft.Grid
Я створив свій окремий модуль, в ньому описав сві грід.
Заповнюю його так

function loadGridData(scope) {
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: "Product"
            });
            esq.addColumn("Id");
            esq.addColumn("Name");
            esq.addColumn("UsrFloor");
            esq.getEntityCollection(function(response) {
                var newCollection = Ext.create("Terrasoft.Collection");
                var data = response.collection.collection.items;
                Terrasoft.each(data, function (item, key) {
                    var model = Ext.create("Terrasoft.BaseViewModel", {
                        rowConfig: {
                            Id: {
                                columnPath: "Id",
                                dataValueType: Terrasoft.DataValueType.GUID
                            },
                            Name: {
                                columnPath: "Name",
                                dataValueType: Terrasoft.DataValueType.TEXT
                            },
                            UsrFloor: {
                                columnPath: "UsrFloor",
                                dataValueType: Terrasoft.DataValueType.INTEGER
                            }
                        },
                        values: {
                            Id: item.values.Id,
                            Name: item.values.Name,
                            UsrFloor: item.values.UsrFloor
                        }
                    });
                    newCollection.add(item.values.Id, item);
                }, this);
var gridData = scope.get("gridData");
                gridData.loadAll(newCollection);

При кліку на запис у мене пише що елемент з ключом не знайдений(img1.png)

Нравится

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

А в описании грида есть такой пункт?

"operation": "insert",
"name": "DataGrid",
...
"values": {
        ...
	"primaryColumnName": "Id"
        ...
}

Дякую
у мене чомусь стояв "Name"
В мене є такий описаний грід, я хочу зробити його у варіанті tiled

{
                        className: 'Terrasoft.Container',
                        id: 'gridArea',
                        selectors: {
                            wrapEl: '#gridArea'
                        },
                        classes: {
                            wrapClassName: ['container-spacing']
                        },
                        items: [
                            {
                                className: 'Terrasoft.Grid',
                                type: 'tiled',
                                primaryColumnName: 'Id',
                                activeRow: {
                                    bindTo: 'activeRowId'
                                },
                                captionsConfig: [
                                    {
                                        cols: 2,
                                        name: 'Етаж'
                                    },
                                    {
                                        cols: 12,
                                        name: 'Название'
                                    }
                                ],
                                columnsConfig: [
                                    [
                                        {
                                            row: 0,
                                            cols: 2,
                                            key: [
                                                {
                                                    name: {
                                                        bindTo: 'UsrFloor'
                                                    },
                                                    type: 'title'
                                                }
                                            ]
                                        },
                                        {
                                            row: 1,
                                            cols: 12,
                                            key: [
                                                {
                                                    name: {
                                                        bindTo: 'Name'
                                                    },
                                                    type: 'title'
                                                }
                                            ]
                                        }
                                    ]
                                ],
                                isEmpty: {
                                    bindTo: 'gridEmpty'
                                },
                                collection: {
                                    bindTo: 'gridData'
                                },
                                activeRowAction: {
                                    bindTo: 'onActiveRowSelect'
                                },
                                activeRowActions: [
                                    {
                                        className: 'Terrasoft.Button',
                                        style: Terrasoft.controls.ButtonEnums.style.BLUE,
                                        caption: 'Отркыть',
                                        tag: 'View'
                                    },
                                    {
                                        className: 'Terrasoft.Button',
                                        style: Terrasoft.controls.ButtonEnums.style.BLUE,
                                        caption: '5',
                                        tag: 'Edit'
                                    },
                                    {
                                        className: 'Terrasoft.Button',
                                        style: Terrasoft.controls.ButtonEnums.style.GREY,
                                        caption: '6',
                                        tag: 'Delete'
                                    }
                                ]
                            }
                        ]
                    }

Але в мене підписи колонок так і не проставляються, самі значення(img2)

я так понимаю надо прописать tiledConfig. Что-то наподобие:

"tiledConfig": {
	"name": "DataGridTiledConfig",
	"grid": {
		"columns": 24,
		"rows": 1
	},
	"items": [
		{
			"name": "UsrFloorGridColumn",
			"bindTo": "UsrFloor",
			"caption": "Этаж",
			"captionConfig": { "visible": true },
			"position": {
				"row": 1,
				"column": 1,
				"colSpan": 12
			},
			"type": "text"
		},
		{
			"name": "NameGridColumn",
			"bindTo": "Name",
			"caption": "Название",
			"captionConfig": { "visible": true },
			"position": {
				"row": 1,
				"column": 12,
				"colSpan": 12
			},
			"type": "title"
		}]
	}

Не уверен однако насчёт colspan. Вроде где-то слышал, что обязательно должно быть 24 заполненные яйчейки

upd. немного подправил конфиг на основе того, что возвращает GridSettingsChanged при конфигурации грида пользователем

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

Подскажите как скорректировать стили, в конкретно взятом случае ширину окна которое показывается по вызову Terrasoft.utils.inputBox
Пример вызова:

Terrasoft.utils.inputBox(
        "Заполните комментарий возврата",
        function(returnCode, controlData) {
                if (returnCode === "ok") {
                                //do something;
                }
        },
        ["ok", "cancel"],
        this,
        {
                content: {
                        customConfig: {
                                className: "Terrasoft.MemoEdit",
                                height: "200px",
                        },
                        dataValueType: Terrasoft.DataValueType.TEXT,
                        value: ""
                }
        },
        {
                defaultButton: 0,
        }
);

Как редактировать стили внутреннего поля инпута - понятно, в свойстве customConfig
Так же я пробовал передавать стили в последнем аргументе вызова в свойстве style
н/п
...
        {
            style: {width: "600px"}    
            defaultButton: 0,
        }
);

Пробовал назначить стиль через свойство classes , в данном случае я предположил что стиль требуется установить "врапперу", т.к. на странице собственно если просматривать элементы, то речь идет о
id="t-comp0-wrap" class="ts-messagebox-box ts-messagebox-border-style-blue ts-messagebox-center-position" style="height: 415px;">

...
        {
            classes: {wrapClassName: "my-custom-class"}
            defaultButton: 0,
        }
);

PS: Так же в исходных кодах найдено несколько примеров где так-же устанавливаются стили для заголовка через captionClassName - но в моем случае так-же стиль для caption-элемента не назначается.

Нравится

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

Добрый день, Илья!

Для реализации данного кейса лучше написать собственный модуль со стилями. Пример использования такого модуля можно подсмотреть по ссылке: https://academy.terrasoft.ua/documents/technic-sdk/7-9/ispolzovanie-pol…

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

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

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

Нравится

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

Первое что приходит в голову - в аттрибутах прописать вашу колонку и выставить

"isLookup": true

Хотя я бы прошелся дебагером по методу addColumnLink в GridUtilitiesV2

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

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

Юзкейс:
Верхнее горизонтальное меню. Карточка "Обращения" добавить кнопку-выпадающий список, пункты которого, фактически будут инициировать создание нового Email (активности) с разными входными параметрами и настройками фильтрации в нем относительно полей "Кому", "От кого" и.т.

Предпринятые действия: Уже ставшая обыденной проблема того что карточка может быть открыта в 2-х режимах: "Combined" и "Separated", т.е. это фактически разные схемы, а как следствие модели в текущем окружении.
1) Чтобы по 2 раза не дублировать логику создадим миксин-модуль, и соберем в нем всю необходимую функциональность: метод объявляющий пункты меню, методы-обработчики непосредственно для пунктов меню, вспомогательные методы (н/п метод помогающий получить Id текущей карточки вне зависимости от текущего режима, определяющий его по косвенным признакам и workAreaMode и соответственно получающий или this.get("Id") или this.get("ActiveRow"), или восстанавливающий его из HistoryState, или даже получающие его через "GridData" если все остальные способы не сработали)
2) Выделим в отдельный модуль - наши события, чтобы их собственно 2-ды не определять в карточках карточки и секции, в последних в свою очередь предусмотрим при инициализации карточки - регистрацию событий из объекта зависимости, при помощи this.sandbox.registerMessages, в Миксине объявим метод осуществляющий подписки на события и в схеме карточки и раздела при инициализации вызовем этот метод.
3) У "Обращения" уже предусмотрена деталь "Email", само собой нам надо будет либо вызывать карточку Email (EmailPageV2) из своего кода через openCardInChain и далее реализовывать регистрацию в детали сообщения самостоятельно, или же использовать уже готовую логику детали, и вызывать ее штатный addRecord() метод - что гораздо проще и лаконичнее.
4) Создаем замещающую схему детали в котором подписываемся на событие которое генерирую наши пункты меню, в колбэке-подписчике просто вызываем addRecord(); метод.
...Пока что все получает очень просто.
5) Далее пунктов меню 3-шт. у каждого своя "смысловая нагрузка", стало быть нам требуется организовать логику позволяющую определить какой из пунктов вызвал наш addRecord, для этого в замещающей схеме EmailPageV2 мы при инициализации генерируем событие-запрос и подписываемся на событие-ответ, на которое предварительно установлен подписчик в наших схемах карточки или секции (не важно, так как подписчики вызываются идентично из Миксина), обработчик которого в свою очередь генерирует событие-ответ, и уже в этом событии и передает все необходимые данные, в том числе и "нажатый пункт меню".

И вот тут нас поджидает сюрприз:
Для того чтобы сохранить статус (какой пункт нажат) перед вызовом события - которое инициирует в детали addRecord (это кстати косвено приводит нас к потере окружения, т.к. метод addRecord мы не контролируем лишь знаем что в конечном итоге он откроет EmailPageV2).
Так вот, сохраним значение в текущей модели - this.set("myState", myStateStringIdentifier);
Логика такова: раз наша подписка на событие-запрос осуществленная при инициализации схемы (карточки или секции) т.е. к this, а стало быть к модели, то коллбэк-обработчик которому передать при подписке this вторым аргументом будет выполняться в его окружении, а стало бы с той-же моделью, т.е. в нем можно будет получить сохраненное значение через this.get("myState").

Но это не так... Вся цепочка отлично отрабатывает в случае страницы открытой в Separate режиме - вообще без изъянов.
А вот с Combined режимом получается вот какое поведение:
замещающая схема CaseSection

                methods: {
                        "onEntityInitialized": function() {
                                this.callParent(arguments);
                                this.AskQuestionMixinSUBSRIBER(this);
                                document.scope = this;
                        },
                        "init": function() {
                                this.callParent(arguments);
                                this.sandbox.registerMessages(AksQuestionMessages.messages);
                                this.initAskQuestionMenuCollection();
                        }
                },

AskQuestionMixinSUBSRIBER - метод объявленный в миксин-модуле
                AskQuestionMixinSUBSRIBER: function(scope) {
                        this.sandbox.subscribe(
                                "AskQuestionEmailTypeRequest",
                                function() {
                                        this.sandbox.publish(
                                                "AskQuestionEmailTypeResponse",
                                                {askType: this.get("askType")},
                                                ["AskQuestion_from_Case_" +  this.getCaseID()]
                                        );
                                },
                                scope,
                                ["AskQuestion_from_Case_" + this.getCaseID()]
                        );
                }

Обработка пункта меню приводит к сохранению состояния в this.set("askType", askType)

Но коллбек будучи выполненным из Combined режима - все равно теряет окружение, несмотря на то, что во время подписки ему явно передали "scope"
Т.е. когда он выполняется - this.get("askType") // undefined
Чего кстати не происходит в Sepated режиме.

PS: Пока что я решил вопрос через расширение глобального window.Terrasoft объекта своим свойством в котором сохраняю "askType". Но по мне это "не очень решение".

Нравится

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

Здравствуйте, Илья.

Более простым решением будет:

1) Заместить в секции метод initQueryColumns - для подтягивания в GridData колонок, которые есть в карточке, однако не выведены в реестр.

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

Пример openCardInChain с передачей значений атрибутов:

this.openCardInChain({
	schemaName: "EmailPageV2",
	operation: "add",
	moduleId: "00000000-0000-0000-0000-000000000000",
	defaultValues: [{name: "atr1", value: "value 1"}, {name: "atr2", value: "value2"}]
});

про openCardInChain и преимущества этого подхода, мне известно.

А вот про

1) Заместить в секции метод initQueryColumns - для подтягивания в GridData колонок, которые есть в карточке, однако не выведены в реестр.

Хотелось бы попросить Вас написать еще пару слов, просто чтобы понимать возможности системы, может в исходных кодах какой либо конфигурации можно посмотреть юзкейз.
Я так понимаю этот метод принимает объект ESQ-запроса на исполнение, т.е. именно он и фактически получает данные в модель - так ?
Я не много не понимаю назначения метода и как с ним положено работать.

PS: у каждого окружения есть "Backbone.Model" - this.model обладающий уникальным cid, можно ли как-то обращаться к конкретной загруженной модели с заведомо известным cid ? или получить модель из БД зная ее идентификатор ?

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

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

initQueryColumns: function(esq) {
	this.callParent(arguments);
	esq.addColumn("DayType.NonWorking");
        esq.addColumn("Test");
},

В итоге получить значения в секции можно кодом:

   var a = activeRow.get("DayType.NonWorking");
   var b = activeRow.get("Test");
activeRow.get("DayType.NonWorking");

я так понимаю через this.get() ?
Или activeRow это какой-то особенный объект ?

activeRow это элемент текущей (выделенной) строки.

var activeRow = this.getActiveRow();
var b = activeRow.get("Test");

activeRow насколько я понимаю присутствует только когда карточка открыта в Combined режиме ?

Это свойство самого грида, как в реестре раздела, реестре детали так и в комбинированном режиме.

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