Справочники в преднастроенной странице

Здравствуйте!
Пытаюсь создать преднастроенную страницу, содержащую справочники. Поля на странице относятся к разным объектам. Делал аналогично примеру из конфигурации (PreconfiguredPageV2)
При открытии справочник не получает верный конфиг.
При использовании примера из конфигурации ситуация в точности повторяется.
Подскажите пожалуйста, как побороть данную проблему?

Нравится

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

Уже разобрался.
Если кому-то понадобится, то необходимо переопределить 2 метода: LoadVocabulary и getLookupPageConfig

 loadVocabulary: function(args, tag) {
                        var column = this.getColumnByName(tag);
                        args.schemaName = column.referenceSchemaName;
                        this.callParent(arguments);
                    },
 
                    /**
                     * Возвращает настройки страницы выбора из справочника.
                     * @private
                     * @param {Object} args Параметры.
                     * @param {String} columnName Название колонки.
                     * @return {Object} Настройки страницы выбора из справочника.
                     */
                    getLookupPageConfig: function(args, columnName) {
                        var config = {
                            entitySchemaName: args.schemaName,
                            multiSelect: false,
                            columnName: columnName,
                            columnValue: this.get(columnName),
                            searchValue: args.searchValue,
                            filters: this.getLookupQueryFilters(columnName)
                        };
                        this.Ext.apply(config, this.getLookupListConfig(columnName));
                        return config;
                    }

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

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

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

Полный код во вложении
preconfuguredpage.txt

Посмотрите в сторону схемы автогенерируемой страницы (AutoGeneratedPageV2) и ее реализаций loadVocabulary и остальных.
В автогенерируемых страницах фильтрация происходит.
/

И еще одну старую тему попробую оживить...

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

"Александр Кудряшов" написал:

И еще одну старую тему попробую оживить...

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

Прикрепленный файлРазмер

filter.jpg10.46 кб

Александр, а то, что на SDK описано не подходит? Если вы хотите не в шапке страницы реализовать, то возможно для примера подходит страница "Отчет о проделанной работе" (раздел "Активности").

"Мотков Илья" написал:то, что на SDK описано

Илья, за ссылку спасибо! Посмотрел, но это не мой вариант, так как у меня не раздел (и соответственно нет базовой логики, способной подцепить предлагаемый модуль). А в преднастроенной странице (наследуемой от страницы редактирования) такой блок просто так не добавится... надо писать именно контролы и именно ручками, а еще обработчики событий на них... либо как то уж очень исхитриться и прицепить готовый модуль, но методика должна быть более изощренная, чем в sdk

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

"Александр Кудряшов" написал:
Мотков Илья пишет:

то, что на SDK описано

Илья, за ссылку спасибо! Посмотрел, но это не мой вариант, так как у меня не раздел (и соответственно нет базовой логики, способной подцепить предлагаемый модуль). А в преднастроенной странице (наследуемой от страницы редактирования) такой блок просто так не добавится... надо писать именно контролы и именно ручками, а еще обработчики событий на них... либо как то уж очень исхитриться и прицепить готовый модуль, но методика должна быть более изощренная, чем в sdk

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

Но фильтры же правильней использовать для раздела или детали :wink:
Если уже для самообразования. то можно попробовать следующий алгоритм:

1. Модуль фильтров можно подключить как обычный модуль. Другой вопрос, что в раздел и деталь это сделать можно легко.
2. Как это примерно сделать – загрузить модуль и поддержать сообщения для работы с ним.

Сперва нужно поддержать сообщения

Потом на них сделать такую логику:

Для добавления фиксированных фильтров нужно сообщение

Его код должен возвращать конфиг, из статьи - http://www.academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/AddFix…

Загрузка самого модуля фильтров стандартная -

this.sandbox.loadModule("QuickFilterModuleV2", {
               renderTo: "SectionFiltersContainer",// куда рисовать, контейнер в diff
               id: this.getQuickFilterModuleId()// тут уникальный id модуля
});

Для получения фильтров нужно подписаться на сообщение:

На 7.8 необходимо на преднастроенную страницу добавить справочное поле.
Добавляю в attributes:

 "Contact": {
                dataValueType: this.Terrasoft.DataValueType.LOOKUP,
                type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                referenceSchemaName: "Contact",
            },

Добавляю элемент в diff.
Поле появляется, но при нажатии на лупу появляется ошибка:
Ошибка
на строчке:

 args.schemaName = this.model.attributes[tag].referenceSchemaName;

в методе:

loadVocabulary: function(args, tag) {
  args.schemaName = this.model.attributes[tag].referenceSchemaName;
  this.callParent(arguments);
},

Здравствуйте, Игорь.

Попробуйте добавить свойство usLookup к атрибуту Contact:

isLookup: true,

"Мотков Илья" написал:Здравствуйте, Игорь.

Попробуйте добавить свойство usLookup к атрибуту Contact:

isLookup: true,


Не помогло. Проблема возникает при нажатии на лупу. Если использовать выпадающий список, то проблема не возникает.
Аналогичная проблема со справочными полями наблюдается и в других базовых преднастроенных страницах.

Игорь, для исправления данного поведения, необходимо добавить зависимость от LookupUtilities. А также переопределить метод loadVocabulary аналогично схеме AutoGeneratedPageV2.

Полный листинг кода схемы:

define("UsrSome", ["LookupUtilities", "CustomProcessPageV2Utilities"],
	/**
	 * @class Terrasoft.configuration.PreconfiguredPageV2
	 * Пример преднастроенной страницы без EntitySchema по процессу
	 */
	function(LookupUtilities) {
		return {
			mixins: {},
			attributes: {
				"UsrContact": {
					dataValueType: this.Terrasoft.DataValueType.LOOKUP,
					type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					isLookup: true,
					referenceSchemaName: "Contact",
				},
			},
			rules: {},
			details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
			methods: {
				findEntityColumn: function(columnName) {
					var column = this.callParent(arguments);
					if (!column) {
						column = this.getColumnByName(columnName);
					}
					return column;
				},
				loadVocabulary: function(args, tag) {
					var column = this.findEntityColumn(tag);
					if (!column || !column.isLookup) {
						return;
					}
					var entitySchemaName = column.referenceSchemaName;
					var config = {
						entitySchemaName: entitySchemaName,
						multiSelect: false,
						columnName: tag,
						columnValue: this.get(tag),
						searchValue: args.searchValue
					};
					var handler = function(args) {
						var columnName = args.columnName;
						var collection = args.selectedRows.collection;
						if (collection.length > 0) {
							this.set(columnName, collection.items[0]);
						}
					};
					LookupUtilities.Open(this.sandbox, config, handler, this, null, false, false);
				},
				init: function(){
					this.callParent(arguments);
					document.scope = this;
				},
			},
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "remove",
					"name": "TextParameter1"
				},
				{
					"operation": "insert",
					"parentName": "GeneralInfoBlock",
					"propertyName": "items",
					"name": "UsrContact",
					"values": {
						caption: "UsrContact",
						contentType: Terrasoft.ContentType.LOOKUP,
						bindTo: "UsrContact",
						layout: {column: 0, row: 0, colSpan: 12}
					}
				}
			]/**SCHEMA_DIFF*/,
			userCode: {}
		};
	});
Показать все комментарии