Добрый день.

На странице редактирования имеется деталь с редактируемым реестром с собственным объектом, необходима возможность добавления записей по ней на странице портального и странице системного пользователей. Настроил доступы к обьекту детали для обеих ролей, открыл доступ доступ к записям с указанием правил раздачи прав на чтение и изменение, указал какие права должны раздаваться по умолчанию. Настоил записи в таблицах SysModuleEntity, SysEntitySchema и SysEntitySchemaInPortal, результат следующий:

1)при наличии записи в таблице SysEntitySchemaInPortal по данному обьекту сущность обьекта детали инициализируется при запуске приложения под портальным пользователем, возможность длбавлять записи есть, а при запуске приложения под обычным пользователем, не инициализируется, добавлять запись нельзя, плюсик соответственно тоже не виден.

2)при удалении записи из SysEntitySchemaInPortal все наоборот, обычный пользователь может создавать запись, а портальный - нет.

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

Заранее спасибо!

Нравится

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

Что-то не могу найти схему SysEntitySchemaInPortal в конфигурации. Может, это какая-то доработка? Обычно для указания, какие схемы доступны на портале, их вносят в «Список объектов, доступных пользователям портала» (SysSSPEntitySchemaAccessList) и их поля в «Список доступных полей объектов на портале» (PortalSchemaAccessList).

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

Добрый день!

Необходимо выделить лиды которые не были открыты пользователем. 

Есть следующий код:

define("LeadSectionV2", [], function() {
	return {
		entitySchemaName: "Lead",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			prepareResponseCollectionItem: function(item) {
				this.callParent(arguments);
				var scope = this;
				var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
					rootSchemaName: "UsrLeadStatusByUser"
				});
				esq.addColumn("Id");
				var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrLead", item.get("Id"));
				var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrContact", Terrasoft.SysValue.CURRENT_USER_CONTACT.value);
				esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
				esq.filters.add("esqFirstFilter", esqFirstFilter);
				esq.filters.add("esqSecondFilter", esqSecondFilter);
				esq.getEntityCollection(function (result) {
					if (result.success && result.collection.collection.items.length > 0) {
						//Лид уже был просмотрен
						item.customStyle = null;
					}else{
						//Лид еще ни разу не открывали
						item.customStyle = {
							"color": "white",
							"background": "#8ecb60",
							"font-weight": "bold"
						};
					}
				}, scope);
			}
		}
	};
});

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

Подскажите, пожалуйста, красивое решение вопроса.

Нравится

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

В объектной модели Лида, добавьте например булево значения IsViewed, в момент открытия карточки, обновляйте это значение.

А подкрашивание грида, делайте уже от этого параметра IsVewed (true/false).

В объектной модели Лида, добавьте например булево значения IsViewed, в момент открытия карточки, обновляйте это значение.

А подкрашивание грида, делайте уже от этого параметра IsVewed (true/false).

Спасибо, Павел! Скорее всего так и поступлю. Хотел сделать по пользователям, но откажусь от этой затеи.

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

Руслан Хасанов пишет:

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

Путем использования сообщений, вызовите в разделе метод this.refreshGridData();



Примерно так:

 

init: function() {
	this.callParent(arguments);
	this.sandbox.subscribe("NeedReloadLeadGrid", this.customMethod, this);
},
customMethod: function() {
	//если нужно что-то еще сделать, то делаете, а потом:
	this.refreshGridData();
}
 
messages: {
	"NeedReloadLeadGrid": {
		"mode": Terrasoft.MessageMode.PTP,
		"direction": Terrasoft.MessageDirectionType.SUBSCRIBE
	}
}
 
 
На карточке лида, по сохранению/закрытии/изменении параметра, в общем там, где вам нужно, вызываете публикацию данного сообщения.
 
messages: {
	"NeedReloadLeadGrid": {
		"mode": Terrasoft.MessageMode.PTP,
		"direction": Terrasoft.MessageDirectionType.PUBLISH
	}
}
 
callPublish_YourCustomMethod: function() {
	this.sandbox.publish("NeedReloadLeadGrid", null, ["_NeedReloadLeadGrid"]);
}
 
//вместо null можете передать объектом параметры, при необходимости

 

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

