Есть корпоративная почта, права к которой настроены только для учетки Supervisor. Создал бизнес-процесс который при определенных условиях (Пользователь добавляет в деталь запись) должен отправлять письмо с корпоративной почты. Вот когда пользователь добавляет запись, БП запускается под этим пользователем, но так как у пользователя доступа к корпоративной почте нет, БП ломается.

Как сделать так, чтобы процесс запускался всегда под учеткой Supervisor?

Нравится

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

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

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

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

Есть два справочника, Города (базовый) и Районы (Custom). В справочнике районов при добавлении записей, заполняется поле Город. Но возник вопрос, как в карточке редактирования (например в контактах), при выборе города проживания, наложить фильтр на справочник Районов? 

Нравится

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

Добрый день!

Можно при помощи бизнес правил: кодом или редактором 

Добрый день!

Можно при помощи бизнес правил: кодом или редактором 

Спасибо за помощь. Все работает как надо.

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

Доброго дня, коллеги!

Стоит следующая задача - необходимо считать и отправить данные из объекта на удаленный веб-сервис. Удаленный веб-сервис принимает данные в формате XML. Подскажите пожалуйста, каким образом лучше всего это реализовать - используя бизнес-процессы, DataService или каким-либо другим способом? Заранее благодарю за развернутые ответы. 

Нравится

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

Добрый день!

Бизнес процесс, в котором скрипт С# с использованием HttpWebRequest.

Пример:

var request = (HttpWebRequest)WebRequest.Create(serviceAddress);
request.Method = "POST";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
request.Timeout = timeout * 1000;
using (var dataStream = request.GetRequestStream())
{
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
}
var resp = (HttpWebResponse)request.GetResponse();

Где postData - строка XML

Добрый день!

Бизнес процесс, в котором скрипт С# с использованием HttpWebRequest.

Пример:

var request = (HttpWebRequest)WebRequest.Create(serviceAddress);
request.Method = "POST";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
request.Timeout = timeout * 1000;
using (var dataStream = request.GetRequestStream())
{
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
}
var resp = (HttpWebResponse)request.GetResponse();

Где postData - строка XML

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

Всем добрый день. Версия 7.12.

Подскажите, а есть ли какой-нибудь аналог такой конструкции:

esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_DISPLAY_COLUMN, "PrimaryDisplayColumnValue");

на бекенде, для указания в коде задания-сценария бизнес-процесса?

Т.е. получение значения строковой колонки, имеющей отметку как "Отображаемая" при условии, что мы не знаем кода этой колонки?

Нравится

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

Добрый день!

У Entity есть поле PrimaryDisplayColumnValue

Использую вот такую конструкцию:

var esqLookup = new EntitySchemaQuery(UserConnection.EntitySchemaManager, objectId);
var idLookup = esqLookup.AddColumn("Id"); //Id
//var idLookupName = esqLookup.GetPrimaryDisplayColumn();
var lookup= esqLookup.GetEntity(UserConnection, new Guid(guidCode.ToString()));
 
var lookupId = lookup.GetTypedColumnValue<Guid>(idLookup.Name);
var lookupName = lookup.PrimaryDisplayColumnValue;

И получаю в lookupName пустоту. При этом значение id вытаскивается верное.

Можно при помощи GetPrimaryDisplayColumnName:

entitySchemaQuery = new EntitySchemaQuery(typeSchema);
var typePrimaryColumnName = entitySchemaQuery.AddColumn(typeSchema.GetPrimaryColumnName()).Name;
var typeDisplayColumnName = entitySchemaQuery.AddColumn(typeSchema.GetPrimaryDisplayColumnName()).Name;

 

Смородинов Денис,

А Entity Вы получаете?

Попробуйте таким образом:

EntitySchema entitySchema = userConnection.EntitySchemaManager.GetInstanceByName(entityName);
Entity entity = entitySchema.GetEntity(userConnection, idValue);
var primaryColumnValue = entity.PrimaryColumnValue;
var primaryDisplayColumnValue = entity.PrimaryDisplayColumnValue;

 

Зверев Александр пишет:

typeSchema

А можно уточнить вопрос? typeSchema - это то, что у меня в скобках ?

var esqLookup = new EntitySchemaQuery(UserConnection.EntitySchemaManager, objectId);

У ESQ есть несколько разных конструкторов. В моём примере typeSchema — переменная типа EntitySchema. Получить схему по названию можно так:

