Добрый день!
У нас возникли проблемы с фильтрацией получаемых через odata данных.
Мы пробовали несколько вариантов:
client.AccountCollection.Where(x => x.CgrDistributorId == DistributorId).ToList();

также через LINQ:
var result = from account in (client.AccountCollection as IQueryable)
where account.CgrDistributorId == DistributorId
select account;
result.ToList();
Эти варианты выдают ошибку "Элемент коллекции с именем CgrDistributorId не найден", хотя данная колонка есть. Мы обновляли ServiceReference, а данные из неё получаються если загрузить список не используя фильтр.

работает только:
client.AccountCollection.ToList().Where(x => x.CgrDistributorId == DistributorId).ToList();
Но он не подходит, т.к. он перед фильтрацией подгружает весь список и фильтрует данные уже в ОЗУ, что не корректно.

Нравится

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

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

Выполните фильтрацию в самом обращение к ODATA:
using (var response = (HttpWebResponse)authRequest.GetResponse()) {
// Создание запроса на получение данных от сервиса OData.
//var dataRequest = HttpWebRequest.Create(serverUri + "ContactCollection?$select=Id, Name, Gender&$expand=Gender&$filter = Id eq guid'" + contactId + "'") as HttpWebRequest;
var dataRequest = HttpWebRequest.Create(serverUri + "ContactCollection?$select=*&$filter = Id eq guid'" + contactId + "'") as HttpWebRequest;
// Для получения данных используется HTTP-метод GET.
dataRequest.Method = "GET";
// Добавление полученных ранее аутентификационных cookie в запрос на получение данных. ,Products&$expand=Products/Suppliers
dataRequest.CookieContainer = bpmCookieContainer;
// Получение ответа от сервера.
using (var dataResponse = (HttpWebResponse)dataRequest.GetResponse()) {
// Загрузка ответа сервера в xml-документ для дальнейшей обработки.
XDocument xmlDoc = XDocument.Load(dataResponse.GetResponseStream());
// Получение коллекции объектов контактов, соответствующих условию запроса.
var contacts = from entry in xmlDoc.Descendants(atom + "entry")
select new {
Id = new Guid(entry.Element(atom + "content")
.Element(dsmd + "properties")
.Element(ds + "Id").Value),
Name = entry.Element(atom + "content")
.Element(dsmd + "properties")
.Element(ds + "Name").Value
};
foreach (var contact in contacts) {
// Выполнение действий с контактами.
}
}
}

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

Существует ли возможность управлять настройкой колонок в окне выбора из справочника на уровне кода схемы из которой он вызывается, например через LookupUtilities.Open ?

Нравится

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

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

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

Создал колонку на детали Связи Активности, на пейдже она отображается и работает, а вот в редакторе БП её нету.
Существует ли какой-то способ добавить её туда?

Нравится

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

Добрый день!

Деталь Связи Активности формируется динамически, в нее добавляются все справочные поля данного объекта. В редактор БП автоматически подтягивает все lookup'ы которые есть в системе. Рекомендую перепроверить что Ваша колонка присутствует в объекте и ее можно найти в разделе Справочники.

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

Возможно я неправильно выразился, когда сказал, что колонки нету в редакторе БП: я имел ввиду элемент "Выполнить задачу", мне колонка нужна там, а если использовать "Добавить данные" (Активность), то там колонка есть, но это не то, что мне нужно. Справочник и колонка в объекте существуют, очистка кеша и редиса не помогли.

Здравствуйте,
Колонка к сожалению, там автоматически не появится, т.к. элемент «Выполнить задачу» это схема (ActivityUserTask), которая создает служебную задачу (аквтивность), и оперирует параметрами что описаны в этой схеме. Рекомендую вам за элементом «Выполнить задачу» использовать элемент «Изменить данные» и по id созданной задачи, изменять эту активность. Там (в элементе Изменить данные) ваша колонка будет.

Добрый день. Может кому актуально будет, но я нашел ответ на этот вопрос.

В БП в новых элементах "Выполнить задачу" связь появляется, а в уже имевшихся, т.е. созданных до добавления новой связи, - нет. Это связано с метаданными схемы БП, он их никогда не обновляет.

Решение напрашивается само собой: нужно в БП/Кейсе удалить старый элемент выполнить задачу, создать новый элемент, и настроить как только что удалённый. Связь появится.

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

Степин Константин Владимирович,

