Здравствуйте! Необходимо добавить красную кнопку “Удалить” на страницу Лида, что-то в таком роде:
!
Делаем по документации (https://academy.terrasoft.ru/documents/technic-sdk/7-9/kak-dobavit-knopk...),
добавили код в замещающую схему LeadPageV2, кэш чистили, но кнопка все равно не отображается.

 diff: [
            {
                "operation": "insert",
                "parentName": "CombinedModeActionButtonsCardLeftContainer",
                "propertyName": "items",
                "name": "DeleteLeadButton",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {bindTo: "Resources.Strings.DeleteLeadButtonCaption"},
                    "click": {bindTo: "onDeleteLeadClick"},
                    "style": Terrasoft.controls.ButtonEnums.style.RED,
                }
            }
        ]

Подскажите, пожалуйста, в чем может быть ошибка, версия 7.9.1

Нравится

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

Если режим совмещённый, то добавлять нужно в схему LeadSectionV2. Вы же добавили кнопку в схему страницы редактирования в, скорее всего, несуществующий там контейнер "CombinedModeActionButtonsCardLeftContainer"

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

Если рекомендация от Данилы не помогла, то просьба предоставить полный листинг кода.

Большое спасибо за помощь, после добавления кода в LeadSectionV2 кнопка появилась. :smile:
Подскажите пожалуйста, как должна выглядеть функция для удаления записи. Сперва вытягиваем id лида:

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

а как в дальнейшем его можно удалить?

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

Наглядный пример реализации Вы можете посмотреть в обработчике кнопки "Удалить" в реестре раздела.

Спасибо, получилось реализовать удаление с помощью функции deleteRecords из GridUtilitiesV2.
Добавили таким образом кнопку в 3 раздела, всё работает, только в разделе “Контакты” кнопка не отображается :sad:. В контактах 3 вида страниц, ссылка на страницу редактирования контакта имеет вид:

ViewModule.aspx#CardModuleV2/BtcContactType1Page/edit/deafe024-a148-4ba6-a4b1-cb8fce5b8443

, может ли это как-то влиять на способ добавления кнопки?

Попробуйте этот же код добавить и в Section и на Page (если их несколько, то во все).

Мария, а что делает кнопка "Удалить"? Если правильно поняли, то она удаляет текущую запись. Тогда хотелось бы посоветовать продумать удаление более глобально, так как нужно учесть все возможные моменты. Например:

- что должно произойти после нажатия;
- что делать с деталями;
- что будет если после нажатия "Удалить", нажать на "Сохранить" и т.д;
- процессная ли карточка или нет.

Спасибо, кнопка в контактах появилась. :smile:

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

Но возникла проблема с удалением на отдельной странице, если допустим перейти с лида в контакт, или из контакта в лид, или даже просто перезагрузить страницу из раздела, то кнопка удаления не срабатывает. Подскажите, пожалуйста, как в Page можно осуществить удаление? Не можем найти пример в стандартных схемах.

Или можно как-то самому принудительно запускать совмещенный режим при переходе на другую страницу, в плане: сделать, что при нажатии на кнопку “удалить” перекидывало в карточку, но в совмещенном режиме и автоматически нажималась кнопка удалить сразу?

Для исправления - продублируйте код метода, связанного с кнопкой "удалить" в схеме карточки. Также смотрите в сторону использования Terrasoft.DeleteQuery для удаления записи по Id. Для перехода обратно в раздел - воспользуйтесь сообщением PushHistoryState.

Спасибо за помощь,
Функция удаления из раздела:

deleteRecords: function() {
        var activeRow = this.getActiveRow();
        if (activeRow && activeRow.isNew) {
            this.removeGridRecords([activeRow.get("Id")]);
        } else {
            var items = this.getSelectedItems();
            if (!items || !items.length) {
                return;
            }
            this.checkCanDelete(items, this.checkCanDeleteCallback, this);
        }
    },
 
    handleAfterDelete: function() {
        this.sandbox.unRegisterMessages(["MultiDeleteFinished"]);
        this.registerMultiDeleteMessages();
        this.reloadGridData();
        this.onDeleted({
            Success: true
        });
        this.onDataChanged();
        var requestUrl = "SectionModuleV2/UsrInterestSection";
        this.sandbox.publish("PushHistoryState", {
            hash: requestUrl
        });
    }

