Здравствуйте,
мы питаемся в Бизнес процесс добавить подпроцесс, и когда передает только значение Лида, все ок,
но в подпроцессе у нас есть параметр, текстовый, и на него вылетает ошибка:

"Значение не может быть неопределенным. Имя параметра: format"
Пробовали и заполнять этот параметр значением по умолчанию в подпроцессе, и передавать значение с процесса, 
если он присутствует всегда одна и та же ошибка.

Версия: 7.15.4.3055

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

Нравится

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

Добрый день, по клику на шапку колонки вызывается функция onClick в label.js, затем идёт проверка подписан ли объект на данный эвент через this.fireEvent("click", this). В Label.hasListener подписки на "click" нету и ничего не происходит. Пожалуйста подскажите, как забиндить метод на click и как передать нужные аргументы в этот метод.
 

Нашёл место где создаются лейблы, но как я понял, через конфиг можно передать только свойства объекта.

/**
 * Rerenders grid header.
 * @protected
 */
reRenderGridHeader: function() {
	var captionContainer = this.Ext.getCmp("gridCaptionContainer");
	var columnsConfigs = this.getGridHeaderConfigs();
	captionContainer.items.clear();
	this.Terrasoft.each(columnsConfigs, function(columnConfig) {
		var label = this.Ext.create("Terrasoft.Label", columnConfig);
		captionContainer.items.add(columnConfig.id, label);
	}, this);
	captionContainer.reRender();
},
 
/**
 * Returns config on caption column.
 * @override
 * @param {Object} columnInfo
 * @param {String} columnInfo.name Column name.
 * @param {Number} columnInfo.colSpan Column size.
 * @param {String} columnInfo.caption Column caption.
 * @return {Object} Column control config.
 */
getCaptionControlConfig: function(columnInfo) {
	var className = "Label";
	var id = ["caption", this._formatColumnName(columnInfo.name), className.toLowerCase()].join("-");
	var config = {
		className: "Terrasoft." + className,
		id: id,
		selectors: {wrapEl: "#" + id},
		markerValue: columnInfo.name
	};
	config.caption = columnInfo.caption;
	config.classes = {
		labelClass: ["grid-cols-" + columnInfo.colSpan,
			"gridRow" + columnInfo.name + "LabelCaption"]
	};
	return config;
},

 

Нравится

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

Это вы сильно глубоко копаете в логику системы. Находите схему ChangeAdminRightsUserTaskPropertiesPage, там есть код(функция generateChangeAdminRightsItemViewConfig) который создаете label и вещает на его нажатие функцию.

Полозюков Евгений Петрович,

Здравствуйте, в generateChangeAdminRightsItemViewConfig я должен передать уже созданный label? Как передать функцию, на которую я хочу повесить бинд? 

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

Подскажите пожалуйста.

Есть страница детали с разными полями.

Как добавить между полями обычный текст и ссылку?

Ну как пример:

"Инструкция здесь"

Инструкция - просто текст, "здесь" - это ссылка на локальный файл или ссылка на другой ресурс.

Нравится

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

В HtmlControl можно любой html класть. Cвойство htmlContent можно связать со строковым атрибутом или функцией которая возвращает строку или сразу положить строку

"htmlContent": "<p>some текст</p>".

 

Вот пример

{
                    "operation": "insert",
                    "name": "AcademyMessageElement",
                    "parentName": "AcademyMessageDescription",
                    "propertyName": "items",
                    "values": {
                        "itemType": Terrasoft.ViewItemType.COMPONENT,
                        "className": "Terrasoft.HtmlControl",
                        "htmlContent": {"bindTo": "AcademyHelpMessage"}
                    }
                }

Если нужна ссылка придется класть в HtmlControl, если нужен только текст есть Label.

{
                    "operation": "insert",
                    "name": "EmptySearchResultLabel",
                    "parentName": "EmptySearchResultContainer",
                    "propertyName": "items",
                    "values": {
                        "itemType": Terrasoft.ViewItemType.LABEL,
                        "classes": {
                            "labelClass": [
                                "description-label"
                            ]
                        },
                        "caption": {"bindTo": "Resources.Strings.EmptySearchResultMessage"}
                    }
                }

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

