Коллеги, всем доброго дня!

У нас есть справочник, абсолютно обычный, никакого кастома. Некий отдельный процесс наполняет данный справочник записями в соответствии с алгоритмом своей работы, порядка 2-3 тысяч записей. После обработки данных записей пользователи производят удаление стандартными методами: Действия - Выбрать все записи, затем Удалить. По истечению некоторого времени получаем ошибку вида: "Произошла ошибка. Пожалуйста, обратитесь к администратору". Скажите, возможно есть какие-то подводные камни у данного механизма удаления, что может стать причиной такого поведения, как можно диагностировать и устранить проблему? Справочник абсолютно линейный и простой, никакого кастомного кода в нем нет, логики на объекте справочника тоже нет.

Буду признателен за любые идеи в решении данного вопроса!

Нравится

4 комментария
Лучший ответ

Добрый день. Ошибка возникает при процессе удаления? Пару вариантов, которые могут быть причинами ошибки:

- у пользователя под которым выполняется данная операция (удалить), нет соответствующих прав;  

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

Добрый день. Ошибка возникает при процессе удаления? Пару вариантов, которые могут быть причинами ошибки:

- у пользователя под которым выполняется данная операция (удалить), нет соответствующих прав;  

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

Добрый день.

 

Часто такая ошибка возникает, когда происходит свал по тайм ауту.

 

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

 

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

Алла Савельева,

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

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

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

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

 

Если Вам в какой-то момент надо удалить из таблицы вообще все записи, быстро это можно сделать SQL-запросом truncate, который нужно будет вызвать из серверной логики. Если же по условию, то останется удалять по частям в цикле с паузами по таймеру, чтобы не сильно нагружать сервер.

 

Ещё длительное удаление может быть связано с логикой, которая добавлена во встроенном или отдельном БП на событии удаления для этого объекта.  В таком случае она отработает только при удалении средствами EntiteSchemaQuery (оно происходит и при удалении пользователем вручную). А при удалении средствами класса Delete она не вызывается: будет намного быстрее, но логика не отработает, что нужно будет учесть и реализовать нужные вычисления отдельно.

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

Сценарий:

1. Заходим в раздел (для примера "Контакты")

2. Переходим на вкладку "История"

3. Раскрываем доп. меню у детали "Активности" - выбираем "Выбрать несколько записей"

4. Отмечаем любое количество записей

5. Переходим через гиперссылку-название активности

6. Нажимаем "Закрыть" на открывшейся странице

7. На странице пропала отметка о множественном выборе для отмеченных нами ранее записей



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

 

Спасибо.

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

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

 

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

 

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

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

Реализовал деталь со множественным добавлением записей в соответствии с описанием в статье https://academy.terrasoft.ru/documents/technic-sdk/7-10/mnozhestvennoe-dobavlenie-zapisey-na-detal. Код детали ниже. Столкнулся со следующей проблемой: сразу после добавления записи выделяю ее в реестре и нажимаю изменить. В консоли ошибка.

Изображение удалено.

Если открывать добавленную запись после выхода из карточки и повторного захода, то ошибки нет. Подскажите, как исправить данную ошибку.

define("Schema3Detail", ["LookupMultiAddMixin"], function() {

    return {

        entitySchemaName: "WeeklyPlanScheduleInDailyPlan",

        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,

        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,

        mixins: {

            LookupMultiAddMixin: "Terrasoft.LookupMultiAddMixin"

        },

        methods: {

            

            init: function() {

                this.callParent(arguments);

                this.mixins.LookupMultiAddMixin.init.call(this);

            },

            onActiveRowAction: function(buttonTag) {

                switch (buttonTag) {

                    case "openCard":

                        this.editRecord();

                        break;

                }

            },

            getAddRecordButtonVisible: function() {

                return this.getToolsVisible();

            },

            onCardSaved: function() {

                this.openLookupWithMultiSelect();

            },

            addRecord: function() {

                this.openLookupWithMultiSelect(true);

            },

            getMultiSelectLookupConfig: function() {

                return {

                    rootEntitySchemaName: "DailyPlan",

                    rootColumnName: "DailyPlan",

                    relatedEntitySchemaName: "WeeklyPlanSchedule",

                    relatedColumnName: "WeeklyPlanSchedule"

                };

            }

        }

    };

});

 