Коллеги, приветствую!

Столкнулся с проблемой у детали с редактируемым реестром.

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

Делаю все по инструкции из https://academy.terrasoft.ru/documents/technic-sdk/7-14/detal-s-redaktiruemym-reestrom (включая регистрацию через sql-запрос)

+ пункт 3 из https://academy.terrasoft.ru/documents/technic-sdk/7-14/detal-so-stranicey-dobavleniya (включая регистрацию связи между схемой объекта детали и схемой страницы редактирования записи детали через sql-запрос и перекомпиляцию в конфигурации)

Так же пробовал на демо-стенде с грубо говоря копипастом из инструкции - результат тот же.

Что забыл\упустил? Заранее благодарю!

 

Нравится

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

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

Проверьте, действительно, ли добавилась нужная информация в SysDetails, SysModuleEntity и SysModuleEdit в базе данных Вашего сайта.

Это можно сделать с помощью sql-запроса к базе данных.

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

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

Проверьте, действительно, ли добавилась нужная информация в SysDetails, SysModuleEntity и SysModuleEdit в базе данных Вашего сайта.

Это можно сделать с помощью sql-запроса к базе данных.

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

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

Алла, добрый день!

По базе вроде бы все на своих местах. Но так или иначе ваш способ сработал, спасибо вам огромное)

Надо будет сравнить таблицы и разобраться с вариантом "вручную".

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

Всем доброго времени суток! 

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

Terrasoft.Web.Common.ServiceModel.ErrorHandler ProvideFault - Метод не найден: "System.IO.Packaging.PackageProperties DocumentFormat.OpenXml.Packaging.OpenXmlPackage.get_PackageProperties()".

System.MissingMethodException: Метод не найден: "System.IO.Packaging.PackageProperties DocumentFormat.OpenXml.Packaging.OpenXmlPackage.get_PackageProperties()

Пробовал устанавливать разные версии библиотеки не помогло.

Кто работал с библиотекой ClosedXml в bpm'online, может знает какую версию использовать?

Текущая версия crm 7.14.4 

заранее благодарен.

Нравится

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

Столкнулся, к сожалению. пришлось все переписывать... В ClosedXML используются библиотеки DocumentFormat.OpenXml, в версии 7.14 видимо обновили версию библиотеки/зависимых библиотек и все. Мучался часа 3 с зависимостями, потом плюнул и переписал на OpenXml генерацию xls

Столкнулся, к сожалению. пришлось все переписывать... В ClosedXML используются библиотеки DocumentFormat.OpenXml, в версии 7.14 видимо обновили версию библиотеки/зависимых библиотек и все. Мучался часа 3 с зависимостями, потом плюнул и переписал на OpenXml генерацию xls

А что говорит по этому вопросу служба поддержки? Что они рекомендуют?

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

Здравствуйте! Пока ничего. Анализирует предоставленный мною лог.

Нигрескул Алексей,

Поделитесь потом здесь ответом, очень интересует данная тема. Спасибо)

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

Добрый день!

Возможно ли сделать поле Мобильный телефон стандартным условием поиска Контакта (при выборе из справочника) в одном разделе.

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

Нравится

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

Доброе утро!

Смотрите обсуждения в этом посте и в этом.

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

Забыл упомянуть, справочник не обычный а multilookup (Выбор из контактов и аккаунтов).

Решил пойти сложным путем, добавил схему CustomLookupPage (расширил MultiLookupModule) и в нем переопределил 

onTabChanged и 
generateViewModel

 для поиска по мобильному телефону у контакта. Код: 