Имеется расширенный фильтр. Мне необходимо отобразить его лишь на чтение.

Как скрыть кнопку удаления строки и добавления нового условия?

"Действия" скрываются путем передачи в модуль конфига с параметром actionsVisible: false.

В модуле FilterEditModule не нашел подобного функционала для добавления или удаления условий. 

Нашел в классе Terrasoft.controls.FilterEdit.Filter метод, возвращающий как раз таки права на удаление, выделение и т.д.

/**
	 * @inheritdoc Terrasoft.FilterEdit.Item#getAllowedManageOperations
	 * @protected
	 * @override
	 */
	getAllowedManageOperations: function() {
		var filterManager = this.filterManager;
		if (!filterManager) {
			return {
				canViewEnabled: true,
				canEditEnabled: true,
				canEditLeftExpression: true,
				canEditRightExpression: true,
				canEditComparisonType: true,
				canRemove: true,
				canSelect: true
			};
		}
		var filterManageOperations = filterManager.getAllowedFilterManageOperations(this.instance);
		var isEnableComparisonType = this._isEnableComparisonType();
		if (isEnableComparisonType !== undefined) {
			filterManageOperations.canEditComparisonType = isEnableComparisonType;
		}
		return filterManageOperations;
	},

Как я могу переопределить этот метод, если мне нужно расширить логику лишь для одного модуля, а не во всю систему.

 

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

Нравится

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

У кейса есть 2 способа решения:

1) Расширить класс  BaseFilterProvider.

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

 

Пример расширенного модуля (комментарии для понимания разницы)

define("BpFilterReadonlyProvider", [],
	function() {
		/**
		 * @class Terrasoft.data.filters.FilterReadonlyProvider
		 * Readonly filters provider.
		 */
		Ext.define("Terrasoft.data.filters.FilterReadonlyProvider", {
				extend: "Terrasoft.BaseFilterProvider",
			alternateClassName: "Terrasoft.FilterReadonlyProvider",
 
			rootSchemaName: "",
 
			canDisplayId: false,
 
			sandbox: null,
 
			// Управление операциями внутри фильтра (для каждого фильтра по отдельности).
			getAllowedFilterManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Возможность изменения левой части выражения.
					canEditLeftExpression: false,
					// Возможность изменения правой части выражения.
					canEditRightExpression: false,
					// Возможность изменения условия сравнения.
					canEditComparisonType: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбрать отдельный фильтр.
					canSelect: false
				};
			},
 
			// Управление группами фильтров.
			getAllowedFilterGroupManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Видимость типа группы ("И" / "ИЛИ").
					canViewGroupType: true,
					// Возможность редактирования типа группы.
					canEditGroupType: false,
					// Видимость кнопки "Добавить условие".
					canAddFilters: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбора группы фильтра.
					canSelect: false
				};
			}
 
		});
		return Terrasoft.FilterReadonlyProvider;
	}
);

 

Передача конфига модулю

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
        // Объект
	    rootSchemaName: "SxCandidate",
        // Колонка со значением фильтра
		filters: this.$RequirementFilterValue,
        // Видимость кнопки "Действия"
		actionsVisible: false,
        // Имя класса-провайдера (не забудьте подключить в зависимостях свой модуль с этим классом)
		filterProviderClassName: "Terrasoft.FilterReadonlyProvider"
   };
}

 

2) Второй вариант более быст и удобен. Подойдет, если такой кейс единичный в системе.

При передаче конфига модулю, возможно прямо в нем переопределить методы, возвращающие права на редактирование и отображение элементов.

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
	    rootSchemaName: "SxCandidate",
		filters: this.$RequirementFilterValue,
		actionsVisible: false,
        entitySchemaFilterProviderConfig: {
		    canDisplayId: true,
		    shouldHideLookupActions: true,
			isColumnSettingsHidden: true,
			getAllowedFilterManageOperations: function() {
			    return {
				    canViewEnabled: true,
					canEditEnabled: false,
					canEditLeftExpression: false,
					canEditRightExpression: false,
					canEditComparisonType: false,
					canRemove: false,
					canSelect: false
				};
			},
			getAllowedFilterGroupManageOperations: function() {
				return {
					canViewEnabled: true,
					canEditEnabled: false,
					canViewGroupType: true,
					canEditGroupType: false,
					canAddFilters: false,
					canRemove: false,
					canSelect: false
				};
			}
		}
   };
}

 