var manager = UserConnection.EntitySchemaManager;
var schema = manager.GetInstanceByName("Dashboard");

 

Смородинов Денис,

А у вашего объекта установлена колонка для отображения?

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

Добрый день!

В коробке в карточке "Сотрудник" есть поле "Подразделение" типа Справочник.

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

Есть ли возможность в отдельном поле типа Справочник создать аналогичный формат поиска записи?

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

Нравится

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

Добрый день!

Нужно на странице объявить атрибут:

"OrgStructureUnit": {
	"lookupConfig": {
		"hierarchical": true
	},
	"lookupListConfig": {
		"columns": ["FullName", "Head", "Parent.Head"]
	}
},

И ваш справочник должен поддерживать иерархичность: иметь ссылку Parent на себя.

Подробнее можно посмотреть на странице EmployeePage

Добрый день!

Нужно на странице объявить атрибут:

"OrgStructureUnit": {
	"lookupConfig": {
		"hierarchical": true
	},
	"lookupListConfig": {
		"columns": ["FullName", "Head", "Parent.Head"]
	}
},

И ваш справочник должен поддерживать иерархичность: иметь ссылку Parent на себя.

Подробнее можно посмотреть на странице EmployeePage

Сидоров Александр В.,

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

Выбор система предлагает делать в виде дерева. Это заработало. 

Только в результате в поле указывается не "FullName", а "Name".

Требуется ли прописывать дополнительный код или FullName должно заполняться сразу?

Вот пример кода (по сути тут указаны все те же настройки, что и для коробочного поля):

"UsrDep": {

                    "lookupConfig": {

                        "hierarchical": true

                    },

                    "lookupListConfig": {

                        "columns": ["FullName", "Head", "Parent.Head"]

                    }

                }

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

Коллеги, спасибо!

Вопрос решен. Ранее уже про правку кода нашел примеры в логике, на которую Сидоров Александр ссылался.

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

Добрый день, Коллеги! 

Возник следующий вопрос.

Необходимо в реестр справочника, например Статусы обращения, вывести значения колонки IsFinal аналогично методу setSubtitleColumns согласно SDK

https://academy.terrasoft.ru/documents/technic-sdkmob/7-12/sdk-reestra

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

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

 

 

 

 

 

Пример необходимой реализации, колонка контакт:

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

 

 

 

 

 

 

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

Попытки задания Subtitle через дополнительный модуль, подключённый в манифесте для раздела Case, не дал результата. Что-то делаю не так.

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

Спасибо!

 

Нравится

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

Примеры использования этого свойства есть в «коробке» в схемах MobileLookupGridPageConfig, MobileLookupGridOpportunityPageConfig, MobileCaseMessageHistoryModuleConfig и MobileCaseMessageHistoryModuleConfig. Судя по названию, вторая схема как раз может использоваться для окна выбора из справочника. Её код:

Terrasoft.sdk.LookupGridPage.setSubtitleColumns("Opportunity", ["Account"]);

 

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

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

В разделе создал пользовательские фильтры Улица, Дом , Квартира. Значения в фильтре Дом зависят от Улицы, а значения в фильтре Квартира от значения Дом.

Если нажимать на "лупу" то фильтрация успешно отрабатывает. Но если вводить значения в поле - фильтр в выпадающем списке не срабатывает.

Как реализовать фильтрацию выпадающего списка в разделе?

Код схемы раздела:

