В продукте sales enterprice версии 7.8 нужно удалить действие "Подписаться на обновления ленты" из списка действий из стандартного меню [Действия] на странице редактирования кастомного раздела. Как это сделать?
Видимо, нужно перегрузить базовый виртуальный метод getActions, но как именно, еще не понимаю.
Есть ли примеры реализации данного кейса?

Нравится

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

Вы совершенно правы
Необходимо перегрузить схему страницы редактирования раздела
В ней перегрузить базовый метод getActions
в нев вызвать родительскую реализацию и получить ссылку на коллекцию действий
из коллекции удалить необходимый элемент при помощи метода removeItem
Подробнее https://academy.terrasoft.ru/jscoresdk/#!/api/Terrasoft.controls.Menu-m…

ПРимер как добавить действие есть в руководстве разработчика
https://academy.terrasoft.ru/documents/technic-sdk/7-8/dobavlenie-deyst…
делайте по аналогии
Примерно реализуется так:

methods: {
			// Перегрузка базового виртуального метода, возвращающего коллекцию действий страницы редактирования.
			getActions: function() {
				// Вызывается родительская реализация метода для получения
				// коллекции проинициализированных действий базовой страницы.
				var actionMenuItems = this.callParent(arguments);
				//Посмотреть на коллекцию в консоли
				window.console.log(actionMenuItems);
				// Для удаления элемента коллекции можно использовать removeItem
				return actionMenuItems;
			}...

Роман, спасибо, уже стало понятнее, но после реализации данного способа страница раздела перестала открываться. Что может быть не так в коде, возможно, поможете:

methods: {
getActions: function() {
var actionMenuItems = this.callParent(arguments);
window.console.log(actionMenuItems);
actionMenuItems.removeItem(this.getButtonMenuItem({
"Visible": {
"bindTo": "IsSubscribed",
"bindConfig": {"converter": "getSubscribeButtonVisible"}
},
"Caption": {"bindTo": "Resources.Strings.SubscribeCaption"},
"Enabled": {"bindTo": "canEntityBeOperated"},
"Tag": "subscribeUser"
}));
actionMenuItems.removeItem(this.getButtonMenuItem({
"Visible": {"bindTo": "IsSubscribed"},
"Caption": {"bindTo": "Resources.Strings.UnsubscribeCaption"},
"Enabled": {"bindTo": "canEntityBeOperated"},
"Tag": "unsubscribeUser"
}));
return actionMenuItems;
}
},

"Симута Роман Русланович" написал:ПРимер как добавить действие есть в руководстве разработчика
https://academy.terrasoft.ru/documents/technic-sdk/7-8/dobavlenie-deystv...
делайте по аналогии
Примерно реализуется так:

Роман, спасибо, уже стало понятнее, но после реализации данного способа страница раздела перестала открываться. Что может быть не так в коде, возможно, поможете:

methods: {
getActions: function() {
var actionMenuItems = this.callParent(arguments);
window.console.log(actionMenuItems);
actionMenuItems.removeItem(this.getButtonMenuItem({
"Visible": {
"bindTo": "IsSubscribed",
"bindConfig": {"converter": "getSubscribeButtonVisible"}
},
"Caption": {"bindTo": "Resources.Strings.SubscribeCaption"},
"Enabled": {"bindTo": "canEntityBeOperated"},
"Tag": "subscribeUser"
}));
actionMenuItems.removeItem(this.getButtonMenuItem({
"Visible": {"bindTo": "IsSubscribed"},
"Caption": {"bindTo": "Resources.Strings.UnsubscribeCaption"},
"Enabled": {"bindTo": "canEntityBeOperated"},
"Tag": "unsubscribeUser"
}));
return actionMenuItems;
}
}

removeItem - undefined
this.getButtonMenuItem возвращает новый объект "Terrasoft.BaseViewModel", так что сравнивать его с
существующим некорректно

Ваш кейс реализуется так:

			getActions: function() {
				var actionMenuItems = this.callParent(arguments);
				var delIndex = -1;
				actionMenuItems.each(function(item, index) {
					if (item.values.Caption.bindTo === "Resources.Strings.SubscribeCaption") {
						delIndex = index;
					}
				}, this);
				if (delIndex > -1) {
					actionMenuItems.removeByIndex(delIndex);
				}
				return actionMenuItems;
			}

Обязательно обновите страницу с удалением кеша. Возможно нужно перезайти в приложение.

Хотя, возможно нужно не удалять из коллекции, а использовать setVisible( visible ) https://academy.terrasoft.ru/jscoresdk/#!/api/Terrasoft.controls.BaseMe…

Спасибо. Вариант с removeByIndex помог.

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

есть сервис selectquery, в нем несколько запросов обедненных UNION ALL, в каждом запросе есть обычные поля и поля итогов(например в одном ) итогома сумма и количество продуктов детали продукты в счете за текущий месяц а в другом тот же запрос только для раздела склада.
Оно выводит сначала список продуктов которые нужно для счета а потом для склада, вот сокращенный код:

SELECT
        [OfferingID],
        ([SoldCount]),
        (a),
        [Name]
FROM
        (SELECT
        [tbl_OfferingInInvoice].[OfferingID] AS [OfferingID],
        COUNT(CAST([tbl_OfferingInInvoice].[ID] AS VARCHAR(38))) AS [SoldCount],
        SUM([tbl_OfferingInInvoice].[BasicAmount]) AS a,
        [tbl_Offering].[Name] AS [Name]
----
UNION ALL
SELECT
        [tbl_OfferingInMovement].[OfferingID] AS [OfferingID],
        COUNT(CAST([tbl_OfferingInMovement].[ID] AS VARCHAR(38))) AS [SoldCount],
        SUM([tbl_OfferingInMovement].[BasicAmount]) AS а,
        [tbl_Offering].[Name] AS [Name]
------) AS [U]
        GROUP BY
        u.[OfferingID],
        u.[Name]

для решение проблемы нужно писать так:
SELECT
        [OfferingID],
        count([SoldCount]),
        Sum(a),
        [Name]
FROM
        (SELECT
        [tbl_OfferingInInvoice].[OfferingID] AS [OfferingID],
        COUNT(CAST([tbl_OfferingInInvoice].[ID] AS VARCHAR(38))) AS [SoldCount],
        SUM([tbl_OfferingInInvoice].[BasicAmount]) AS a,
        [tbl_Offering].[Name] AS [Name]
----
UNION ALL
SELECT
        [tbl_OfferingInMovement].[OfferingID] AS [OfferingID],
        COUNT(CAST([tbl_OfferingInMovement].[ID] AS VARCHAR(38))) AS [SoldCount],
        SUM([tbl_OfferingInMovement].[BasicAmount]) AS а,
        [tbl_Offering].[Name] AS [Name]
------) AS [U]
        GROUP BY
        u.[OfferingID],
        u.[Name]

Но добавить итоги не получается(((. Это можно решить?

Нравится

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

К сожалению не понятен Ваш вопрос, можете конкретизировать его.
А также выполните sql запрос на БД, для получения результата.

Рекомендую ознакомится со статьей Использование хранимых функций в запросе

"Терещук Павел" написал:К сожалению не понятен Ваш вопрос, можете конкретизировать его.

Нужно превратить это

SELECT
        [OfferingID],
        ([SoldCount]),
        (a),
        [Name]
FROM
        (SELECT
.....

в это

SELECT
        [OfferingID],
        count([SoldCount]),
        Sum(a),
        [Name]
FROM
        (
....

"Терещук Павел" написал:А также выполните sql запрос на БД, для получения результата.

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

Создаете запрос, в свойстве колонки Summary Type (Итог) выберите необходимую агрегирующую функцию:

"Терещук Павел" написал:Создаете запрос, в свойстве колонки Summary Type (Итог) выберите необходимую агрегирующую функцию:

так и зделано, только в сервисе несколько селектов, в каждом проставлены итоги на поля, но в общем запросе, который ТС сам формирует - итоги не проставляются и программно тож не ставится. Пришлось сделать SQL запрос и копи пастом создать 8 полей.

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

Только начал изучать платформу, но не нашел информации по проблеме. Суть задачи: есть два поля: чекбокс и поле справочника. Нужно при установке галочки чекбокса устанавливать одно значение из справочника, при снятии второе. Проблема в том, как привязать чекбокс ко второму полю и как устанавливать значение поля из справочника.

Нравится

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

Возьмите за пример событие dlDataOnDatasetDataChange для поля AccountID, источника данных dlData, окна редактирования wnd_ContactEdit. В событии происходит вызов функции FillInformationBySelectedItem - которая заполняет поля по определенному правилу (фильтру).

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

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

Просто Id Счета получаю так:

var ID = this.get("Id");

Значение AccountId пытаюсь получить так:

var AccountId = this.get("AccountId");

Но, значение AccountId пустое. (В карточке Контрагент присутствует).
Как правильно получить значение AccountId?

Нравится

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

Добрый день!

var Account = this.get("Account");//Получаем значение из справочника
var AccountId = Account.value;  //Получаем Id
var AccountDisplayValue =Account.displayValue;  //Получаем отображаемое значение 
Показать все комментарии

В Террасофте на определенном компьютере под любым пользователем возникла такая ошибка:

Дублируется значение свойства 'Caption'. Значение 'Marquesas Standard Time' уже существует

Деббагер показывает на скрипт scr_Utils:

var ServiceKey = Code + UniqueCode;
        var Item = SingleItemsDictionary(ServiceKey);
        if (!Assigned(Item)) {
           strong> Item = Services.GetNewItemByUSI(Code);strong>
                SingleItemsDictionary(ServiceKey) = Item;
        }
       

 

При попытке открыть в Админке сервис enm_TimeZone возникает ошибка и сервис не открывается:
Невозможно редактировать сервис 'Common\Dictionaries\TimeZone\enm_TimeZone'. Дублируется значение свойства 'Caption'. Значение 'Marquesas Standard Time' уже существует.

Такая проблема только на компьютере, где установили какую-то программу. На всех других компьютерах такой ошибка нет.
В чем проблема?

Нравится

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

А выгрузить enm_TimeZone в xml экспортом в файл из администратора и затем поправить его вручную, сохранить и загрузить обратно пробовали? Поищите внутри xml наверняка реально найдете дублирующийся caption.

"Alex GF" написал:На всех других компьютерах такой ошибка нет.

И конфигуратором на других компах открыть получается?

Кстати еще банальный вариант - почистите на проблемных компах кэш, профиль, проверьте версию бинарников. Да, смешной совет, но все же...

Да, на других компьютерах конфигуратором открывается enm_TimeZone нормально! Только на этом одном компьютере такая проблема. Первоначально на нем также не было никаких проблем. Они начались, после того как туда поставили какую-то программу.
Чистили кэш, профиль. Даже сносили и заново ставили Террасофт - ничего не помогает.
В сервисе enm_TimeZone нет никакого Marquesas Standart Time.

"Alex GF" написал:Они начались, после того как туда поставили какую-то программу.

Ну вот похоже туда и копать... тут что то специфичное((
А часовой пояс на проблемной машине смотрели?
по отладке скорее всего лезет из scr_Main функция SetMainWindowCaption()
Там есть строка GetTimeZoneCaption(CurrentUser.TimeZone)) вот посмотрите отладчиком что там за CurrentUser.TimeZone на этой машине
Или из функции CheckTimeZone() там же...

Alex GF,

Здравствуйте! Не помните в чем была причина? Столкнулась с такой же проблемой

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

Ошибка решается удалением записи, на которую жалуется террасофт через реестр ОС (находим папку с проблемным час.поясом):  в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Time Zones

Если речь о Sudan Standard Time, то оно пришло в обновлении Windows. Действительно, если не собираетесь в Судан, проще удалить его в реестре при помощи Regedit.exe.

Теперь и Sao Tome Standard Time. Лечение аналогичное.

Теперь и "Острова Теркс и Кайкос UTC-04:00"

Мы "разрулили" эту траблу (второй пункт).

Варианты Решения:

1. Обновить библиотеку местного диалекта для часовых поясов tzres.dll.mui. Не факт, что следующее обновление её не затрёт.

2. Создать новый энумератор (имя + ID), заполнять его кодом JScript ручками из ОС при запуске и заменить вызовы на него. Не забываем таблицы и датасеты типа ds_Contact, tbl_City etc.. 

3. Заполнять энумератор самим, а хексредактором "исправить" :)  злосчастное имя enm_TimeZone в библиотеке TSObjectLibrary

Можно и так. Но в таком случае нет смысла вести все новые экзотические пояса, где нет ни одного пользователя Terrasoft 3.Х. А основные ввести в список вручную один раз. Или в скрипте циклом один раз скопировать из автогенерированного в свою копию.

Заполнили через Services.SaveItem(), всё в норме. :)

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

Программа (аналог TSAdmin) PVC от Валерий Андрусик умеет искать прямо в конфигурации; причём, как в скриптах, так и в остальных сервисах.

В коробочной версии TS3.3.1 это tbl_Contact, tbl_City, их датасеты и несколько скриптов.

Мне для поиска хватает выгрузки в файлы, а потом в папке Alt+F7.

Я раньше тоже так работал) Настроить INI-файл выгрузки на нужное, подождать с полчасика..

Кстати, если в TS3.3.1 выгружать скрипты сервисом, то их текст  - зазипован в CDATA. А для текстового скрипта - отдельная опция..

А в PVC сразу можно в сервис перейти на нужную строку-структуру. А не копировать имя сервиса и искать его в TSAdmin ))

3.3.1 сейчас довольно редко пользуются. Как и 3.Х вообще.

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

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

При создании печатной формы помещаю данные из раздела и табличные данные (т.е. данные деталей) в одну таблицу.
При наличии нескольких деталей в таблицу документf word автоматом добавляются новые строки, а при отсутствии деталей в разделе в таблице остается пустая строка.

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

Нравится

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

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

Добрый день!

Ни в видео, ни в статье на Академии нет ответа на вопрос как убрать пустую строку при выводе табличных данных.

Прошу помочь с решением вопроса, так как он всё еще актуален.

Здравствуйте, Александр!

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

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

Добрый день, Не могу скрыть для просмотра записи: Задержка... (выделенно красным на рисунке).
Вход из-под портального Пользователя. Версия Сервис деск, 7.7
Кто нибудь решал такую задачу?
Спасибо.

Нравится

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

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

Вам необходимо сделать операцию remove для элементов SolutionCaptionContainer и ResponseCaptionContainer в схеме PortalCasePage.

Это можно сделать только кодом.

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

Здравствуйте!
Работаю в версии 7.7. Столкнулся со следующей проблемой:
мастером на странице редактирования Лида в истории добавил свою деталь. Она располагается в самом низу. Мне нужно её вверх поднять, расположить её между первой и второй базовыми деталями. Мастером не получается это сделать. Как сделать вручную. Где настройки расположения изменить?

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

Нравится

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

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

Как изменить порядок деталей используя Мастер разделов, Вы можете увидеть на прикрепленном скриншоте. Для изменения порядка напрямую в схеме, необходимо использовать операцию "move" и менять значение свойства "index".

Пример перемещения детали вниз:

define('ContactPageV2', ['ContactPageV2Resources', 'GeneralDetails'],
function(resources, GeneralDetails) {
	return {
		entitySchemaName: 'Contact',
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
	{
		"operation": "move",
		"name": "ContactCommunication",
		"parentName": "GeneralInfoTab",
		"propertyName": "items",
 
		"index": 4
	}
]/**SCHEMA_DIFF*/,
		attributes: {},
		methods: {},
		rules: {},
		userCode: {}
	};
});

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

Здравствуйте!
Интересует вопрос как добавить строку быстрого фильтра в контакты. Такого же типа как и в счкетах или в активностях.

Нужно чтобы фильтр был по полю "Дата обновления для новых заявок" (UsrUpdatedAtForNew) контакта. Как это можна реализовать?

Я добавил в раздел секции контакты следующий код

define("ContactSectionV2", [], function() {
        return {
                entitySchemaName: "Contact",
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
                methods: {
                                initFixedFiltersConfig: function() {
                                        var fixedFilterConfig = {
                                                entitySchema: this.entitySchema,
                                                filters: [
                                                        {
                                                                name: "PeriodFilter",
                                                                caption: this.get("Resources.Strings.PeriodFilterCaption"),
                                                                dataValueType: Terrasoft.DataValueType.DATE,
                                                                columnName: "UsrUpdatedAtForNew",
                                                                startDate: {},
                                                                dueDate: {}
                                                        },
                                                        {
                                                                name: "Owner",
                                                                caption: this.get("Resources.Strings.OwnerFilterCaption"),
                                                                dataValueType: Terrasoft.DataValueType.LOOKUP,
                                                                filter: BaseFiltersGenerateModule.OwnerFilter,
                                                                columnName: "Owner"
                                                        }
                                                ]
                                        };
                                        this.set("FixedFilterConfig", fixedFilterConfig);
                                }
                        }
        };
});

Но тогда раздел не грузится и выпадает ошибка.

user: Admin/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
file: undefined
line: undefined
column: undefined
message: BaseFiltersGenerateModule is not defined
date: Fri Aug 26 2016 16:40:39 GMT+0300 (Финляндия (лето))
moduleId: SectionModuleV2_ContactSectionV2
moduleName: SectionModuleV2

Скажите, в правильном ли я направлении двигаюсь и что мне нужно еще сделать?

Нравится

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

Разобрался. Нужно было добавить BaseFiltersGenerateModule в define("InvoiceSectionV2", ["BaseFiltersGenerateModule"], function(BaseFiltersGenerateModule).

А теперь следующий вопрос. Как сделать такой фильтр в разделе итоги, где нет контактов, но чтобы поле фильтра было именно UsrUpdatedAtForNew из раздела контакты?

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

Постройте "Итоги" в представлении раздела "Контакты". Установив в настройках итогов поле для связи с разделом, фильтр, установленный в разделе, будет распространятся на итоги.

Да, это я понял. Спасибо. Но меня все же интересует вопрос можно ли в Разделе Итоги, или каком-то другом новом разделе сделать такой фильтр, чтобы он делал фильтрацию по полю, которого нет в записях такого раздела. Для примера поле "Дата обновления для новых заявок" (UsrUpdatedAtForNew) раздела контакт но фильтр в Итогах?

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

Такой возможности нет.

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

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

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

Подскажите на что стоит обратить внимание, в чем может быть проблема? Может кто то сталкивался?

Версия 7.7.0.2284

Нравится

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

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

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

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

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