В обоих случаях результат будет идентичен.

Можно наложить фильтр в раздел и пользователь его вообще не увидит в расширенных фильтрах.

https://community.terrasoft.ru/questions/interesuet-kak-sozdat-filtr-v-…

https://community.terrasoft.ru/questions/vidimost-sotrudnikov-v-kontakt…

https://community.terrasoft.ru/questions/bystryy-filtr-po-celochislenno…

Полозюков Евгений Петрович,

задача в другом. Допустим, менеджер заполняет фильтрацию внутри карточки (аналогично фильтрам в карточке раздела "Модели машинного обучения"). Затем, этот фильтр мне нужно отобразить  оператору только для чтения уже в совершенно другом месте.

 

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

Подкопаев Михаил Олегович,

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

У кейса есть 2 способа решения:

1) Расширить класс  BaseFilterProvider.

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

 

Пример расширенного модуля (комментарии для понимания разницы)

define("BpFilterReadonlyProvider", [],
	function() {
		/**
		 * @class Terrasoft.data.filters.FilterReadonlyProvider
		 * Readonly filters provider.
		 */
		Ext.define("Terrasoft.data.filters.FilterReadonlyProvider", {
				extend: "Terrasoft.BaseFilterProvider",
			alternateClassName: "Terrasoft.FilterReadonlyProvider",
 
			rootSchemaName: "",
 
			canDisplayId: false,
 
			sandbox: null,
 
			// Управление операциями внутри фильтра (для каждого фильтра по отдельности).
			getAllowedFilterManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Возможность изменения левой части выражения.
					canEditLeftExpression: false,
					// Возможность изменения правой части выражения.
					canEditRightExpression: false,
					// Возможность изменения условия сравнения.
					canEditComparisonType: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбрать отдельный фильтр.
					canSelect: false
				};
			},
 
			// Управление группами фильтров.
			getAllowedFilterGroupManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Видимость типа группы ("И" / "ИЛИ").
					canViewGroupType: true,
					// Возможность редактирования типа группы.
					canEditGroupType: false,
					// Видимость кнопки "Добавить условие".
					canAddFilters: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбора группы фильтра.
					canSelect: false
				};
			}
 
		});
		return Terrasoft.FilterReadonlyProvider;
	}
);

 

Передача конфига модулю

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
        // Объект
	    rootSchemaName: "SxCandidate",
        // Колонка со значением фильтра
		filters: this.$RequirementFilterValue,
        // Видимость кнопки "Действия"
		actionsVisible: false,
        // Имя класса-провайдера (не забудьте подключить в зависимостях свой модуль с этим классом)
		filterProviderClassName: "Terrasoft.FilterReadonlyProvider"
   };
}

 

2) Второй вариант более быст и удобен. Подойдет, если такой кейс единичный в системе.

При передаче конфига модулю, возможно прямо в нем переопределить методы, возвращающие права на редактирование и отображение элементов.

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
	    rootSchemaName: "SxCandidate",
		filters: this.$RequirementFilterValue,
		actionsVisible: false,
        entitySchemaFilterProviderConfig: {
		    canDisplayId: true,
		    shouldHideLookupActions: true,
			isColumnSettingsHidden: true,
			getAllowedFilterManageOperations: function() {
			    return {
				    canViewEnabled: true,
					canEditEnabled: false,
					canEditLeftExpression: false,
					canEditRightExpression: false,
					canEditComparisonType: false,
					canRemove: false,
					canSelect: false
				};
			},
			getAllowedFilterGroupManageOperations: function() {
				return {
					canViewEnabled: true,
					canEditEnabled: false,
					canViewGroupType: true,
					canEditGroupType: false,
					canAddFilters: false,
					canRemove: false,
					canSelect: false
				};
			}
		}
   };
}

 

В обоих случаях результат будет идентичен.

