пароль
Технические вопросы
Разработка

Здравствуйте!
В нашей компании для некоторых пользователей систематически "теряются" пароли. Сегодня он работает нормально, на следующий день не может войти, возникает ошибка входа пользователя. Это при том, что время действия пароля не ограничено. Решается это просто, но только для администратора - в разделе "администрирование" выбрать проблемного пользователя и нажать кнопку "Изменить". Достаточно проимитировать изменение пароля.

Нравится

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

Здравствуйте, Владимир!
Возможно для группы пользователей, в которую входит пользователь установлено свойство "Частота смены пароля" не "Никогда".
Проверьте это, пожалуйста.

Спасибо! Я проверил. В этой группе было установлено "Как в родительской группе". Родительская группа - "Все пользователи", там установлено "Никогда". Я установил в проблемной группе "Никогда". На первый взгляд нормально.

Показать все комментарии
query()
select()
where()
запросы к БД с помощью select()
Технические вопросы
7.x

Помогите, пожалуйста, написать условие Where для запроса, используя класс Select().
Запрос (обратите внимание на комментарии в тексте запроса):

SELECT
        a.Id AS AccountId, a.Name AS AccountName, a.Code AS AccountCode, a.CreatedOn AS AccountCreatedOn
        , a.CompanyActivity
        , a.OwnerId, o.Name AS OwnerName
        , o.OrganizationChartId AS BranchId, b.CustomDepartmentName AS BranchName
FROM Account a
        LEFT JOIN Contact o ON o.Id = a.OwnerId
                LEFT JOIN AccountOrganizationChart b ON b.Id = o.OrganizationChartId
WHERE
        (
        EXISTS (SELECT ac.Id FROM Activity ac WHERE ac.AccountId = a.Id)
        OR EXISTS (SELECT cam.Id FROM Campaign cam INNER JOIN CampaignTarget ct ON ct.CampaignId = cam.Id WHERE ct.AccountId = a.Id)
        OR EXISTS (SELECT d.Id FROM Document d WHERE d.AccountId = a.Id AND d.TypeId = '{EAAEF18E-6E19-41B3-B808-473A78016220}')
        )
        /* УСЛОВИЯ in МОГУТ ОТСУТСТВОВАТЬ (В ЗАВИСИМОСТИ ОТ ВЫБОРА ПОЛЬЗОВАТЕЛЯ) */
        AND o.OrganizationChartId IN ('что-то')
        AND a.OwnerId IN ('что-то')
ORDER BY a.Name

 

пока что удалось сделать следующее:

Terrasoft.Core.DB.Select mainQuery = new Terrasoft.Core.DB
    .Select(userConnection)
        .Column("a", "Id").As("AccountId").Column("a", "Name").As("AccountName")
        .Column("a", "Code").As("AccountCode").Column("a", "CreatedOn").As("AccountCreatedOn")
        .Column("a", "CompanyActivity").As("CompanyActivity")
        .Column("a", "OwnerId")
        .Column(new QueryColumnExpression() { ExpressionType = QueryColumnExpressionType.SqlText, SqlText = "isnull([o].[Name],'не указан>')" }).As("OwnerName")
        .Column("o", "OrganizationChartId").As("BranchId")
        .Column(new QueryColumnExpression() { ExpressionType = QueryColumnExpressionType.SqlText, SqlText = "isnull([b].[CustomDepartmentName],'не указан>')" }).As("BranchName")

    .From("Account").As("a")
        .LeftOuterJoin("Contact").As("o").On("o", "Id").IsEqual("a", "OwnerId")
            .LeftOuterJoin("AccountOrganizationChart").As("b").On("b", "Id").IsEqual("o", "OrganizationChartId")

    .Where()
        .Exists(
            new Terrasoft.Core.DB.Select(userConnection).Column("ac","Id").From("Activity").As("ac").Where("ac","AccountId").IsEqual("a","Id")
        ).Or()
        .Exists(
            cQuery /*Terrasoft.Core.DB.Select подзапрос, формируется отдельно по условию*/
        ).Or()
        .Exists(
            new Terrasoft.Core.DB.Select(userConnection).Column("d", "Id").From("Document").As("d").Where("d", "AccountId").IsEqual("a", "Id")
            .And("d", "TypeId").IsEqual(new QueryColumnExpression() { ExpressionType = QueryColumnExpressionType.SqlText, SqlText = "'EAAEF18E-6E19-41B3-B808-473A78016220'" })
        )

    .OrderByAsc("a", "Name")
    as Select;

 