Код функции удаления со страницы редактирования:

delete: function() {
    var recId = this.get("Id");
    var deleteQuery = Ext.create("Terrasoft.DeleteQuery", {
        rootSchemaName: "UsrInterest"
    });
    deleteQuery.filters.add("userFilter",
        deleteQuery.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id", recId));
    deleteQuery.execute(function() {});
 
    var requestUrl = "SectionModuleV2/UsrInterestSection";
    this.sandbox.publish("PushHistoryState", {
        hash: requestUrl
    });
}

На странице записи удаление происходит, но не выходит выполнить каскадное удаление, подскажите пожалуйста, как проще реализовать удаление связанных записей?

Добрый день.

Удалить записи каскадно через DeleteQuery у Вас не выйдет. Возможны только следующие два варианта:

1) Перед удалением основной записи выполнять SELECT для получения Id связанных записей. Удалять их, а только затем выполнять DELETE основной.

2) На уровне объекта установить чекбокс "каскадная связь".

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

Спасибо, для пользовательского раздела с галочкой "каскадная связь" всё получилось.
Не подскажите, пожалуйста, где для лидов ставить это свойство для каскадного удаления в процессах и для контактов в лидах?

!

Данная деталь создается на основании view VwEntityInProcess. Код самой вьюхи:

ALTER VIEW [dbo].[VwEntityInProcess] (
	[Id],
	[CreatedOn],
	[CreatedById],
	[ModifiedOn],
	[ModifiedById],
	[ProcessListeners],
	[EntitySchemaName],
	[RecordId],
	[ProcessCaption],
	[ProcessDescription]
)
AS
SELECT DISTINCT
	ss.[Id],
	ss.[CreatedOn],
	ss.[CreatedById],
	ss.[ModifiedOn],
	ss.[ModifiedById],
	ss.[ProcessListeners],
	ss.[Name],
	secpe.[RecordId],
	ssProcess.[Caption],
	ssProcess.[Description]
FROM [SysEntityCommonPrcEl] secpe
	JOIN [SysSchema] ss ON ss.UId = secpe.[EntitySchemaUId]
	JOIN [SysProcessElementData] sped ON secpe.[ProcessElementId] = sped.[Id]
	JOIN [SysProcessData] spd ON spd.[Id] = sped.[SysProcessId]
	JOIN [SysProcessData] spdParent ON COALESCE(spd.ParentId, spd.Id) = spdParent.[Id]
	JOIN [SysSchema] ssProcess ON ssProcess.[Id] = spdParent.[SysSchemaId]
	JOIN [SysProcessLog] spl ON spl.[SysSchemaId] = spdParent.[SysSchemaId]
WHERE spl.[StatusId] = 'ed2ae277-b6e2-df11-971b-001d60e938c6'
GO

Спасибо за помощь. С изначальным удалением из VwEntityInProcess не получилось, появляется ошибка: "Uncaught View or function 'dbo.VwEntityInProcess' is not updatable because the modification affects multiple base tables."
А удалять "без связанных записей" с помощью DeleteQuery, или как можно выполнить sql запрос на удаление по нажатию кнопки ?

"Maria H" написал:как можно выполнить sql запрос на удаление по нажатию кнопки ?

Это можно сделать на бекенде, тоесть вам нужно сделать свой конфигурационный веб сервис:
https://academy.terrasoft.ru/documents/technic-sdk/7-8/kak-sozdat-svoy-…
В теле которого уже формировать произвольный sql запрос, пример:

var test = new CustomQuery(UserConnection, DBEngine.GetIndexQuerySqlText())
.WithParameter("DBSchemaName", DBEngine.CurrentSchemaName)
.WithParameter("EntitySchemaQualifierName", null, "DBObjectName")
.WithParameter("EntitySchemaName", entitySchemaName)
.WithParameter("IndexName", indexName);

Где второй параметр new CustomQuery, собственно текст самого запроса, с параметрами внутри через собаку, к пр. @param_name, если параметры конечно нужны.
Выполнить можно так:
test.Execute();
Если это запрос на чтение, то можно преобразавать его в стандартный IDataReader:
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
IDataReader datareader = test.ExecuteReader(dbExecutor);
}
После чего данный сервис по удалению можно будет вызвать из ваших схема страниц\секций следующим образом:
https://academy.terrasoft.ru/documents/technic-sdk/7-8/kak-programmno-v…

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

Что за?

user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
file: http://localhost:7904/core/337b572dd248a0a080c15d716da3ea14/combined/all...
line: 888
column: 144
message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент с именем; argumentName: query
date: Wed Mar 01 2017 16:05:17 GMT+0300 (RTZ 2 (зима))
stack: undefined

Новая 791 свежая платформа....создаю первую деталь и такое.

Нравится

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

Через некоторое время вышло

Failed to create temp file 18 : It was determined that certain files are unsafe for access within a Web application, or that too many calls are being made on file resources.

все закрыв, в конфигураторе появилось 2 файла - Деталь и ее страничка.
Но саму деталь не могу добавить в мастере раздела.

И записи в [SysDetail] нет.

Не могу понять...платформа новая.

Выполнил этот запрос

DECLARE 
    -- Название схемы представления создаваемой миникарточки.
    @ClientUnitSchemaName NVARCHAR(100) = 'UsrCourierServiceDetail',
    -- Название схемы объекта, к которому привязывается миникарточка.
    @EntitySchemaName NVARCHAR(100) = 'UsrCourierService',
    -- Название детали.
    @DetailCaption NVARCHAR(100) = 'Курьерская служба'
 
INSERT INTO SysDetail(Caption, DetailSchemaUId, EntitySchemaUId)
VALUES(@DetailCaption,
     (SELECT TOP 1 UId
      from SysSchema
      WHERE Name = @ClientUnitSchemaName),
      (SELECT TOP 1 UId
      from SysSchema
      WHERE Name = @EntitySchemaName))

и заработало другие детали начали делать нормально.
Странно.

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

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

В рамках реализации процессов и создания автогенерируемых страниц по процессу появилась необходимость использования правил, типа BusinessRuleModule. Можете подсказать каким образом можно реализовать данные требования?

1) Закрытие полей на редактирование на автогенерируемой странице
2) Использования фильтра в справочном поле (Выбор сотрудника из раздела Физ. лица, но только из тех, у кого есть определенные роли в системе)

С уважением,
Дмитрий

Нравится

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

Добрый день!

Элемент [Автогенерируемая страница] недоступен для редактирования, т.е. настроить бизнес-правила не получится.
Для решения задачи используйте [Преднастроенная страница]. Тут вы можете настроить все необходимые правила/фильтры.

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

При биндинеге значения поля или его свойства на метод, последний вызывается при инициализации соответствующего значения.
Можно ли в последующем как либо в коде инициализировать его повторно, т.е. заставить биндинг поля отработать снова.
(Обходные пути через бизнес-правила и биндинг на атрибут мне известны).
Но если бы можно было скажем повторно инициализировать целевое свойство или значение целевого поля - это было бы более лаконичным решением, без "оверхеда" по сущностям и коду.
А так же открыло бы возможность осуществлять псевдо-реактивную привязку данных, без переработки существующих схем, просто инициализируя их повторно в нужный момент в собственной "бизнес-логике"

Нравится

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

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

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

Зачастую в атрибуте объявляется целый перечень колонок
н/п

attributes: {
                        "UsrConfigProduct": {
                                lookupListConfig: {
                                        columns: [
                                                "UsrBrand",
                                                "UsrClass",
                                                "UsrProductType",
                                                "UsrProductCountry"
                                        ]
                                }
                        }
                }

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