Нравится

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

Решали подобные проблемы. Самое простое - перечитать грид после добавления записи :)

Вариант А:

onProductInsert: function(response) {
 
this.hideBodyMask.call(this);
if (this.get("IsGridLoading")) {
	return;
}
this.beforeLoadGridData();
var filterCollection = [];
response.queryResults.forEach(function(item) {
filterCollection.push(item.id);
});
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
	rootSchemaName: this.entitySchemaName
});
this.initQueryColumns(esq);
esq.filters.add("recordId", Terrasoft.createColumnInFilterWithParameters("Id", filterCollection));
esq.getEntityCollection(function(response) {
	this.afterLoadGridData();
	if (response.success) {
	    var responseCollection = response.collection;
		this.prepareResponseCollection(responseCollection);
		this.getGridData().loadAll(responseCollection);
		this.reloadGridData(); // вот источник проблемы
	}
}, this);
}

Вариант Б - замещайте функцию editRecord:

editRecord: function(record) {
 
	var activeRow = record || this.getActiveRow();
	if (!activeRow) {
		return;
	}
	if (!this.getIsCardValid()) {
		return;
	}
	var isCardChanged = this.getIsCardChanged();
 
 
	// вот тут возникает проблема у вас. Если activeRow не объектного типа, тогда не можем получить его своейство и падаем				
	if (typeof activeRow === "object") {
		var primaryColumnValue = activeRow.get("Id");
	} else {
		var primaryColumnValue = activeRow;
	}
 
    var typeColumnValue = this.getTypeColumnValue(activeRow);
	if (isCardChanged) {
		this.set("CardState", configurationEnums.CardStateV2.EDIT);
		this.set("EditPageUId", typeColumnValue);
		this.set("PrimaryValueUId", primaryColumnValue);
		var args = {
			isSilent: true,
			messageTags: [this.sandbox.id]
		};
		this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
	} else {
		this.openCard(configurationEnums.CardStateV2.EDIT, typeColumnValue, primaryColumnValue);
	}
}

Но первый способ гарантированно решит проблему. 

 

Дмитрий, спасибо, первый вариант помог.

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

Добрый день!

Создала деталь с редактируемым реестром согласно инструкции из документации https://academy.terrasoft.ru/documents/technic-sdk/7-9/sozdanie-detali-s...
Деталь создалась корректно. Единственное, что меня смутило, что когда я выбрала вариант "Выбрать несколько записей" для данной детали, то деталь никак не изменилась. Для обычной детали появляется поле типа checkbox.
Как я могу включить возможность множественного выбора?
Пробовала добавить в attributes
// Признак множественного выбора
"multiSelect": {
// Тип данных — логический.
dataValueType: Terrasoft.DataValueType.BOOLEAN,
// Тип атрибута — виртуальная колонка модели представления.
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
// Устанавливаемое значение.
value: true
}
но ничего не изменилось.

Попутно возник второй вопрос: а что можно делать с несколькими выбранными записями? Видела возможность удаления. А есть какие-то еще варианты использования выбора нескольких записей детали?

Нравится

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

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

Для реализации множественного выбора для детали необходимо замещать действие нажатия кнопки добавления, в её обработчике открывать справочник с параметром мультивыбора, и в колбеке выбранные записи уже программно добавлять на деталь.
Пример был в соседней теме:
http://www.community.terrasoft.ru/forum/topic/24705
По поводу что еще можно делать с выбираемыми галочками записями, в принципе, что угодно, список айдишников у вас есть, можете их хоть менять, хоть удалять, статьи по EntitySchemaQuery на академии вам в помощь.

"Максим Шевченко" написал:Для реализации множественного выбора для детали необходимо замещать действие нажатия кнопки добавления, в её обработчике открывать справочник с параметром мультивыбора, и в колбеке выбранные записи уже программно добавлять на деталь.

Мне кажется, мы говорим о разных вещах. Я имела в виду функциональность, которая реализована для детали График поставок и оплат вкладки Итоги раздела Заказы. Во вложении скрины 1 и 2. Я создала деталь с редактируемым реестром Курьерская служба по инструкции. Вариант "Выбрать несколько записей" у меня есть (скрин 3), но после его выбора чекбоксы не вышли(результат на скрине 4, ожидалось, что будет как на скрине 2)