Константин идея хорошая, но есть одно большое НО. Если в БП есть зависимые элементы БП. То править нужно будет и их. и если представить что ветвление очень огромное, то это займет очень много времени.

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

Добрый день.

У нас возник выопрос, можно ли изменть значение системных настроек через Odata?
При попытке сохранить изменения под супервизором через odata нам выдаёт ошибку Forbidden.
Мы предполагаем, что это может быть связано с тем, что доступ к ним через Odata закрыт.
Подскажите, может кто то сталкивался с подобной проблемой.

Нравится

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

Здравствуйте, Богдан!

Изменение значений системных настроек через OData не предусмотрено.

Есть два варианта решения этой задачи:
1) Создать собственный web сервис, который будет менять значения системных настроек в таблице SysSettingsValue
2) Создать объект, к которому будут идти обращения по OData. Логикой в созданном объекте (или триггерами в БД) необходимо будет переносить новые значения в таблицу SysSettingsValue.

Раньше было нельзя, только несколько таблиц с префиксом Sys открыты на запись

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

Метод onEntityInitialized очевидно не работает в схемах секции, я подразумеваю что для них существует специфический метод-аналог, но беглым поиском по исходникам однозначной информации полцчить не удалось.
Метод "init" отрабатывает когда карточка еще не инициализирована, в частности детали на странице, мне же требуется взаимодействие с ними, в коде карточки в методе onEntityInitialized - отлично отрабатывает моя логика, но вот в секции - аналогичный трюк "не проходит", точка останова внутри onEntityInitialized вообще не передается на исполнение.

Нравится

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

Просто в странице в методе init описан onEntityInitialized, а в разделе - нет. Как вариант можно заместить базовую схему страницы и написать что-то своё:

init: function(callback, scope) {
	var performanceManagerLabel = "";
	if (scope && scope.hasOwnProperty("sandbox")) {
		performanceManagerLabel = scope.sandbox.id;
	} else if (this && this.hasOwnProperty("sandbox")) {
		performanceManagerLabel = this.sandbox.id;
	}
	performanceManager.start(performanceManagerLabel + "_Init");
	this.callParent([function() {
		Terrasoft.chain(
			this.checkAvailability,
			this.initViewModelValuesFromSysSettings,
			this.initActiveViewSettingsProfile,
			this.initData,
			this.initLeftSectionContainerSize,
			function(next) {
				this.canUseWizard(function(result) {
					this.set("CanUseWizard", result);
				}, this);
				this.checkCanManageAnalytics();
				this.initSectionFiltersCollection();
				this.initSortActionItems();
				this.initDataViews();
				this.initActionButtonMenu("Separate", this.getSectionActions());
				this.initSectionViewOptionsButtonMenu(this.getViewOptions());
				this.initDcmActionsDashboardVisibility(function() {
					this.initCanUseDcmDesigner();
				}, this);
				this.initEditPages();
				this.initCardContainer();
				this.initContextHelp();
				this.initAddRecordButtonParameters();
				this.initFolders();
				this.initRowCount();
				this.initIsPageable();
				this.initIsActionButtonsContainerVisible();
				this.initUpdateAction();
				this.initResetAction();
				this.subscribeInitFilterFromStorage();
				this.initActionsButtonHeaderMenuItemCaption();
				this.subscribeSandboxEvents();
				this.mixins.GridUtilities.init.call(this);
				this.subscribeIsCardVisibleChange();
				this.subscribeGetRunProcessesProperties();
				this.initRunProcessButtonMenu(false);
				this.subscribeCanShowTags();
				this.initActionsButtonCaption();
				this.subscibeOnMultiSelectChange();
				this.subscibeOnSelectedRowsChange();
				this.initTags(this.entitySchemaName);
				this.initSectionHeaderContainerVisibility();
				next();
			},
			function(next) {
				this.onSectionInitialized();
				next();
			},
			function() {
				performanceManager.stop(performanceManagerLabel + "_Init");
				performanceManager.start(performanceManagerLabel + "_BeforeRender");
				callback.call(scope);
			}, this);
		this.initHelpUrl(this.Terrasoft.emptyFn, this);
		this.initPrintButtonsMenu(this.Terrasoft.emptyFn, this);
	}, this]);
},
onSectionInitialized: function() {
	debugger;
}

Но работать будет немного криво (пр.: у меня при остановке на дебагере в "GridData" валяется пустая коллекция. Инициализируется она, видимо, позже). Посмотрите, может вам подойдёт.

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