define("VcApartments1Section", ["BaseFiltersGenerateModule", "css!VcMyFilterStyle"], 
function(BaseFiltersGenerateModule) {
	return {
		entitySchemaName: "VcApartments",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "MyFilterGroupContainer",
				"parentName": "LeftGridUtilsContainer",
				"propertyName": "items",
				"index": 0,
				"values": {
					"id": "MyFilterGroupContainer",
					"itemType": this.Terrasoft.ViewItemType.CONTAINER,
					"items": []
				}
			},
			{
				"operation": "insert",
				"name": "MyFilterContainer",
				"parentName": "MyFilterGroupContainer",
				"propertyName": "items",
				"index": 0,
				"values": {
					"id": "MyFilterContainer",
					"itemType": this.Terrasoft.ViewItemType.CONTAINER,
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "MyFilterContainer",
				"propertyName": "items",
				"name": "VcStreetFilter",
				"values": {
					"bindTo": "VcStreetFilter",
					"caption": "Улица"
				}
			},
			{
				"operation": "insert",
				"name": "MyFilterContainer2",
				"parentName": "MyFilterGroupContainer",
				"propertyName": "items",
				"index": 1,
				"values": {
					"id": "MyFilterContainer2",
					"itemType": this.Terrasoft.ViewItemType.CONTAINER,
					"items": []
				}
			},
				{
				"operation": "insert",
				"parentName": "MyFilterContainer2",
				"propertyName": "items",
				"name": "VcHouseFilter",
				"values": {
					"bindTo": "VcHouseFilter",
					"caption": "Дом"
					// "controlConfig": {
					// 	"prepareList": {
	    //                         "bindTo": "VcHouseFilter"
	    //                     }
					// // "contentType": Terrasoft.ContentType.ENUM
					// }
				}
			},
			{
				"operation": "insert",
				"name": "MyFilterContainer3",
				"parentName": "MyFilterGroupContainer",
				"propertyName": "items",
				"index": 2,
				"values": {
					"id": "MyFilterContainer3",
					"itemType": this.Terrasoft.ViewItemType.CONTAINER,
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "MyFilterContainer3",
				"propertyName": "items",
				"name": "VcNameFilter",
				"values": {
					"bindTo": "VcNameFilter",
					"caption": "Квартира"
				}
			}
			]/**SCHEMA_DIFF*/,
		attributes: {
			"VcStreetFilter": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				isLookup: true,
				caption: "VcStreet",
				referenceSchemaName: "VcStreet"
			},
			"VcHouseFilter": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"lookupListConfig": {
					// Массив фильтров, применяемых к запросу для формирования данных поля-справочника.
					"filters": [
						function() {
							var filterGroup = Ext.create("Terrasoft.FilterGroup");
							var VcStreetFilter = this.get("VcStreetFilter");
							if (VcStreetFilter && VcStreetFilter.value) {
							filterGroup.add("VcStreetFilter",Terrasoft.createColumnFilterWithParameter
							(Terrasoft.ComparisonType.EQUAL, "[VcHouses:Id].VcStreet", VcStreetFilter.value));
							} else {
								filterGroup.removeByKey("VcStreetFilter");
							}
							return filterGroup;
						}
					]
				},
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				isLookup: true,
				caption: "VcHouse",
				referenceSchemaName: "VcHouses"
			},
			"VcNameFilter": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"lookupListConfig": {
					// Массив фильтров, применяемых к запросу для формирования данных поля-справочника.
					"filters": [
						function() {
							var filterGroup = Ext.create("Terrasoft.FilterGroup");
							var VcHouseFilter = this.get("VcHouseFilter");
							if (VcHouseFilter && VcHouseFilter.value) {
							filterGroup.add("VcHouseFilter",Terrasoft.createColumnFilterWithParameter
							(Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].VcHouse", VcHouseFilter.value));
							} else {
								filterGroup.removeByKey("VcHouseFilter");
							}
							return filterGroup;
 
						}
					]
				},
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				isLookup: true,
				caption: "VcName",
				referenceSchemaName: "VcApartments"
			}
		},
		mixins: {
			LookupQuickAddMixin: "Terrasoft.LookupQuickAddMixin"
		},
		methods: {
			onLookupChange: function(newValue, columnName) {
				this.callParent(arguments);
				if (columnName === "VcStreetFilter") {
					this.set("VcStreetFilter", newValue);
					this.onVcStreetFilterChanged();
				}
				if (columnName === "VcHouseFilter") {
					this.set("VcHouseFilter", newValue);
					this.onVcHouseFilterChanged();
				}
				if (columnName === "VcNameFilter") {
					this.set("VcNameFilter", newValue);
					this.onVcNameFilterChanged();
				}
			},
 			// Обновляет грид
			onVcStreetFilterChanged: function() {
				this.reloadGridData();
			},
 
			onVcHouseFilterChanged: function() {
				this.reloadGridData();
			},
 
 			onVcNameFilterChanged: function() {
				this.reloadGridData();
			},
			// Инициализирует фиксированные фильтры
			initQueryFilters: function(esq) {
				this.callParent(arguments);
			// Фильтр по Улице
				var VcStreetFilter = this.get("VcStreetFilter");
 
				if (VcStreetFilter && VcStreetFilter.value) {
					esq.filters.add("VcStreetFilter", this.Terrasoft.createColumnFilterWithParameter(
						this.Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].VcStreet", VcStreetFilter.value));
				} else {
					esq.filters.removeByKey("VcStreetFilter");
				}
			// Фильтр по Дому
				var VcHouseFilter = this.get("VcHouseFilter");
 
				if (VcHouseFilter && VcHouseFilter.value) {
					esq.filters.add("VcHouseFilter", this.Terrasoft.createColumnFilterWithParameter(
						this.Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].VcHouse", VcHouseFilter.value));
				} else {
					esq.filters.removeByKey("VcHouseFilter");
				}
			// Фильтр по названию
				var VcNameFilter = this.get("VcNameFilter");
 
				if (VcNameFilter && VcNameFilter.value) {
					esq.filters.add("VcNameFilter", this.Terrasoft.createColumnFilterWithParameter(
						this.Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].Id", VcNameFilter.value));
				} else {
					esq.filters.removeByKey("VcNameFilter");
				}
			}
		}
	};
});

 

Нравится

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

Сталкивался с подобной проблемой. Пришлось заместить данные методы на странице редактирования (в моем случае) InvoiceSectionV2

			/**
			 * @inheritdoc Terrasoft.BaseViewModel#onLookupDataLoaded
			 * @override
			 */
			onLookupDataLoaded: function(config) {
				this.callParent(arguments);
				this.mixins.LookupQuickAddMixin.onLookupDataLoaded.call(this, config);
			},
			getLookupListConfig: function() {
				return this.mixins.LookupQuickAddMixin.getLookupListConfig.apply(this, arguments);
			},
 
			/**
			 * @inheritdoc Terrasoft.BaseViewModel#getLookupQuery
			 * @override
			 */
			getLookupQuery: function(filterValue, columnName) {
				var esq = this.callParent(arguments);
				this.applyColumnsOrderToLookupQuery(esq, columnName);
				var filterGroup = this.getLookupQueryFilters(columnName);
				esq.filters.addItem(filterGroup);
				return esq;
			},
			/**
			 * Applies order information to lookup entity schema query.
			 * @protected
			 * @param {Terrasoft.EntitySchemaQuery} esq Entity schema query.
			 * @param {String} columnName Lookup column name.
			 */
			applyColumnsOrderToLookupQuery: function(esq, columnName) {
				var lookupColumn = this.getColumnByName(columnName);
				var lookupListConfig = lookupColumn.lookupListConfig;
				if (!lookupListConfig || !lookupListConfig.orders) {
					return;
				}
				var columns = esq.columns;
				this.Terrasoft.each(lookupListConfig.orders, function(order) {
					var orderColumnPath = order.columnPath;
					if (!columns.contains(orderColumnPath)) {
						esq.addColumn(orderColumnPath);
					}
					var sortedColumn = columns.get(orderColumnPath);
					var direction = order.direction;
					sortedColumn.orderDirection = direction ? direction : Terrasoft.OrderDirection.ASC;
					var position = order.position;
					sortedColumn.orderPosition = position ? position : 1;
					this.shiftColumnsOrderPosition(columns, sortedColumn);
				}, this);
			},
			/**
			 * Shift columns order position.
			 * @private
			 * @param {Array} columns Entity columns.
			 * @param {Object} sortedColumn Entity sorting column.
			 */
			shiftColumnsOrderPosition: function(columns, sortedColumn) {
				var sortedColumnOrderPosition = sortedColumn.orderPosition;
				if (Ext.isNumber(sortedColumnOrderPosition)) {
					columns.each(function(column) {
						if (column !== sortedColumn && Ext.isNumber(column.orderPosition) &&
							column.orderPosition >= sortedColumnOrderPosition) {
							column.orderPosition += 1;
						}
					});
				}
			},

 

Сталкивался с подобной проблемой. Пришлось заместить данные методы на странице редактирования (в моем случае) InvoiceSectionV2

			/**
			 * @inheritdoc Terrasoft.BaseViewModel#onLookupDataLoaded
			 * @override
			 */
			onLookupDataLoaded: function(config) {
				this.callParent(arguments);
				this.mixins.LookupQuickAddMixin.onLookupDataLoaded.call(this, config);
			},
			getLookupListConfig: function() {
				return this.mixins.LookupQuickAddMixin.getLookupListConfig.apply(this, arguments);
			},
 
			/**
			 * @inheritdoc Terrasoft.BaseViewModel#getLookupQuery
			 * @override
			 */
			getLookupQuery: function(filterValue, columnName) {
				var esq = this.callParent(arguments);
				this.applyColumnsOrderToLookupQuery(esq, columnName);
				var filterGroup = this.getLookupQueryFilters(columnName);
				esq.filters.addItem(filterGroup);
				return esq;
			},
			/**
			 * Applies order information to lookup entity schema query.
			 * @protected
			 * @param {Terrasoft.EntitySchemaQuery} esq Entity schema query.
			 * @param {String} columnName Lookup column name.
			 */
			applyColumnsOrderToLookupQuery: function(esq, columnName) {
				var lookupColumn = this.getColumnByName(columnName);
				var lookupListConfig = lookupColumn.lookupListConfig;
				if (!lookupListConfig || !lookupListConfig.orders) {
					return;
				}
				var columns = esq.columns;
				this.Terrasoft.each(lookupListConfig.orders, function(order) {
					var orderColumnPath = order.columnPath;
					if (!columns.contains(orderColumnPath)) {
						esq.addColumn(orderColumnPath);
					}
					var sortedColumn = columns.get(orderColumnPath);
					var direction = order.direction;
					sortedColumn.orderDirection = direction ? direction : Terrasoft.OrderDirection.ASC;
					var position = order.position;
					sortedColumn.orderPosition = position ? position : 1;
					this.shiftColumnsOrderPosition(columns, sortedColumn);
				}, this);
			},
			/**
			 * Shift columns order position.
			 * @private
			 * @param {Array} columns Entity columns.
			 * @param {Object} sortedColumn Entity sorting column.
			 */
			shiftColumnsOrderPosition: function(columns, sortedColumn) {
				var sortedColumnOrderPosition = sortedColumn.orderPosition;
				if (Ext.isNumber(sortedColumnOrderPosition)) {
					columns.each(function(column) {
						if (column !== sortedColumn && Ext.isNumber(column.orderPosition) &&
							column.orderPosition >= sortedColumnOrderPosition) {
							column.orderPosition += 1;
						}
					});
				}
			},

 

Спасибо, все получилось!

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

У нас есть раздел "Конфигурации", в котором хранится техника сотрудников. При заполнении раздела использовали импорт данных. Необходимо было уникальное поле, которого у нас не было, и мы добавили в эксель файл поле номер "КЕ00000...", который генерируется автоматически при заполнении вручную. 

Но теперь при попытке добавить КЕ вручную, номер не генерируется последний, а начинает с первого заполняться (КЕ00000001). 

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

Нравится

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

Скорее всего, в Вашей конфигурации в системных настройках есть настройка, которая хранит текущий номер КЕ.

Вам нужно изменить её значение на номер последней КЕ.

Скорее всего, в Вашей конфигурации в системных настройках есть настройка, которая хранит текущий номер КЕ.

Вам нужно изменить её значение на номер последней КЕ.

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

Благодарю, нашел нужный SEQUENCE в базе и подправил через alter.

Идрисов Артур Ильдарович,

Всегда рада помочь!smiley

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

Добрый день!

Столкнулся со следующей ошибкой во время билда/ребилда через WorkSpaceConsole, настроенный в VS.

Error: Dependency 'TripUsefulConfigurationService' of package 'Business_Trip_Objects' was not found.

Нашел статью, параметры в консоли и WebConfig значение флага CompileByManagerDependencies совпадает и равняется true.

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

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

Нравится

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

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

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

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

Добрый день! Прошу помочь со следующим кейсом:

В обращении при наступлении события X запускается бизнес-процесс и отправляется email. Необходимо прикрепись к нему все вложения с детали Файлы и ссылки.

Какие есть пути реализации? Заранее спасибо!

Нравится

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

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

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

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

Реализация следующая: создал активность типа Activity, заполнил обязательными для отправки письма полями, сохранил, создал несколько сущностей типа ActivityFile, ссылающихся на мою активность Activity, отправил письмо методом .Send(activityid) класса ActivityEmailSender. Тщательно продебажил метод, убедился что в собранном письме хранится коллекция из двух вложений.

Как мне отправить все вложения? Где я ошибся?

Кто-нибудь может подсказать почему выполняя отправку письма способом ниже из ActivityFile привязывается только один файл вложением, вместо двух?

var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection", UserConnection));
 
var activityEmailSender = new ActivityEmailSender(emailClientFactory, userConnection);
 
activityEmailSender.Send(activity.Id);

 

 

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

Алла Савельева, спасибо вам большое)

Омельянюк Михаил,

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

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

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