Подстановка значения

При создании письма из карточки заказа открывается карточка письма. На вкладке "Основная информация" проставлен связанный с ним заказ. Где идет обработка данной операции? Разве не в коде карточки EmailPageV2 пакета Order?

entitySchemaName: "Activity",
                        methods: {
                                /**
                                 * Копирует значения колонок из схемы в текущую модель.
                                 * @overridden
                                 * @param {Object} entity Схема активности.
                                 */

                                copyEntityColumnValues: function(entity) {
                                        var order = entity.get("Order");
                                        if (order) {
                                                this.set("Order", order);
                                        }
                                        this.callParent(arguments);
                                },

                                /**
                                 * Возвращает массив загружаемых колонок.
                                 * @private
                                 * @overridden
                                 * @return {Array} Массив колонок.
                                 */

                                getEmailSelectColumns: function() {
                                        var columnsArray = this.callParent(arguments);
                                        columnsArray.push("Order");
                                        return columnsArray;
                                }
                        },

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

Нравится

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

Нашел вот такую инструкцию на эту тему:
Связывание писем по пользовательскому объекту (например, Лид)
sozdaniesvyazannoyaktivnosti.doc

А нельзя реализовать подстановку контакта аналогично подстановке заказа?

Просто подобная подстановка, только уже контакта, имеется при создании письма из карточки контакта. А где она реализована-понятия не имею.

При повторном выборе заказа в детали связи - подстановка совершается корректно. Нельзя как то принудительно вызвать этот метод, срабатывающий при повторном выборе, при открытии карточки?

Добрый день Александр!!!

я немного вас не понял, вы желаете чтобы при создание Письма из Заказа заполнялись бы и другие поля в карточки Письма из Заказа, помимо Реквизита "Заказ". Я правильно вас понял, или вы желаете что-то другое выполнить при создание Письма из карточки Заказа?

Смотрите, при создании письма из заказа у нас автоматически заполняется поле Заказ детали Связи вкладки Основная информация. Поле Контакт остается пустым. Следующим этапом происходит следующее:
1.Встаем в поле Заказ
2.Открывается список доступных заказов для выбора
3.Выбираем тот же самый (!) заказ
4.Поле Заказ заполнено, поле Контакт заполнено.
Следовательно при выборе другого или того же самого элемента в данной детали - обновляются связи, и поля заполняются, в соответствии с тем, как они заполнены в карточке заказа.
Потому такой вопрос: можно ли как то при инициализации карточки вызвать тот же самый метод, который срабатывает при смене значения поля Заказ детали Связи? И если возможно, то как называется данный метод?

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

getAddButtonMenuVisible: function() {
   return true;
},

В карточке заказа. Или из какой вы карточки создаете письмо, ваш второй комментарий вводит в заблуждение. Если же вы добавляете письмо через деталь «Письма» в заказе, то связь и так проставляется, делать для этого ничего не нужно.

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

setAdditionalDefValues: function(openCardConfig, next) {
	if (this.entitySchema.name === "Order") {
		openCardConfig.defaultValues.push({
			name: "Order",
			value: this.get("Id")
		});
		next();
	} else {
		next();
	}
}

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

P.S. за всю логику этой кнопки быстрого добавления активностей(писем) отвечает схема(миксин) QuickAddMixin, там и инициируется вызов метода setAdditionalDefValues

Никакой кнопки не добавлялось. Пошагово процесс добавления представлен на скриншотах


На скриншотах используется с кодом

setAdditionalDefValues: function(openCardConfig, next) {
        if (this.entitySchema.name === "Order") {
                openCardConfig.defaultValues.push({
                        name: "Order",
                        value: this.get("Id")
                });
                next();
        } else {
                next();
        }
}

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

Тогда все очень просто. QuickAddMixin в данном случае совсем не при чем. Контакт при выборе заполняется стандартными rules в схеме EmailPageV2 пакета Order. Которые не срабатывает после логики детали по заполнению полем вызывающей карточки. Все что вам нужно сделать, инициировать перевыбор при инициализации. Если заказ заполнен, а контакт нет.
В замещающей схеме EmailPageV2 пишите:

onEntityInitialized: function() {
	this.callParent(arguments);
 
	if(this.get("Order") && (!this.get("Contact"))) {
		var oldOrder = this.get("Order");
		this.set("Order", null);
		this.set("Order", oldOrder);
	}
},

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

Начну попорядку.
1. задача - При выборе заказа, на странице редактирования Активности, заполнять поле контакт.
Решение:

Создаем замещающий модуль страницы редактирования Активности и пишем код:

define("ActivityPageV2", [],
    function() {
        return {
            entitySchemaName: "Activity",
            attributes: {
                /**
                 * Заказ
                 */
                "Order": {
                    dataValueType: this.Terrasoft.DataValueType.LOOKUP,
                    lookupListConfig: {
                        columns: ["Contact"]
                    },
                    dependencies: [
                        {
                            columns: ["Order"],
                            methodName: "onOrderAttributeChange"
                        }
                    ]
                }
            },
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            methods: {
                /**
                 * Заполняем поле контакт, после выбора Заказа
                 * @private
                 */
                onOrderAttributeChange: function() {
                    var order = this.get("order");
                    if (order) {
                        var contactOrder = order.Contact;
                        if (contactOrder) {
                            this.loadLookupDisplayValue("Contact",
contactOrder.value);
                        }
                    }
                }
            },
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
            rules: {}
        };
    });