"Максим Шевченко" написал:По поводу что еще можно делать с выбираемыми галочками записями, в принципе, что угодно, список айдишников у вас есть, можете их хоть менять, хоть удалять, статьи по EntitySchemaQuery на академии вам в помощь.

Спасибо!

"Zaitova Liubov" написал:"Выбрать несколько записей"

Теперь понял. К сожелению такой возможности для ред. реестра на данный момент еще нет.

"Максим Шевченко" написал:
Zaitova Liubov пишет:

"Выбрать несколько записей"

Теперь понял. К сожелению такой возможности для ред. реестра на данный момент еще нет.


А как же деталь "График поставок и оплат" вкладки "Итоги" раздела "Заказы"? Там же эта функциональность есть.
Или она есть только в некоторых базовых деталях,а сами мы не можем создать такую деталь?

Деталь "График поставок и оплат" является уникальной и создать подобную базовыми средствами (без доработок на уровне схем) невозможно. Код самой детали Вы можете посмотреть в схеме SupplyPaymentDetailV2 из пакета Passport.

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

Добрый день.

Создала деталь с выбором из справочника [ConfigItemModel] (создавала на основе примера: создание детали...)
Для детали был создан объект [UsrModelCIInSupplies].
Возникли ошибки при вызове окна справочника

1 ошибка
изображение 1
При этом окно справочника открывается, закрывается, дает фильтровать и дает возможность множественного выбора

2 ошибка. Вы выборе данных, они не вставляются в объект [UsrModelCIInSupplies].
изображение 2

Сам код детали

define("UsrSchema5Detail", ["ConfigurationEnums"],
        function(enums) {
        return {
                entitySchemaName: "UsrModelCIInSupplies",
                attributes: {},
                messages: {},
                methods: {
                        //колонки выбираемые запросом
                        getGridDataColumns: function() {
                                return {
                                        "Id": {path: "Id"},
                                        "UsrConfigItemModel": {path: "UsrConfigItemModel"},
                                        "UsrConfigItemModel.Name": {path: "UsrConfigItemModel.Name"}
                                };
                        },
                        //конфигурирует и отображает модальное окно справочника
                        openUsrConfigItemModelLookup: function() {
                                //конфигурирует объект
                                var config = {
                        //название схемы объекта, записи которого будут отображены в справочнике
                                        entitySchemaName: "ConfigItemModel",
                                        //множественный выбор
                                        multiSelect: true,
                                        //колонки, которые будут отображены в справочнике
                                        columns: ["Name"]
                                };
                                var UsrConsumablesId = this.get("MasterRecordId");
                                if (this.Ext.isEmpty(UsrConsumablesId)) {
                                        return;
                                }
                                //экземпляр класса [EntitySchemaQuery]
                                var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                                        //установка корневой схемы
                                        rootShemaName: this.entitySchemaName
                                });
                                //добовление колонки [Id]
                                esq.addColumn("Id");
                                //добавление колонки [id] из схемы [UsrConfigItemModel]
                                esq.addColumn("UsrConfigItemModel.Id", "UsrConfigItemModelId");
                                //Создание и добаление фильтров в коллекцию запроса
                                esq.filters.add("filterUsrConsumables",
                                this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "UsrConsumables", UsrConsumablesId));
                // Получение всей коллекции записей и отображение ее в модальном окне справочника.
                                esq.getEntityCollection(function(result) {
                                        var existsUsrConfigItemModelCollection = [];
                                        if (result.success) {
                                                result.collection.each(function(item) {
                                                        existsUsrConfigItemModelCollection.push(item.get("UsrConfigItemModelId"));
                                                });
                                        }
                                        // Добавление фильтра в конфигурационный объект.
                                        if (existsUsrConfigItemModelCollection.length > 0) {
                                                var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
                                                        existsUsrConfigItemModelCollection);
                                                existsFilter.comparisonType = this.Terrasoft.ComparisonType.NOT_EQUAL;
                                                existsFilter.Name = "existsFilter";
                                                config.filters = existsFilter;
                                        }
                                        // Вызов модального окна справочника
                                        this.openLookup(config, this.addCallBack, this);
                                }, this);
                        },
                        //обработчик события сохранения страницы редактирвоания
                        onCardSaved: function() {
                                this.openUsrConfigItemModelLookup();
                        },
