Создание действия, работа с реестром, создание пользовательских страниц.

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

Подскажите пожалуйста как и/или с помощью чего возможно сделать следующее:
1. Создать действие в разделе Контрагенты;
2. По нажатию нужно получить Id отфильтрованных текущих записей реестра и вывести страницу с выбором проекта;
3. Id записей и выбранного проекта - передать в хранимую процедуру.

Нравится

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

Добрый день, Константин!
Без написания определенного количества кода тут не обойтись.
1. Действия в разделе создаются с помощью переопределения метода "getSectionActions". Пример см. в ContactSectionV2, пакет UIv2.
2. Запросить все отфильтрованные записи можно двумя способами. Если в разделе постраничная загрузка (когда записи загружаются по мере пролистывания страницы вниз), то нужно делать ESQ-запрос, который вытащит все записи из БД. Посмотрите на метод loadGridData в GridUtilitiesV2. В нем последовательно подготавливается запрос, а затем выполняется. Вам нужно точно также вызвать эти методы, кроме initQueryOptions, потому что в нем устанавливается количество строк для чтения.
Отобразить страницу выбора из справочника можно с помощью метода Open, который определен в LookupUtilities. Пример в EmailPageV2, метод openRecepientLookupEmail.
3. Хранимую процедуру с клиента вызвать нельзя. Это можно сделать только с сервреного кода. Для этого можно создать БП с входящим параметром, в который передавать выделенные записи (как запускать БП с клиента см. тут). Другой вариант - написание конфигурационного веб-сервиса, см. здесь.
Вызов хранимой процедуры. Пример см. в процессе страницы BaseObjectRecordRightsGridPage, метод RowsDeleteMethod.
Но тут может возникнуть проблема, связанная с ограничением длины строки http-запроса. Обойти можно так: вместо выполнения запроса к БД на клиенте и передаче результатов на сервер, передавать на сервер параметры запроса в JSON и выполнять его уже на сервере. Эта задача довольно сложная, примеров дать не могу. Как получить фильтры раздела посмотрите в BaseSectionV2, метод getFilters.

Добрый день, Андрей!
Большое вам спасибо.
Я не уверен что правильно вас понял или вы меня. По поводу второго пункта, есть много динамических групп, т.е. фильтры постоянно меняются, значит мои действия:
- получаю с помощью getFilters текущие фильтры раздела,
- на основе полученных фильтров делаю запрос в БД,
- хранимая процедура отпадает, нужно просто получить ID записей и добавить в другою таблицу несколько записей со значением поля Account = полученные ID (насколько я уже знаю с помощью это можно без проблем сделать из клиентской части)

"Андрей Каспаревич" написал:Но тут может возникнуть проблема, связанная с ограничением длины строки http-запроса. Обойти можно так: вместо выполнения запроса к БД на клиенте и передаче результатов на сервер, передавать на сервер параметры запроса в JSON и выполнять его уже на сервере. Эта задача довольно сложная, примеров дать не могу. Как получить фильтры раздела посмотрите в BaseSectionV2, метод getFilters.

По поводу этого, у меня есть два примера, остались с какого то выбинара, на сколько я понял там делается примерно то что вы описываете?

Есть ли возможность в замещающей схеме AccountSectionV2, получить коллекцию записей раздела this.get("GridData") и пройтись по ней. Или там будут храниться все записи раздела несмотря на фильтрацию динамической группы.

Если есть возможность подскажите пример перебора коллекции GridData.
Пока нашел только перебор выделенных записей:
var selectedRows = this.getSelectedItems();
Terrasoft.each(selectedRows,
function(rowId) {
var rowName = gridData.get(rowId).get("Name");
rowNames += rowNames === "" ? rowName : "\n" + rowName;
});

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

Terrasoft.each(this.get("GridData").getItems(), function (item) {
                        console.log(item.get("Id"));
                    });

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

"Андрей Каспаревич" написал:Отобразить страницу выбора из справочника можно с помощью метода Open, который определен в LookupUtilities. Пример в EmailPageV2, метод openRecepientLookupEmail.

Спасибо.

Константин, в конфиге параметр multiSelect:

getLookupConfig: function(columnName) {
					var scope = this;
					var callback = function(args) {
						scope.onLookupSelected(args);
					};
					return {
						config: {
							entitySchemaName: "VwRecepientEmail",
							columnName: columnName,
							columns: ["ContactId"],
							filters: Terrasoft.createColumnIsNotNullFilter("ContactId"),
							multiSelect: true //надо false
						},
						callback: callback
					};
				},

Андрей, спасибо, не заметил.

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