2 задача - При редактирование карточки Заказа требуется создать Еmail сообщение, при создание карточки редактирования EmailPageV2 заполнить поле контакт. Здесь все так же просто, выполнить замещение страницы редактирования Заказа. И написать следующий код:

define("OrderPageV2", [],
	function() {
		return {
			entitySchemaName: "Order",
			details: /**SCHEMA_DETAILS*/{
				EmailDetailV2: {
					schemaName: "EmailDetailV2",
					entitySchemaName: "Activity",
					filter: {
						masterColumn: "Id",
						detailColumn: "Order"
					},
					defaultValues: {							
						Contact: {masterColumn: "Contact"}
					}
				}
			}/**SCHEMA_DETAILS*/,
			attributes: {},
			methods: {},
			rules: {},
			userCode: {},
			diff: /**SCHEMA_DIFF*/[
			]/**SCHEMA_DIFF*/
		};
	});

все при создание емайл будет заполняться поле Контакт взятое со страницы редактирования Заказа.

"Щиголь Максим" написал:

Тогда все очень просто. QuickAddMixin в данном случае совсем не при чем. Контакт при выборе заполняется стандартными rules в схеме EmailPageV2 пакета Order. Которые не срабатывает после логики детали по заполнению полем вызывающей карточки. Все что вам нужно сделать, инициировать перевыбор при инициализации. Если заказ заполнен, а контакт нет.

В замещающей схеме EmailPageV2 пишите:

onEntityInitialized: function() {

        this.callParent(arguments);

               

        if(this.get("Order") && (!this.get("Contact"))) {

                var oldOrder = this.get("Order");

                this.set("Order", null);

                this.set("Order", oldOrder);

        }

},

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


Поле контакт заполняется, но вот код из карточки EmailPageV2 пакета UIv2 не отрабатывает, а конкретно функция OnContactChange:

				onContactChange: function() {
					var ext = this.Ext;
					var contact = this.get("Contact");
					var recipient = this.get("Recepient");
					if (ext.isEmpty(recipient) && !ext.isEmpty(contact) && !ext.isEmpty(contact.Email)) {
						var email = ext.String.format(this.get("Resources.Strings.EmailFormatString"),
							contact.displayValue, contact.Email);
						this.set("Recepient", email);
					}
				},

А именно в условии !ext.isEmpty(contact.Email) не выполняется, в отладчике пишет что contact.Email - пустое.

"Бахматов Александр Валерьевич" написал:Поле контакт заполняется, но вот код из карточки EmailPageV2 пакета UIv2 не отрабатывает, а конкретно функция OnContactChange:

Добрый день Александр!!!

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

"Власов Михаил Викторович" написал:что вас не устраивает в работе данной функции?

Срабатывать она срабатывает, но в отладчике видно, что в объекте Contact не заполняются поля. Т.е. заполняется лишь display_value и value, в то время как должны еще заполняться поля Email и т.д. Потому if не отрабатывает и Recepient не заполняется в карточке.

Добрый день Александр!!!

тогда вам нужно заместить данную страницу, перед замещением конечно проверить следующее: (ниже привожу пример как правильно должен быть описан атрибут  Contact в замещающей странице редактирования  EmailPageV2 )

            attributes: {
                /**
                 * Контакт
                 */
                "Contact": {
                    lookupListConfig: {
                        columns: ["Email"]
                    }
                }
            }

вот только при таком описание Аттрибута контакт сработает следующий ваш код:

 ...
 if (ext.isEmpty(recipient) && !ext.isEmpty(contact) && !ext.isEmpty(contact.Email)) {
     ....
 }

Т.е. добавив этот атрибут, мы добавили его в возвращаемый объект и потому теперь заполняются поля display_value, value и email? Я правильно понимаю логику этой замены?

Добрый день Алексей!!!

описывая Атрибут Контакт добавляя:

   lookupListConfig: {
      columns: ["Email"]
   }

вы тем самым даете инструкцию при генерации и открытие страницы, что при формирование Выборки требуется еще для Атрибута "Контакт" выбрать его Емайл. И далее уже в коде проверяем если Контакт заполнен, то легко выбираем Емайл контакты выполнив инструкцию "contact.Email". Вот и все!!

если что непонятно написал, пишите перефразирую свою мысль.

Т.е., если мне понадобится обратиться к какому то атрибуту, я должен буду добавлять его в карточку, на примере Email?

"Бахматов Александр Валерьевич" написал:Т.е., если мне понадобится обратиться к какому то атрибуту, я должен буду добавлять его в карточку, на примере Email?

Александр если вам требуется получить Реквизит из другой сущности, как в вашем примере на карточке редактирования Емайл вам требуется получить Емайл контакта. то вам нужно именно в карточке редактирования описать следующее:

повторюсь еще раз

            attributes: {
                /**
                 * Контакт
                 */
                "Contact": {
                    lookupListConfig: {
                        columns: ["Email"]
                    }
                }
            }

данная инструкция сформирует дополнительное левое соединение и получит требуемый реквизит другой сущности.

Спасибо за объяснение!

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