Нравится

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

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

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

Добрый день!
При разработке на препроде возникла необходимость переименовать базовые разделы, и само собой изменена некая логика этих базовых разделов.
Так вот проблема в чем, при переносе этих всех изменений заголовки разделов в меню разделов, данные заголовки не меняются.
Собственно вопрос в том, как изменить заголовки раздела не через мастер и без использования esq запросов? Перепробовал менять все caption, но так и не нашел решения данной проблемы.
Или же вариант решения только тем, что придется добавить sql-скрипт к пакету при установке на проде?

Нравится

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

Михаил, здравствуйте!

Лучшим вариантом будет это:

- создать SQL скрипт, который «проайпдейтит» необходимые локализируемые строки;

Например:

Название кнопки берется из поля ActionKindCaption таблицы SysModuleEdit.

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

select * from SysModuleEdit
where SysModuleEntityId = (select Id from SysModuleEntity
where SysEntitySchemaUId = (select UID from SysSchema where Name = 'Account' and ExtendParent = 0))

Далее запросом update необходимо задать новое значение в колонку ActionKindCaption для требуемой записи.

- в пакете разработке добавить этот скрипт во вкладке «SQL сценарии» и указать тип установки «После сохранения пакета» (чтобы скрипт запустился после установке пакета на другую среду) + создать привязку скрипта к пакету, чтобы его можно было переносить на другую среду.

Другой пока возможности нет.
Приятной работы!

Дмитрий, благодарю.

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

Стоит задача расширить поле "Решение" статьи БЗ от "края до края" для мониторов с разрешением 1920x1080. В принципе можно подключить свой модуль с CSS, и указать

#KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout-item-KnowledgeBasePageV2NotesContainer{
        width: 110% !important;
}

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

Нравится

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

Олег, в базовых карточках (кроме EmailPageV2, можете как пример использовать) задана фиксируемая ширина:

body[OldUI=false] .center-main-container .grid-layout-row {
  max-width: 140em;
}

Вы можете переопределить базовый для нужного раздела, только укажите дополнительный селектор, чтобы не перекрыть логику ВСЕХ карточек. Например: data-item-marker="KnowledgeBasePageGeneralBlock"

Спасибо за ответ. Такой вариант почему-то не срабатывает. Я нашел немного другое решение, но в таком случае приходится задавать ширину под определенное разрешение

@media (min-width: 1920px) {
	width: 110% !important;
}

Здравствуйте,
Вам нужно классу grid-layout-row ts-box-sizing
Во вложенности под id KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout
Сбросить стиль max-width в none;
Тогда нужное поле будет во всю ширину на любых разрешениях.

Сбросил max-width в none, теперь не нужно указывать конкретное разрешение. Приведите пожалуйста пример как переопределить свойство класса во вложенности по id? Не смог разобраться, и сделал пока так:

#KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout > div{
	max-width: none;
}

Извиняюсь, под #KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout и нет id, так что вариант с #KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout > div идеальный :twisted:

Если Вам требуется на всю ширину экрана, можете не заморачиваться с @media селекторами
Используйте специальные CSS единицы измерения Viewport Units: vw (1/100 процентное отношение к текущей ширине окна браузера) и vh (1/100 процентное отношение к текущей высоте окна браузера).

width: 100vw
В таком случае вне зависимости от размера экрана - элемент будет занимать всю доступную ширину окна, будьте внимательны с текущим значением box-sizing от чего будет зависеть будут ли в размер элемента включаться его border и margin в зависимости от этого иногда установка 100vw может привести к появлению горизонтальной полосы прокрутки, в таком случае необходимо будет или дополнительно скорректировать отсуты/границы или установить чуть меньшее значение в vw (98 - исходя из практики решает вопросы с типовыми проблемами)

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

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

Нравится

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

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

getDetailCaption: function() {
var cardPageName = this.get("CardPageName");
if (cardPageName === "ActivityPageV2") {
return "Name 1";
}
return "Name 2";
}