define("CustomLookupPage", ["LookupPage", "LookupPageViewGenerator", "LookupPageViewModelGenerator", "LookupUtilities", "css!LookupPageCSS"],
   function(LookupPage, LookupPageViewGenerator, LookupPageViewModelGenerator) {

      return Ext.define("Terrasoft.configuration.CustomLookupPage", {
         alternateClassName: "Terrasoft.CustomLookupPage",
         extend: "Terrasoft.MultiLookupModule",

         gridWrapClasses: ["multi-lookup-control"],


         onTabChanged: function(activeTab) {
            var lookupsInfo = this.get("LookupsInfo");
            Terrasoft.each(lookupsInfo, function(lookupInfo) {
               if (activeTab.get("Name") !== lookupInfo.entitySchemaName) {
                  return true;
               }
               this.lookupInfo = lookupInfo;

               this.getSchemaAndProfile(lookupInfo.lookupPostfix, function(entitySchema, profile) {
                  this.isClearGridData = true;
                  this.set("gridProfile", profile);
                  this.entitySchema = entitySchema;
                  this.initLoadedColumns();
                  var searchColumn = this.get("searchColumn");
                  if (!entitySchema.columns[searchColumn.value]) {
                     this.set("searchColumn", {
                        value: this.entitySchema.primaryDisplayColumn.name,
                        displayValue: this.entitySchema.primaryDisplayColumn.caption
                     });
                     this.set("searchData", "");
                  }
                  this.set("LookupInfo", this.lookupInfo);
                  this.load(profile, function() {
                     var lookupInfo = this.lookupInfo;
                     var entitySchema = this.entitySchema;

                     //у контакта поиск по мобильному телефону
                     if (this.entitySchema.name == "Contact") {
                        this.set("searchColumn", {
                           value: "MobilePhone",
                           displayValue: "Мобильный телефон"
                        });
                     } else {
                        this.set("searchColumn", {
                           value: entitySchema.primaryDisplayColumn.name,
                           displayValue: entitySchema.primaryDisplayColumn.caption
                        });
                     }

                     var captionLookup = this.getLookupCaption(entitySchema, lookupInfo);
                     this.set("captionLookup", captionLookup);
                     this.set("lookupSchemaName", entitySchema.name);
                     this.setSearchEditFocused();
                  }.bind(this));
               });
            }, this);
         },

         generateViewModel: function() {

            var viewModelConfig = LookupPageViewModelGenerator.generate(this.lookupInfo);

            //у контакта поиск по мобильному телефону
            viewModelConfig.values.searchColumn = {
               value: "MobilePhone",
               displayValue: "Мобильный телефон"
            };

            if (!this.lookupInfo.columnValue && this.lookupInfo.searchValue) {
               viewModelConfig.values.searchData = this.lookupInfo.searchValue;
               viewModelConfig.values.previousSearchData = this.lookupInfo.searchValue;
            }
            var viewModel = this.Ext.create("Terrasoft.BaseViewModel", viewModelConfig);
            viewModel.Ext = this.Ext;
            viewModel.sandbox = this.sandbox;
            viewModel.Terrasoft = this.Terrasoft;
            if (this.lookupInfo.updateViewModel) {
               this.lookupInfo.updateViewModel.call(viewModel);
            }
            viewModel.initCaptionLookup();
            viewModel.initHasActions();
            viewModel.initLoadedColumns();
            if (!this.Ext.isEmpty(this.lookupInfo.filterObjectPath)) {
               viewModel.updateFilterByFilterObjectPath(this.lookupInfo.filters, this.lookupInfo.filterObjectPath);
            }
            if (this.lookupInfo.hideActions) {
               viewModel.set("hasActions", false);
            }
            return viewModel;
         },
      });
   });

Отображается поле на странице следующим образом:

"SxShipper": {
   "caption": { "bindTo": "Resources.Strings.SxShipper" },
   "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
   //"multiLookupColumns": ["SxShipperContact", "SxShipperAccount"],
   "lookupListConfig": function() {
      return this.getLookupListConfig();
   },
   "isRequired": true
},

...

getLookupListConfig: function() {
   var multiLookupColumns = ["Contact", "Account"];
   var multiLookupConfig = multiLookupColumns.map(function(column) {
      return {
         entitySchemaName: column,
         columnName: "SxShipper",
         multiLookupColumnName: "SxShipper" + column,
         multiSelect: false,
         hideActions: true
      };
   }, this);
   var config = {
      lookupModuleId: this.Terrasoft.generateGUID(),
      lookupPageName: "CustomLookupPage",
      multiLookupConfig: multiLookupConfig
   };

   return config;
},

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

В чем может быть дело и в каком направлении копать?

Попробуйте для начала добиться нормальной работы лукапа по обычному ФИО, а затем модифицируйте под поиск по телефону.

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

Добрый день. Возникла проблема с передачей параметров бизнес-процесса в тело письма.

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