Добрый день. Проблема при переносе из SVN. Был изменен базовый раздел "Продукты" с одной страницы редактирования, на несколько. Все это залито в svn, а потом перенесено на чистое приложение(версии одинаковые 7.9.1.3284) и при открытии раздела "Продукты" мастером раздела стоит галка "Использовать одну страницу для всех записей" => все работает не корректно(поля справочника к которому было привязано несколько страниц не заполняется, первая страница не открывается)

Нравится

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

Добрый день.
После того как добавили пакет в новую систему вы сделали ряд операций:

После установки пакета из SVN необходимо выполнить следующие действия:
 
1. Сгенерировать для требующих генерации.
2. Компилировать все.
3. Выбрать элементы, структура которых менялась. Обновить для них структуру БД.
4. На вкладке Данные отобразить колонки Текст последней ошибки и Требует установки в БД. Установить выбранные элементы.
5. На вкладке SQL сценарии Установить выбранные элементы.

?

+ добавить в пакет привязку данных со справочника на который идет типизация.

Все это сделал и не один раз(чистую базу разворачивал, снова заливал пакет).
Данный к справочнику привязаны. Он же переносит и почему то показывает 3 из 4х, а первый пункт меняет на стандартный "

Добрый день, Павел.

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

Мария, добрый день. Не совсем понял вопрос. Данные привязаны в данных (создавался объект(родитель базовый справочник), добавил в справочники этот объект, заполнил и привязал данные из этого объекта).

Здравствуйте, Павел.

"Павел И" написал:

Мария, добрый день. Не совсем понял вопрос. Данные привязаны в данных (создавался объект(родитель базовый справочник), добавил в справочники этот объект, заполнил и привязал данные из этого объекта).

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

123.jpg
17.72 кб

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

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

))) смешно...но сам столкнулся с такой проблемой.
В пакете- данные отражаются. Но после компиляции их все равно в БД нет. 7.9.1

Павел, если при установке данных не возникло ошибок проблема может быть в не корректной привязке данных. Рекомендуем ознакомиться с инструкцией привязки данных: https://academy.terrasoft.ru/documents/technic-sdkmp/7-9/privyazka-dann….

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

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

Начну, пожалуй, с описания кейса.
Есть некий раздел, который называется "Заявки АХО".
В этом разделе необходимо добавить функционал визирования (как в договорах, например).

Что готово на данный момент:
1. Полностью реализованы бизнес-процессы (главный и саб-процесс).
2. Готовы нужные системные настройки.
3. Добавлено администрирование по записям, для объекта визы.
4. Настроен шаблон email уведомления (не совсем уверен, что настроен правильно).

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

Итак прилагаю все возможные скриншоты и готов приложить больше если потребуется.
Так же прикрепляю два файла:
1. HTML-код шаблона для уведомления.
2. C# код для провайдера, тот самый с которым нужна помощь.

Нравится

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

Дополнение.
Список и содержимое localizableStrings:
BodyTemplate - Заявка АХО {0} от {1} требует визы.
TitleTemplate - Требуется утверждение.
DateMacros - dd.MM.yyyy

Обновление.
Тема нынче не актуальна, со всем разобрался.

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

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

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

Версия 7.9 sales.

Задача следующая: на странице E-mail есть справочник выбора адреса "Кому". Также на странице есть колонка, связывающая с некоторым контрагентом. В общем случае требуется, чтобы при выборе адреса email были доступны только адреса контактов установленного контрагента.

Как я понимаю, фильтр устанавливается в методе getLookupConfig в схеме EmailPageV2, а точнее, в return:

return {
        config: {
                entitySchemaName: "VwRecepientEmail",
                columnName: columnName,
                columns: ["ContactId"],
                filters: Terrasoft.createColumnIsNotNullFilter("ContactId"),
                multiSelect: true
        },
        callback: callback
};

Вытащить список контактов можно запросом. Далее следует сформировать массив id, и по идее скормить его параметру filters в конфиге..

Но если я задаю например вместо Terrasoft.createColumnIsNotNullFilter("ContactId") задаю функцию с filterGroup таким образом (нашёл на форуме), для примера подставил пока хардкодные idшники:

