Создание действия, работа с реестром, создание пользовательских страниц.
Здравствуйте.
Подскажите пожалуйста как и/или с помощью чего возможно сделать следующее:
1. Создать действие в разделе Контрагенты;
2. По нажатию нужно получить Id отфильтрованных текущих записей реестра и вывести страницу с выбором проекта;
3. Id записей и выбранного проекта - передать в хранимую процедуру.
Нравится
Добрый день, Константин!
Без написания определенного количества кода тут не обойтись.
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 }; },