Что касательно полей на карточке, можно вывести их все, а видимость каждых полей что в зависимости от условий должны отображаться или не отображаться на атрибут, который в рантайме ставить в истину или ложь, в зависимости от того, из какой карточки была открыта страница редактирования.
Проверить от куда мы пришли, можно используя песочницу, между двумя схемами, схемой карточки, и схемой детали, подробнее про песочницу:
http://www.community.terrasoft.ru/forum/topic/15210

Добрый день! В 7.8.4 я реализовал вот так в схеме детали:

initDefaultCaption: function() {
if (Ext.isEmpty(this.get("Caption"))) {
var cardPageName = this.get("CardPageName");
var caption;
caption = (cardPageName === "SmrPaymentPageV2") ? this.get("Resources.Strings.CaptionInPayments") : this.get("Resources.Strings.CaptionInApplication");
this.set("Caption", caption);
}
}

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

Коллеги, добрый день!
Столкнулся с ошибкой "Value cannot be null. Parameter name: path2" при попытке зайти в мастер раздела Account.
С чем она может быть связана, не подскажете?
P.S. Скрин с ошибкой в приложении.
Версия стенда 7.6 Sales Pharma

Нравится

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

Здравствуйте, Владимир!

Такая ошибка может наблюдатся в том случае, если у Вас в системной настройке "Текущий пакет" установлен пакет по умолчанию, который заблокирован или имеет не корректную зависимость.
Для решения Вашей задачи, измените пакет по умолчанию на "Custom". После чего, очистите кэш браузера.
Если проблема останется актуальной, то прошу обратится к нам, в службу поддержки support@terrasoft.ru, для быстрого устранения ошибки.

Илья, спасибо!

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

Кейс такой. Создаем деталь у объекта.
Деталь создается но уже в заблокированном состоянии.
Пытаемся зафиксировать пакет в СВН, Система ругается, что нет прав, ктото уже заблокировал его.

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

Мной было сделано след-е в тортиле.
1. восстановил из старой версии файлы детали, которые были удалены.
2. скопировал в текущую
3. делаю коммит и выходит сообщение is locked in another working copy

Делал cleanup не помогло. Попробовал еще пару деталей сделать, но они автоматом блокированы (с зеленым замком)

круговорот такой не понятной.
bpmn ругается что нет такого в репозитарии
а тортила не может зафиксировать потому что объект заблокирован.

Как быть?

Нравится

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

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

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

Попробуйте удалить свою локальную working copy, после чего выполнить update из svn.
Скорее всего на Вашей машине хранится мусор в локальной папке svn, который блокирует работу.

Сделал
Select *
FROM [SysSchema]
where [IsLocked] > 0

Оказалось что они заблокированы.

Разблокировал.

Не помогло.
Сейчас даже детали через мастер создаются заблокированные сразу.
А как таковых деталей нет.

Удалите содержимое папки %TEMP%\%APPLICATION%\%WORKSPACE%\ находящуюся на локальной машине, кроме папки SVN, в ней находятся логины/пароли к SVN

Павел, не могу найти эти папки. в webconfig у меня так %TEMP%\%APPLICATION%\%WORKSPACE%\ но не нашел.

Описание параметров:

  • %TEMP% - C:\Windows\Temp
  • %APPLICATION% - порядковый номер сайта в IIS
  • %WORKSPACE% - название конфигурации (Default)

На моей локальной машине, следующий путь: C:\Windows\Temp\2\Default

Спасибо, Павел.

Я тоже столкнулся с таким багом. Вопрос к террасофту, как же можно было такое допустить то? Удалил схему, попытался её обратно залить, но не удалось, она заблокирована в СВН. Её там НЕТ! И хоть ты тресни.

Юсупов Марат,

Маракт, ну как ты решил этот вопрос?

Здравствуйте, Дмитрий!

Видимо, Марат не видит Ваших комментариев. Рекомендуем Вам написать ему в личные сообщения.

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