Так сконфигурирована отправка.

В тело письма вставлен параметр через "молнию" на панели. Само тело - обычный текст.

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

 

Параметр - статичная строка, которая нигде в процессе не меняется.

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

HTML вставки параметра выглядит так:

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

Итоговое письмо после получения выглядит так:

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

Т.е. параметры не вставляются во время отправки.

Пробовал:

1. Смена почтового провайдера (Office 365, Gmail, Yandex). Опробованы были как и почтовые ящики в роли рассылаемого, так и в роли принимаемого. Результат не изменился.

2. Тест с различными параметрами и различными типами параметров (дата-время, целые числа, строки).

3. Всеразличные перегенерации всех исходников для всех элементов, перекомпиляции всего.

4. Смотреть данные через автогенерируемую страницу перед отправкой. Данные имеются и корректны.

5. Тестирование на версии 7.12.3.980 (Marketing) Там параметры корректно вставляются и письмо с теми же почтовыми провайдерами попадает на почту в необходимом виде.

Также в системе есть шаблоны писем с параметрами, но там всё преобразуется в корректное письмо. Однако отправлять письмо по шаблону я не могу - в конечном счёте мне необходимо в тело письма вставить данные не привязанные к конкретной сущности, а генерируемые в рамках БП.

В чем ещё может быть проблема? Заранее спасибо.

 

 

Нравится

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

Для начала нужно выяснить, дело в продукте или в версии. Попробуйте проделать на Marketing 7.14. Работает ли там настроенная Вами логика?

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

Кейс: чек-лист сделан в виде детали на странице звонка. Пользователь всегда хочет видеть список чек-листа сразу полностью развернутым, без кнопки "показать больше".

Подскажите, пожалуйста, как это можно реализовать?

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

 

 

 

Нравится

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

Можно в своём пакете модифицировать страницу этой детали, задать заведомо большое значение RowCount (например, 100) и, если нужно, отрицательное IsDetailCollapsed, отвечающее за свёрнутость. См. в схеме BaseProcessExecutingDetail:

/**
 * @inheritdoc BaseDetailV2#initDetailOptions
 * @override
 */
initDetailOptions: function() {
	this.set("IsDetailCollapsed", false);
	this.set("RowCount", 20);
},

Также см. статью.

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

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

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

Стоит задача: создать действие по смене спр. колонки "Ответственный" в новосозданном разделе. По нажатию на действие должен открываться выбор из справочника Административных единиц с фильтрацией по типу "Сотрудник".

П.С. Сильно камнями не кидайте, я только учусь :) 

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

П.С. Сильно камнями не кидайте, я только учусь :) 

Нравится

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

Доброе утро.

Можно для Вашей карточки редактирования указать в качестве родительской BaseModulePageV2 из пакета NUI, тогда кнопка [ACTIONS] должна появится.

Если же Вы не хотите наследоваться от этой карточки, то можете посмотреть, каким образом реализуется добавление этой кнопки и пунктов её меню в 'Base card schema' (BasePageV2) пакета NUI.

Доброе утро.

Можно для Вашей карточки редактирования указать в качестве родительской BaseModulePageV2 из пакета NUI, тогда кнопка [ACTIONS] должна появится.

Если же Вы не хотите наследоваться от этой карточки, то можете посмотреть, каким образом реализуется добавление этой кнопки и пунктов её меню в 'Base card schema' (BasePageV2) пакета NUI.

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

Спасибо, сделала по первому совету - появилась. 

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

Есть ли какое нибудь событие или пример кода, который бы срабатывал только при открытии любой записи в Section?

Нравится

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

init

onRender

А чем метод onEntityInitialized не устраивает?

тем что он не срабатывает в Section. На форуме пишут что его там вообще нет.

init

onRender

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

В версии Sales Enterprise есть раздел [Планирование], который я хочу воссоздать самостоятельно(ради опыта)

Каким образом это можно сделать? Есть ли статьи или то, на что надо обратить внимание?Изображение удалено.

Нравится

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

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

Ну, или заказать в Индии клон всей системы за $750 и за 5 дней.wink

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

Про клон - это прям огонь тема)))))))

Вот копия того заказа в веб-архиве.

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