//открывает справочник МКЕ в случае если странца была редактирвоания РМ была ранее сохранена
                        addRecord: function() {
                                var masterCardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
                                var isNewRecord = (masterCardState.state === enums.CardStateV2.ADD ||
                                masterCardState.state === enums.CardStateV2.COPY);
                                if (isNewRecord === true) {
                                        var args = {
                                                isSilent: true,
                                                messageTags: [this.sandbox.id]
                                        };
                                        this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
                                        return;
                                }
                                this.openUsrConfigItemModelLookup();
                        },
                        //добавление выбранных продуктов
                        addCallBack: function(args) {
                                //экземпляр класса пакетного запроса BatchQuery
                                var bq = this.Ext.create("Terrasoft.BatchQuery");
                                var UsrConsumablesId = this.get("MasterRecordId");
                                //коллекция выбранных в справочнике данных
                                this.selectedRows = args.selectedRows.getItems();
                                //колекция, передаваемая в запрос
                                this.selectedItems = [];
                                // Копирование необходимых данных.
                                this.selectedRows.forEach(function(item) {
                                        item.UsrConsumablesId = UsrConsumablesId;
                                        item.UsrConfigItemModelId = item.values;
                                        bq.add(this.getUsrConfigItemModelInsertQuery(item));
                                        this.selectedItems.push(item.values);
                                }, this);
                                //выполнение пакетного запроса, если он не пустой
                                if (bq.queries.length) {
                                        this.showBodyMask.call(this);
                                        bq.execute(this.onUsrConfigItemModelInsert, this);
                                }
                        },
                        //возвращает запрос на добавление текущего объекта
                        getUsrConfigItemModelInsertQuery: function(item) {
                                var insert = Ext.create("Terrasoft.InsertQuery", {
                                        rootShemaName: this.entitySchemaName
                                });
                                insert.setParameterValue("UsrConsumables", item.UsrConsumablesId,
                                this.Terrasoft.DataValueType.GUID);
                                insert.setParameterValue("ConfigItemModel", item.UsrConfigItemModelId,
                                this.Terrasoft.DataValueType.GUID);
                                return insert;
                        },
                        //метод, вызываемый при добавлении записей в реестр детали
                        onUsrConfigItemModelInsert: function(response) {
                                this.hideBodyMask.call(this);
                                this.beforeLoadGridData();
                                var filterCollection = [];
                                response.queryResults.forEach(function(item) {
                                        filterCollection.push(item.id);
                                });
                                var esq = Ext.cteate("Terrasoft.EntitySchemaQuery", {
                                        rootShemaName: this.entitySchemaName
                                });
                                this.initQueryColumns(esq);
                                esq.filters.add("recordId",
                                Terrasoft.createColumnInFilterWithParameters("Id", filterCollection));
                                esq.getEntityCollection(function(response) {
                                        this.afterLoadGridData();
                                        if (response.success) {
                                                var responseCollection = response.collection;
                                                this.prepareResponseCollection(responseCollection);
                                                this.getGridData().loadAll(responseCollection);
                                        }
                                }, this);
                        },
                        //метод, вызываемый при удалении выбранных записей детали
                        deleteRecords: function() {
                                var selectedRows = this.getSelectedItems();
                                if (selectedRows.length > 0) {
                                        this.set("SelectedRows", selectedRows);
                                        this.callParent(arguments);
                                }
                        },
                        //скрыть пункт меню [Копировать]
                        getCopyRecordMenuItem: Terrasoft.emptyFn,
                        //скрыть пункт меню [Изменить]
                        getEditRecordMenuItem: Terrasoft.emptyFn,
                        //возвращает имя колонки по умолчанию для фильтра
                        getFilterDefaultColumnName: function() {
                                return "UsrConfigItemModel";
                        }
                },
                        // Массив модификаций.
                diff: /**SCHEMA_DIFF*/[
                                {
                                        // Тип операции — слияние.
                                        "operation": "merge",
                                        // Название элемента схемы, над которым производится действие.
                                        "name": "DataGrid",
                                // Объект, свойства которого будут объединены со свойствами элемента схемы.
                                        "values": {
                                                "rowDataItemMarkerColumnName": "UsrConfigItemModel"
                                        }
                                },
                                {
                                        // Тип операции — слияние.
                                        "operation": "merge",
                                        // Название элемента схемы, над которым производится действие.
                                        "name": "AddRecordButton",
                                // Объект, свойства которого будут объединены со свойствами элемента схемы.
                                        "values": {
                                                "visible": {"bindTo": "getToolsVisible"}
                                        }
                                }
                        ]/**SCHEMA_DIFF*/
                };
});