Не получается поместить все три exists в блок, чтобы потом добавить условия in.
И еще вопрос: можно ли как-то динамически формировать блок условий (т.к. они у меня зависят от настроек пользователя), а потом "подсовывать" его select'у ?

Версия 7.1.0.172

Нравится

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

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

Здравствуйте, Лариса!
Для комбинирования условий используются операторы OpenBlock и CloseBlock. Например:

Select select =
        new Select(UserConnection)
                .Column("Id")
                .Column("SysSchemaId")
                .Column("Name")
                .Column("SysSchemaManagerName")
                .Column("SysSchemaFolderId")
                .Column("MetaDataModifiedOn")
        .From("VwSysSchemaInSolution")
        .Where("SysSolutionId").IsEqual(new QueryParameter("solutionId", userConnection.Solution.Id))
                .And("SysSchemaId").In(schemas)
               .And("SysSchemaStateInSolution").IsNotEqual(Column.Const((int)StoringObjectState.Deleted))
                .And().OpenBlock("LockedById").IsNull()
                        .Or("LockedById").IsEqual(newQueryParameter("currentUserId", userConnection.CurrentUser.Id))
                .CloseBlock()
                as Select;

Тут больше информации.

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

"Андрей Каспаревич" написал:
Тут больше информации.

Предвижу ответ "у меня ссылка не открывается."

"Андрей Каспаревич" написал:Тут больше информации.

спасибо, эту тему я видела

"Андрей Каспаревич" написал:Для комбинирования условий используются операторы OpenBlock и CloseBlock.

если я делаю так:

.Where()
.OpenBlock()
        .Exists(
            new Terrasoft.Core.DB.Select(userConnection).Column("ac","Id").From("Activity").As("ac").Where("ac","AccountId").IsEqual("a","Id")
        ).Or()
        .Exists(
            cQuery /*Terrasoft.Core.DB.Select подзапрос, формируется отдельно по условию*/
        ).Or()
        .Exists(
            new Terrasoft.Core.DB.Select(userConnection).Column("d", "Id").From("Document").As("d").Where("d", "AccountId").IsEqual("a", "Id")
            .And("d", "TypeId").IsEqual(new QueryColumnExpression() { ExpressionType = QueryColumnExpressionType.SqlText, SqlText = "'EAAEF18E-6E19-41B3-B808-473A78016220'" })
        )
.CloseBlock()

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

Лариса, посмотрите профайлером какой запрос создается при выполнении кода.

"Бондарь Наталия" написал:

Лариса, посмотрите профайлером какой запрос создается при выполнении кода.

Наталия, до выполнения запроса дело не доходит, т.к. профайлер ничего не показывает

Лариса, немного упростила Ваш запрос, чтобы проверить в базовой версии.
Такой вариант:

Terrasoft.Core.DB.Select mainQuery = new Terrasoft.Core.DB
    .Select(Page.UserConnection)
        .Column("a", "Id").As("AccountId").Column("a", "Name").As("AccountName")
        .Column("a", "Code").As("AccountCode").Column("a", "CreatedOn").As("AccountCreatedOn")
        .Column("a", "OwnerId")   
 
    .From("Account").As("a")
        .LeftOuterJoin("Contact").As("o").On("o", "Id").IsEqual("a", "OwnerId")
    .Where()
        .OpenBlock("a","Id")
        .Exists(
            new Terrasoft.Core.DB.Select(Page.UserConnection).Column("ac","Id").From("Activity").As("ac").Where("ac","AccountId").IsEqual("a","Id")
        ).Or()
       /* .Exists(
            cQuery /*Terrasoft.Core.DB.Select подзапрос, формируется отдельно по условию*/
        /*).Or()*/
        .Exists(
            new Terrasoft.Core.DB.Select(Page.UserConnection).Column("d", "Id").From("Document").As("d").Where("d", "AccountId").IsEqual("a", "Id")
            .And("d", "TypeId").IsEqual(new QueryColumnExpression() { ExpressionType = QueryColumnExpressionType.SqlText, SqlText = "'EAAEF18E-6E19-41B3-B808-473A78016220'" })
        )