У вас настройка фильтра хранится в поле? Может, можно закрыть оператору доступ к данному полю на уровне прав доступа?

Владимир Соколов,

настройка фильтра да, хранится в поле. Пример использования есть в разделе "Модели машинного обучения" в карточке записи.

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

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

Доброго дня!
Надоели замещающие объекты в пакете Custom, которые появляются от выполнения неочевидных настроек в системе (например, включение журналирования или правил раздачи прав).

Хочу его заблокировать, чтобы туда не вносились изменения. Есть ли у кого-нибудь такой опыт, как делали, к чему привело?

Нравится

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

Абсолютно правильный опыт, разработка в пакет custom должна быть запрещена. Разработка должна быть в отдельных пакетах подключенных к свн. Также нужно создать свой пакет и указать в системной настройке "Текущий пакет", мастер разделов и другие мастера используют эту настройку.

 

Правда любой разработчик sql командой может это легко разблокировать. Это больше вопрос договоренностей о процессе разработки.

 

Закрыть custom.

UPDATE [dbo].[SysPackage]
   SET 
      [InstallType] = 1
 WHERE [Name] = 'Custom'

Екатерина, при любой изменении конфигурации, в том числе и неявной (изменение раздела в мастере, изменение способа учёта прав у объекта и др.) происходит создание одноимённой схемы в пакете Custom (или того, который включите вместо него по совету Евгения выше). Если такую схему  объекта открыть в дизайнере, будет видно, что там стоит галочка прав или журналирования. Если как-то запретить любые изменения в пакетах, то, скорее всего, просто будет невозможно произвести такие настройки, будет ошибка.

Зверев Александр,

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

И вообще само существование пакета custom прививает людям неправильный подход к работе с системой.

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

Добрый день!

 

Столкнулся с проблемой, что не регистрируются обращения с почтового ящика, которые содержат иной адрес в поле "Кому"

Например, подключен п/я help@aaa.ru, на него на уровне Exchange настроена переадресация (алиас) писем, отправленных на help.old@aaa.ru.

Письма отображаются в списке поступивших писем, не не регистрируются, т.к. в поле Кому help.old, а не help, хоть это и получено в подключенном ящике, прописанном в справочнике "Почтовые ящики для регистрации писем".

Как добиться регистрации писем без подключения к системе самого help.old?

Нравится

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

Попробуйте добавить еще одну запись в справочник "Список почтовых ящиков для регистрации обращений" и в значении почтовый ящик пересылки указать help.old@aaa.ru

Попробуйте добавить еще одну запись в справочник "Список почтовых ящиков для регистрации обращений" и в значении почтовый ящик пересылки указать help.old@aaa.ru

Алексей Следь,

Спасибо за ответ! 

Добавил тот же ящик domain\help только с указанием адреса help.old@aaa.ru в строке "Название пересылки" и это сработало!

Спасибо!

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

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

Нравится

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

Добрый день.

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

Обратите внимание, что обновляться нужно с версии на версию последовательно, не пропуская версии, которые идут между ними!

И ещё важный момент, если например, Вы обновляетесь с версии 7.16.1 на 7.16.3, а потом хотите с версии 7.16.3 на 7.16.4, то в папке с обновлениями должны находиться только дистрибутивы версий, которые идут после текущей и включительно до той, на которую Вы обновляетесь.

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

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

Добрый день.

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

Обратите внимание, что обновляться нужно с версии на версию последовательно, не пропуская версии, которые идут между ними!

И ещё важный момент, если например, Вы обновляетесь с версии 7.16.1 на 7.16.3, а потом хотите с версии 7.16.3 на 7.16.4, то в папке с обновлениями должны находиться только дистрибутивы версий, которые идут после текущей и включительно до той, на которую Вы обновляетесь.

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

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

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

Стоит задача.

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

 

 

Пожалуйста не скидывайте пример: https://academy.terrasoft.ru/docs/7-16/developer/front-end_development/…

Я уже разукрасил грид при загрузке. И пробовал маркетплейс модули но там нет такого функционала.

Теперь нужно при клике, выделенную запись красить исходя из её типа.

 