Задача стоит, сделать деталь такой же как, например: деталь [ConfItemUserDetail] в КЕ.

Версия продукта: service enterprise 7.8.2

Нравится

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

Где и как правильно поправить код?

Добрый вечер, Алеся.

Исходя из ошибки - у Вас неправильно строится запрос к базе данных в методе openUsrConfigItemModelLookup. На первом скриншоте явно видно, что запрос не был построен корректно. Проверьте правильность имен колонок, а также правильность связей. SDK.

Ошибка на втором скриншоте результат первой ошибки. Метод addCallBack получил не правильный параметр args и затем у несуществующего свойства selectedRows попытался вызвать метод forEach.

Добрый вечер.

Сегодня просидела весь день, пытаясь все таки разобраться, но к сожалению самостоятельно решить не могу.
Единственное я нашла, в каком месте падает в ошибку

// Получение всей коллекции записей и отображение ее в модальном окне справочника.
				esq.getEntityCollection(function(result) {
					var existsUsrConfigItemModelsCollection = [];
					if (result.success) {
						result.collection.each(function(item) {
							existsUsrConfigItemModelsCollection.push(item.get("UsrConfigItemModelId"));
						});
					}

изображение 1

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

Добрый день!

Как можно выделить все записи, после нажатия на Действия - Выбрать несколько записей ?
Версия 7.3

Нравится

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

Добрый день!
Все записи можно выделить только вручную.

а другой вариант - как запустить процесс для всех выбранных по фильтру записей?

Владимир, есть два варианта. Простой: в самом БП в Чтении данных настроить нужные фильтры и работать в БП с этой коллекцией. Если же нужно, чтобы пользователь сам настраивал фильтры, а БП отрабатывал для всех этих записей, то придётся делать разработчику кастомное действие, в котором вычитывать коллекцию фильтров из раздела и запускать БП, передавая её на вход процессу. В базовой версии не припомню похожего примера, чтобы можно было подсмотреть реализацию.

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

Добрый день!
В карточке обращения есть возможность выбрать Подчиненные обращения

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

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

Нравится

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

Дарья, насколько я знаю, нужно просто добавить данный пункт меню, так как это реализовано в базовой странице, признак isMultiSelectVisible

Спасибо...а куда его добавлять надо? в какую схему?

Дарья, это аттрибут схемы, вот его определение BaseCaseSectionV2:
"MultiSelect": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
value: false
}
заполните его например на init, таким образом, чтобы
isMultiSelectVisible: function() {
return !this.get("MultiSelect");
}
возвращало вам необходимое значение, естественно, что базовая схема, которую вы используете, должна поддерживать этот функционал

Спасибо. Посмотрю

Показать все комментарии
Очень не хватает при множественном выборе в разделе действия "Выбрать всё". Или если это требует загрузки всех записей, то действие "Удалить всё" (отфильтрованное) избавило бы от необходимости вручную отмечать десятки записей.
3 комментария

Здравствуйте, Владимир!
Вот пример реализации действия "Выбрать все" для 7.3. В 7.4 тоже должно работать.
dobavlenie_deystviya_vybrat_vse.docx

"Андрей Каспаревич" написал:Вот пример реализации действия "Выбрать все"

Прекрасно! Почему бы этому действию не появиться в базовом классе для всех разделов и деталей? :)

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

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

Добрый день.
Возникла проблема с реализацией следующего функционала:
для отчета в Excel сделали собственное окно фильтрации с выбором дат.
В этом же окне необходимо сделать множественный выбор подразделения(справочник контрагенты тип подразделение) для фильтрации. Тут то и получается загвоздка.
При использовании такого кода:
LookupUtilities.ThrowOpenLookupMessage(sandbox, config, addCallBack, this);
окно выбора открывается, но так как окно фильтрации работает в тихом режиме, после выбора значений callback не отрабатывает и мы попадаем в реестр активности вместо окна фильтрации. Как можно обойти это либо как использовать стандартный lookupEdit для множественного выбора из справочника?
Версия BPM 7.2.0.942