.CloseBlock()
 
    .OrderByAsc("a", "Name")
    as Select;
	mainQuery.Execute();

Возвращает результат:

SELECT
	[a].[Id] [AccountId],
	[a].[Name] [AccountName],
	[a].[Code] [AccountCode],
	[a].[CreatedOn] [AccountCreatedOn],
	[a].[OwnerId]
FROM
	[dbo].[Account] [a]
	LEFT OUTER JOIN [dbo].[Contact] [o] ON ([o].[Id] = [a].[OwnerId])
WHERE
	(EXISTS (
SELECT
	[ac].[Id]
FROM
	[dbo].[Activity] [ac]
WHERE
	[ac].[AccountId] = [a].[Id])
	OR EXISTS (
SELECT
	[d].[Id]
FROM
	[dbo].[Document] [d]
WHERE
	[d].[AccountId] = [a].[Id]
	AND [d].[TypeId] = 'EAAEF18E-6E19-41B3-B808-473A78016220'))
ORDER BY
	[a].[Name] ASC

Чтобы Ваш код работал укажите поле внутри скобок блока OpenBlock

Спасибо, Наталия!!! Работает.
А всего лишь нужно было проявить немного фантазии :smile:

Добрый день, не могу разобраться с Where In, надо сделать Update Opportunity, есть массив Id, что то вроде

string[] ids = ["id1", "id2", "id3"]

update Opportunity set UsrValue = 1 where Id in ids

Олег, попробуйте построить запрос основываясь на примерах:

- http://www.community.terrasoft.ru/forum/topic/22739#comment-64711
- http://www.community.terrasoft.ru/ideas/24943#comment-66257

Видимо я не правильно выразился, вы привели примеры простого update это у меня итак получается, интересует конкретно where in условие, вот единственный пример из документации

var select = new Select(userConnection)
        .Column("Name")
        .From("Contact")
        .Where(Column.Parameter(new DateTime(), "DateTime")).In("CreatedOn", "ModifiedOn"); 

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

string[] ids = ["id1", "id2", "id3"]
Update update = new Update(UserConnection, "Opportunity")
        .Set("Column", Column.Parameter("1"))
        .Where("Id").In(ids)

получаю запрос вида

update Opportunity set column = '1' where 'Id' in ([1], [2], [3])

"Глобин Олег" написал:

Видимо я не правильно выразился, вы привели примеры простого update это у меня итак получается, интересует конкретно where in условие, вот единственный пример из документации

var select = new Select(userConnection)

        .Column("Name")

        .From("Contact")

        .Where(Column.Parameter(new DateTime(), "DateTime")).In("CreatedOn", "ModifiedOn");

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

string[] ids = ["id1", "id2", "id3"]

Update update = new Update(UserConnection, "Opportunity")

        .Set("Column", Column.Parameter("1"))

        .Where("Id").In(ids)

получаю запрос вида

update Opportunity set column = '1' where 'Id' in ([1], [2], [3])

Получается Вы разборались да?

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

Так нужно массив не строк, а специального типа:

	var indx = 0;
	var emailsQueryParameters = new QueryParameter[((List<string>)RecepientsEmailsForDelete).Count];
	foreach(var email in (List<string>)RecepientsEmailsForDelete){
		emailsQueryParameters[indx] = new QueryParameter(email);
		indx++;
	}
	new Delete(UserConnection).From("ActivityParticipant")
					.Where("ActivityId").IsEqual(Column.Parameter(Entity.PrimaryColumnValue)).And("ParticipantId").
						In(new Select(UserConnection).Column("Id").From("Contact").Where("Email").In(emailsQueryParameters)).Execute();

Добрый день.
Подскажите как я могу написать select запрос с применением агрегирующих функций типа SUM, AVG и т.д.???

Вот так с COUNT, для других аналогично.

Показать все комментарии
нумерация
Технические вопросы
7.x

Здравствуйте, по инструкции в SDK создал новый раздел "Договоры".
Подскажите, пожалуйста, каким образом можно реализовать автоматическую нумерацию, или где можно посмотреть пример реализации?

Нравится

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

Дмитрий, автонумерацию можно реализовать двумя способами. На уровне процесса объекта и на уровне карточки редактирования.
В первом случае, рекомендую посмотреть на процесс объекта Invoice:

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

this.getIncrementCode(this.entitySchema.name, function(responce) {
    this.set('Number', responce);
});