Стоит полный бандл creatio.

Нравится

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

Ставим debugmode. В BaseGridDetailV2 устанавливаем дебагер на rowSelected там виден call stack отрисовки таблицы. Выводим в консоль this, видим что там есть свойства rowsStyles, cellsClasses, но они нигде не описаны в документации, если разберетесь можете попробовать использовать их.
В нашем случае нам нужны свойства collectionItemPrefix и model.$ActiveRow зная из мы можем составим полный id элемента строки, к примеру id="ContactAddressDetailV2DataGridGrid-d4dc6c60-2243-4b00-a122-7cb4987c07f6-item-82140c2c-41eb-48bb-97fb-51d0c5e92cfd".
Зная id получаем с помощью Ext.getCmp или обычного js, dom-элемент строки и можете манипулировать его свойствами как хотите.

Взял за основу:

https://academy.terrasoft.ru/docs/7-16/developer/front-end_development/…

В  методе детали prepareResponseCollectionItem добавил цвет и маркер по условию:

item.customStyle = {
"EnteringInitialBalances":"",
"--selected-color":"red"
};

И через подключенный css добавил цвет при выделении:

.grid-row-selected[style*=Entering-initial-balances] {
    background-color: var(--selected-color) !important;
}

Результат

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

Как убрать кнопку в виде планеты "отправить сообщение на портал самооблуживания"

Нравится

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

В вашем случае надо разбирать код SectionActionsDashboard и смотреть как формируются табы, чтобы убрать один из них. Открываете схемы и смотрите все что связано со словом Tab.

Жмете правой кнопкой Просмотреть код, разбираетесь по названия к какой схеме он принадлежит и какая у него name, после этого делаете поиск по всему коду и находите в каком схеме в каком diff он добавлен. А то так и будете каждый кейс писать, учитесь сами делать.

 

Полозюков Евгений Петрович,Спасибо, примерную схему поиска я знаю, где-то есть описание как формирует id элемента для поиска в diff массиве?

Видно, что в id добавляет название схемы раздела CaseSection

Денис Суров,

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

В вашем случае надо разбирать код SectionActionsDashboard и смотреть как формируются табы, чтобы убрать один из них. Открываете схемы и смотрите все что связано со словом Tab.

Полозюков Евгений Петрович,Спасибо, посмотрю

мне подошло скрыть контейнер Tabs

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

Добрый день. У меня в таблице Account лежат два внешних ключа на таблицу Contact. Подскажите, как явно указать столбец для джойна. Это:

esq.addColumn("=Contact.Name", "ContactName");

возвращает не верные значения. К тому же, хотелось бы использовать inner join, но запрос летит в виде:
 

LEFT OUTER JOIN [dbo].[Contact] [PrimaryContact] WITH(NOLOCK) ON ([PrimaryContact].[Id] = [UsrAccount].[PrimaryContactId])

* Из примера выше, нужно джойнить по столбцу OwnerId вместо PrimaryContact

Нравится

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

* Из примера выше, нужно джойнить по столбцу OwnerId вместо PrimaryContact

 PrimaryContactId*

Два внешних ключа это два справочных поля со справочником контакта в объекте контрагент? 

Полозюков Евгений Петрович, верно. Один указывает на Основной контакт контрагента, второй на Менеджера работающего с контрагентом.

Другими словами, запрос:
 

SELECT offer.* from UsrCommercialOffer as offer
INNER JOIN Account as acc
    ON offer.UsrAccountId = acc.Id
WHERE acc.OwnerId = @currentUserId

Его нужно написать на фронте. 

Вот статья https://academy.terrasoft.ru/docs/7-17/developer/front-end_development/…

 

Не надо писать равно.

 

Если у вас root таблица в esq это Account в нем к примеру есть поле Ответственный Owner справочник контакта. Вам надо получить какое-то из полей Owner.

 

esq.addColumn("Owner.Id", "OwnerId");

esq.addColumn("Owner.Name", "OwnerName");

 

Также если в контакте тоже есть справочное поле Lookup у справочника которого есть поле Name можно провалится и дальше 

esq.addColumn("Owner.Lookup.Name", "OwnerLookupName");

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