filters: function() {
         var idList = ["171fbe60-eafc-4713-85eb-7ad92aa2e9e2","8ec32762-286f-477c-a599-2c4184bab8d9"];
         var filterGroup = new Terrasoft.createFilterGroup();
         var filterById = Terrasoft.createColumnInFilterWithParameters("ContactId", idList);
         filterById.comparisonType = Terrasoft.ComparisonType.EQUAL;
         filterGroup.add("filterById", filterById);
         return filterGroup;
},

То справочник вообще не открывается, а в консоль вываливается ошибка (см. скрин).

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

Нравится

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

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

define("EmailPageV2", ["BusinessRuleModule"],
	function(BusinessRuleModule) {
	return {
		entitySchemaName: "Activity",
		methods: {
			getLookupConfig: function(columnName) {
				var scope = this;
				var callback = function(args) {
					scope.onLookupSelected(args);
				};
				return {
					config: {
						entitySchemaName: "VwRecepientEmail",
						columnName: columnName,
						columns: ["ContactId"],
						filters: this.returnNewFilter(),
						multiSelect: true
					},
					callback: callback
				};
			},
			returnNewFilter: function() {
				var idList = ["410006e1-ca4e-4502-a9ec-e54d922d2c00", "e7d525fb-88ee-4947-94cc-d013e85d2f79"];
				var filterGroup = new Terrasoft.createFilterGroup();
				var filterById = Terrasoft.createColumnInFilterWithParameters("ContactId", idList);
				filterById.comparisonType = Terrasoft.ComparisonType.EQUAL;
				filterGroup.add("filterById", filterById);
				return filterGroup;
			}
		},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[],/**SCHEMA_DIFF*/
		rules: {
		}
	};
});

Максим, спасибо, помогло.

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

Как осуществить вызов метода, другого, заведомо известного модуля/схемы ?

Например вызвать метод addRecord некоей детали на странице карточки - из кода метода который забинжен на кнопку верхнего горизонтального меню этой карточки.

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

Нравится

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

Добрый день.

Для данной цели Вам необходимо воспользоваться сообщениями sandbox. Данная тема подробно обсуждалось тут.

Подскажите, в клиентской схеме можно описать специальный конфигурационный объект messages, а как быть с модулями, у них иная структура AMD модуля.
Допустим я хочу использовать модуль-миксин.
В конфигураторе в структуре модуля модно добавить события (Messages).

насколько я понимаю - описать событие в коде самого модуля нельзя ?

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

Как же так получается ?
В модуле объявляется событие, но подключив этот модуль к карточке - объявленные в нем события не доступны для публикации ?

Здравствуйте, Илья.

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

Подскажите, почему даже если указать в зависимостях схемы модуль в котором объявлено "сообщение",
скажем некий модуль AksQuestionMessages

define("AksQuestionMessages", [], function() {
	return {
		messages: {
			"AddNewEmailFromCaseAskQuestion": {
				mode: this.Terrasoft.MessageMode.BROADCAST,
				direction: this.Terrasoft.MessageDirectionType.PUBLISH
			}
		}
	};
});

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

Сам отвечаю на свой вопрос - для этого существует специальный метод, разместить его вызов следует в момент инициализации схемы, т.е. в методе "init":

this.sandbox.registerMessages(AksQuestionMessages.messages);

в приведенном примере - AksQuestionMessages это некий модуль из зависимостей текущей схемы,

define("CasePage", ["AksQuestionMessages", "AskQuestionMixin", "css!AskQuestionCSS"], function(AksQuestionMessages) {
	return {
		entitySchemaName: "Case",
...

messages - соответственно его конфигурационный объект с событиями.

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

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

Добрый день! Можно ли в группах фильтровать по сезонам: Лето 2016, Зима 2017 и т.д. Допустим выбрать записи у которых “Дата с” и “Дата по” попадает в Лето 2016 со страной Беларусь. И так же для остальных сезонов, чтобы сперва фильтровалось по сезону и году, а затем уже страна в подгруппе.
!

!

Нравится

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

Здравствуйте, Мария!

В базовой версии системы на текущий момент нету возможности фильтровать записи по сезонам. Необходимо использовать фильтр, как Вы указали, где указывать "Дату с" и "Дату по".

В будущих версиях системы появиться фильтр по кварталам.

Спасибо за ответ, а можно как-то указать промежуток для даты, что-то вроде: "Дата с" = 1.06.2016 - 31.08.2016?

Здравствуйте, Мария!

В данном случае Вы моежет построить расширенный фильтр с несколькими условиями:

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