В обоих случаях, необходимо создать две системные настройки ...LastNumber и ...CodeMask и строковое поле в объекте для хранения номера.

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

"Maxim Gritsenko" написал:В первом случае, рекомендую посмотреть на процесс объекта Invoice:

А где смотреть этот процесс в 7.3?

А для начинающих? Этот процесс искать в Конфигурации? Под каким именем?
Всё переискал, не нашел похожего

Этот процесс хранится в объекте. Чтоб его открыть нужно выбрать соответствующий объект в конфигурации, открыть его, нажать на кнопку дополнительно в правом верхнем углу и выбрать "открыть процесс"

Показать все комментарии
Технические вопросы
Разработка

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

Нравится

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

Здравствуйте, Иван!
Подобного опыта не было, но секционирование действительно должно ускорить работу БД.
Если возьметесь делать, поделитесь результатами)

Показать все комментарии
bindTo
Terrasoft.TextEdit
value
Технические вопросы
7.x

Почему может не работать binding? Кто-нибудь сталкивался с таким?
Сделал тестовый модуль, в нем:
1. В модели определил свойства и обработчик кнопки выбора ответственных:

                values: {
                        ownerIds: '',
                        ownerNames: ''
                },
                methods: {
                        onChooseOwnerBtnClick: function() {
                                var config = {
                                        entitySchemaName: 'Contact',
                                        multiSelect: true,
                                        columnName: 'Name',
                                        filters: BaseFiltersGenerateModule.OwnerFilter()
                                };
                                var handler = function(args) {
                                        var items = args.selectedRows.getItems() || [];
                                        var s1 = "";
                                        var s2 = "";
                                        for (var i = 0; i items.length; i++) {
                                                if (s1 !== "") {
                                                        s1 = s1 + ",";
                                                        s2 = s2 + "; ";
                                                }
                                                s1 = s1 + "'" + items[i].value + "'";
                                                s2 = s2 + items[i].displayValue;
                                        }
                                        this.set('ownerIds', s1);
                                        this.set('ownerNames', s2);
                                };
                                var keepAlive = true;
                                LookupUtilities.Open(sandbox, config, handler, this, Ext.get('centerPanel'), keepAlive);
                        }
                }