Нравится

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

Здравствуйте, Иван!
Не могли бы Вы более полно опистаь проблему и то, как Вы ее решаете и привести код страницы.
Не совсем понял, что подразумевается под тихим режимом.
Также посмотрите тему http://www.community.terrasoft.ua/forum/topic/10347, возможно это то, что Вам необходимо. Суть в том, что нужно использовать не ThrowOpenLookupMessage, а Open.

При открытии окна фильтрации в адресной строке остается '...0/Nui/ViewModule.aspx#SectionModule/ActivitySection/', поэтому когда в окне справочника нажимаем кнопку выбрать или отмена, то попадаем не на страницу фильтрации а в реестр активностей. При этом yandler отрабатывает нормально.
Файл с кодом модуля прикреплен.
Модуль вызывается так:

window.ActivityViewModel = this;
                var id = sandbox.id + "_ActivityReportFilterPage";
                var renderTo = Ext.get("centerPanel");
                var historyState = sandbox.publish("GetHistoryState");
                sandbox.publish("PushHistoryState", {hash: historyState.hash.historyState});
                sandbox.loadModule("ActivityReportFilterPage", {
                    renderTo: renderTo,
                    id: id,
                    keepAlive: true
                });

Иван, я немного не понял, после замены ThrowOpenLookupMessage на вызов Open проблема все еще актуальна или нет?)

После замены на Open и добавления в init следующих строк:

var state = sandbox.publish('GetHistoryState');
                var currentHash = state.hash;
                var currentState = state.state || {};
                if (currentState.moduleId === sandbox.id) {
                    return;
                }
                var newState = Terrasoft.deepClone(currentState);
                newState.moduleId = sandbox.id;
                sandbox.publish('ReplaceHistoryState', {
                    stateObj: newState,
                    pageTitle: null,
                    hash: currentHash.historyState,
                    silent: true
                });

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

Иван, посмотрите пример в EmailPage. Там в lookup.config передается набор загружаемых колонок:

			this.methods.getLookupConfig = function(columnName) {
				var scope = this;
				var callback = function(args) {
					scope.onLookupSelect(args);
				};
				return {
					config: {
						entitySchemaName: 'VwRecepientEmail',
						columnName: columnName,
						columns: ['ContactId'],
						filters: Terrasoft.createColumnIsNotNullFilter('ContactId'),
						multiSelect: true
					},
					callback: callback
				};
			};
...
this.methods.openCopyRecepientLookupEmail = function() {
				var lookup = this.getLookupConfig('CopyRecepient');
				lookup.config.actionsButtonVisible = false;
				LookupUtilities.Open(sandbox, lookup.config, lookup.callback, this, this.renderTo);
			};
...
this.methods.onLookupSelect = function(args) {
				var columnName = args.columnName;
				var isContactEmpty = Ext.isEmpty(this.get('Contact'));
				var items = args.selectedRows.collection.items;
				this.recepientCollection = this.recepientCollection || [];
				var collection = this.recepientCollection;
				var columnValue = this.get(columnName);
				if (Ext.isEmpty(columnValue)) {
					columnValue = '';
				} else {
					columnValue = columnValue.trim();
					var addSymbol = '';
					var symbol = columnValue[columnValue.length - 1];
					if (symbol === ';') {
						addSymbol = ' ';
					} else {
						addSymbol = '; ';
					}
					columnValue = columnValue + addSymbol;
				}
				Terrasoft.each(items, function(item) {
					var contactId = item.ContactId;
					if (isContactEmpty && Ext.isEmpty(columnValue) && columnName === 'Recepient') {
						this.loadLookup('Contact', contactId);
						isContactEmpty = false;
					}
					var displayValue = item.displayValue;
					if (collection.indexOf(contactId) < 0) {
						collection.push(contactId);
					}
					if (!((columnValue.indexOf(displayValue + ';') === 0) ||
						(columnValue.indexOf(displayValue + ';') >= 0))) {
						columnValue += displayValue + '; ';
					}
				}, this);
				this.set(columnName, columnValue);
			};

Разобрался, спасибо.

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

Нужно было, чтобы массовое редактирование было доступно только определенным группам пользователей (а не всем сразу). Сделал. С возможностью множественного выбора. А как - не скажу
:razz:

Нравится

Поделиться

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