2. В представлении определил кнопку и текстовое поле:

                items: [{
                        className: 'Terrasoft.Container',
                        id: 'byPeriodSettingsControlContainer4',
                        selectors: {
                                wrapEl: '#byPeriodSettingsControlContainer4'
                        },
                        classes: {
                                wrapClassName: ['custom-inline']
                        },
                        items: [{
                                className: 'Terrasoft.Label',
                                caption: 'Owner'
                        }, {
                                className: 'Terrasoft.TextEdit',
                                readonly: true,
                                value: {
                                        bindTo: 'ownerNames'
                                }
                        }, {
                                className: 'Terrasoft.Button',
                                id: 'btnSelectOwner',
                                caption: 'Select',
                                width: '80px',
                                style: Terrasoft.controls.ButtonEnums.style.DEFAULT,
                                click: {
                                        bindTo: 'onChooseOwnerBtnClick'
                                }
                        }]

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

Причем пробовал и со схемой OpenCustomModule.md из недавнего цикла уроков - там тоже bindTo для кнопки работает, а для текстового поля - нет. В том смысле что код отрабатывает нормально, но текстовое поле не отображает изменение значения модели.

Нравится

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

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

Здравствуйте, Валерий!
Биндинг должен работать по колонкам. То есть в модели представления должны быть колонка "ownerNames". Несколько фрагментов кода из базовой конфигурации:

var getViewModel = function() {
return Ext.create('Terrasoft.BaseViewModel', {
columns: {
	languageList: {
		type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		name: 'languageList',
		isCollection: true
	},
	culture: {
		type: Terrasoft.ViewModelColumnType.ATTRIBUTE,
		name: 'culture',
		isRequired: true
	}
},
......
 
{
				className: 'Terrasoft.ComboBoxEdit',
				value: {
					bindTo: 'culture'
				},
				list: {
					bindTo: 'languageList'
				},
				prepareList: {
					bindTo: 'onPrepareLanguageList'
				},
				visible: {
					bindTo: 'visibleByBuildType'
				}
			},
.........
var sysCutureId = entity.get('SysCulture.Id');
	var sysCutureName = entity.get('SysCulture.Name');
	var timeZoneCode = entity.get('TimeZoneId');
	var timeZoneId = entity.get(timeZoneIdColumn.columnPath);
	var timeZoneName = entity.get(timeZoneNameColumn.columnPath);
	viewModel.set('culture', {value: sysCutureId, displayValue: sysCutureName});

Перенес из секции values в columns, но ничего не поменялось...

		columns: {
			ownerNames: {
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				name: 'ownerNames'
			}
		},
		values: {
			ownerIds: '',
			//ownerNames: '',
			gridData: new Terrasoft.BaseViewModelCollection()
		},

Если до binding-а присваивать - то отображается.

	viewModel.set('ownerNames', 'aaaaaaaaaaa');
	view.bind(viewModel);
	view.render(renderTo);

Если в обработчике после вызова справочника - то не отображается... По крайней мере для TextEdit.

Что еще можно проверить?
Если что, могу удаленно показать...

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

Действительно...:smile:
Прицепил к сообщению.
Версия 7.1.0.172

Здравтсвуйте, Валерий!
Нашел решение. Вот фрагменты кода:

function(Ext, Terrasoft, sandbox, resources, BaseFiltersGenerateModule, LookupUtilities) {
		var view, viewModel, ownerNamesValue;
//===============================
values: {
			ownerIds: '',
			ownerNames: ownerNamesValue,
			gridData: new Terrasoft.BaseViewModelCollection()
				},
//==============================
var handler = function(args) {
			var items = args.selectedRows.getItems() || [];
			var s1 = "";
			var s2 = "";
//==============================
 //     так не надо                  viewModel.set('ownerNames', s2);
                        ownerNamesValue = s2; //так надо
						};

Спасибо, Андрей, работает!

Показать все комментарии
LookupDataControl
несоответствие типа
Технические вопросы
Разработка

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

Решаю тестовые задания, основанные на работе с CRM (т.е. вчера увидел Terrasoft CRM в глаза первый раз). В одном из них необходимо на карточку контрагента добавить поле "Статус" с выбором последнего из ранее созданного справочника.

Делал все, основываясь на найденных в сети инструкциях:
1) в таблицу контрагентов tbl_Account добавил связующее поле-указатель StatusID на запись в таблице статусов и создал связь в Relations с первичным ключом tbl_AccountStatus.ID и вторичным tbl_Account.StatusID.
3) в sq_Account добавил JOIN на таблицу статусов tbl_AccountStatus, а также выборку tbl_Account.StatusID и tbl_AccountStatus.Name AS StatusName.
4) в ds_Account добавил поле справочника StatusID, указав колонку StatusID, источник данных ds_AccountStatus и колонку для отображения Name.
5) поместил на карточку контрагента LookupDataControl и связал его с StatusID из датасета.

При нажатии на "лупу" справочник не открывается, но выскакивает ошибка "несоответствие типа".

Что я делаю не так?

*скриншоты для наглядности
tbl_Account: http://tinyurl.com/qgpqt2g
sq_Account: http://tinyurl.com/q9a45ly
ds_Account: http://tinyurl.com/nfy45df
wnd_AccountEdit: http://tinyurl.com/pgqvfha

Нравится

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

Проверьте сервис ds_AccountStatus
Указаны ли там ключевое поле и первичное поле для отображения

Глупая ошибка. Поле для отображения в ds_Account не было указано. Благодарю, Валерий.

Показать все комментарии
Технические вопросы
Разработка

Приветствую!
Прошу помощи в реализации следующей задачи:
Имеем окно редактирование, как только кликаем за его пределы(например на грид) - окно(редактирования) должно закрываться. Как можно это решить?

Нравится

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

Здравствуйте, Артем!
У окна есть событие "OnDeactivate", которое как раз генерируется, когда окно теряет фокус.
В обработчике события можно описать всю необходимую логику.

А как можно получить ссылочку на открытое окно? Например мне нужно закрыть определенное окно при фокусе на одном из двух.

А как можно получить ссылочку на открытое окно? Например мне нужно закрыть определенное окно при фокусе на одном из двух.

Артем, ссылку на окно можно получить только если они как-то связаны, например родительская свяь, тогда можно будет обратиться к ParentWindow.
Но, думаю, такой вариант Вам не подойдет.
Можно еще отправлять сообщение (SendNotify) из окна, которое требуется закрыть при потере фокуса, а ловить сообщение в окне, на котором должен быть фокус и из него закрывать уже нужное окно.

Да нет, вполне подойдёт, т.к. корзина является дочерним окном обращения. Как взять ссылочку только на дочерний объект?

Есть ли вообще способ получить список открытых окон?

Артем,
1. Ссылку взять тем же Notify, передать Self в родительское окно, прямой ссылки на потомка у родительского окна нет.
2. Такого способа нет.

Артем, по поводу списка открытых окон я ошибся.
Открытые окна размещены в элементах массива "WinCache_Windows" в качестве параметра Instance. В "scr_WindowUtils" есть метод для получения экземпляра окна ("WinChache_Get") по параметру элемента массива "RecordID", но Вы можете написать свой метод получения окна по идентификатору окна, который предварительно будете сохранять при открытии.

Показать все комментарии
7.1
деталь платежные реквизиты
Технические вопросы
7.x

Доброго времени суток, коллеги!

Занимаюсь разработкой конфигурации на BPMonline 7.1. По ТЗ задача - добавить пару полей в деталь "Платежные реквизиты" в разделе Контрагенты. Добавил, проверяю - создал запись, изменил ее - все ок, но вот когда попробовал нажать на просмотр - "Шеф! Все пропало!". Выпадает исключение "Uncaught Terrasoft.UnsupportedTypeException: null is unsuported type"
После N-го количества времени самобичевания за кривые руки (что ж тут сложного-то добавить поля в карточку детали) начал разбираться. Кучу раз перепроверил свой код - мало ли... Все верно. Закомментировал доработку - история не изменилась. Посмотрел в "коробку" - хм, то же самое. Полез в демку посмотреть - о ужас! И там так же...

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

Оказалось, что "собака зарыта" в переопределении функции getItemViewHeader

this.getItemViewHeader = function() {
  return {
    columns: [
      {
        type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
        name: 'AccountBillingInfo',
        columnPath: 'AccountBillingInfo',
        viewVisible: true,
        labelClass: 'campaign-campaignname'
      }
    ]
  };
};

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

Нравится

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

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

Действительно была такая ошибка в ранних версиях 7.1.
По крайней мере, в 7.1.0.423 исправлено. Правильный код:

this.getItemViewHeader = function() {
				return {
					columns: [
						{
							type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
							name: 'Account',
							columnPath: 'Account',
							viewVisible: true,
							labelClass: 'account-accountname'
						}
					]
				};
			};
Показать все комментарии
Технические вопросы
Разработка

Добрый день сообщество!
Помогите решить проблему с разделом планирования. Делал по инструкции, создал запрос по таблице счета с колонками ID, дата оплаты, сумма оплаты, сумма (б. в.), клиент. В настройках планирования создал новый вид планирования указав запрос, поля ID как ключевое и дату оплаты как поле периода. В показателях для данного вида указал сумму оплаты. Но при выборе этого вида планирования в значениях всех колонок по всем клиентах 0. Где я ошибся или есть какие то условия при которых рассчитывается значения?

Нравится

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

Здравствуйте, Иван!

Возможно проблема связана с правами доступа. Проверьте, пожалуйста, права для записей на детали "Измерения":

Права установлены для группы все пользователи.

Иван, настроила вид планирования согласно Вашему описанию - всё отображается корректно.
Проверьте, возможно, что-то не учли (во вложении прилагаю алгоритм своих действий).

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

Показать все комментарии
LookupDataControl
Сортировка
Технические вопросы
Разработка

Есть поле LookupDataControl, которое в датасете установлено как выпадающий список (галочка "Отображать как выпадающий список в карточках")

При отображении значений в карточке они появляются в произвольном порядке.
Т.е. сортировка указанная в SelectQuery не учитывается.

В профайлере тоже отображает выборку из базы без указания сортировки.

Terrasoft 3.4.1.106

Нравится

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

Виктор, добрый день!

По умолчанию LookupDataControl с включенным simple select не использует ORDER BY.

Но можно добавить: для контрола в функции OnPrepareSelectWindow пропишите:

var Dataset = LookupDataControl.DataField.LookupDataset;
Dataset.DataFields.ItemsByName('Name').OrderType = otDesc;

либо otAsc.

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