Добрый день!

 

Реализовали функционал копирования деталей при копировании записи частично на примере существующего дополнения:

- в методе onSaved если режим  isCopy мы вызываем БП, в который отправляем конфиг с id старой\новой записи, название схемы и тд. Бизнес-процесс на основе заполненного справочника с колонками деталей создает новые связи с новой (скопированной записью).

 

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

Как лучше поступить в таком случае? Можно было бы реализовать это в событийном процессе базовой записи, но не очень понятно как в нем узнать, что сейчас происходит копирование, а не добавление. И почему вообще может возникать ошибка? Может быть в onSaved есть возможность доработки с ожиданием создания записи в бд? Заранее благодарю за ответы

Нравится

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

А данное дополнение не подошло под ваши задачи? https://marketplace.terrasoft.ru/app/copy-detail-records-creatio

Трефилов Павел Сергеевич,

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

Если это единичный случай, то я делал по другому:

Для страницы раздела переделать вызов метода copyRecord, в нем вызывать процесс, который делать поэтапно сначала делает копирование основной записи, а потом копирование записей деталей. К сожалению в БП нету элемента "сделать копию". Поэтому приходилось делать Читать данные - Добавить данные (режим одна запись) - Сохранить в id новой записи в переменную - Добавить данные в деталь (результат выборки) - открыть запись.

		methods: {
			copyRecord: function(primaryColumnValue) {
				this.runCustomCopyProcess(primaryColumnValue);
			},
 
			runCustomCopyProcess: function(primaryColumnValue){
				var args = {
					sysProcessName: "UsrCopySpecificationCustomer",
					parameters: {
						specificationsId: primaryColumnValue
					}
				};
				ProcessModuleUtilities.executeProcess(args);
			},
		}

Это все можно сделать и через isCopy, но там надо отловить момент, когда основная запись уже сохранилось и тогда запускать копирование детали, пример есть в InvoiceSection, правда код крайне замороченный, плюс там еще и вьюшки задействованы. По мне так проще через БП сделать, как у меня, пусть и не очень "красиво".

Трефилов Павел Сергеевич,

В плане копирования связей проблем нет -- сделали БП, там все работает. Проблема скорее в отлавливании момента, когда запись копии основной страницы уже создалась. Казалось бы, у нас для этого есть onSaved -- бери и делай. Но нет, не всегда в момент срабатывания onSaved запись уже создана в бд видимо...

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

Добрый день,

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

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

Нравится

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

Екатерина, здравствуйте.

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

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

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

Цель: нужно закрашивать ячейки в колонке (не строки) в детали, которые подходят по условию.

Вопрос: возможно ли это реализовать? Если да, то подскажите, пожалуйста, как? (желательно с примером)

Нравится

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

Евгений, добрый день!

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

Рекомендую ознакомится с этой публикацией о применении стилей.

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

Всем привет! Кто-нибудь делал горизонтальную прокрутку в продуктах(детали)? Саму прокрутку сделала через css(overflow-x: scroll; и width), но теперь возникла проблема если много продуктов, не видно полосу прокрутки для самых первых(так как полоса находится в самом низу).  Возможно есть идеи как зафиксировать полосу прокрутки что она всегда была видна внизу  или  что-то другое? Заранее спасибо!

Нравится

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

Добрый день

Анастасия, scroll будет отображаться внизу контейнера, который "скролит свой контент". В данном случае деталь расширяет свою высоту, поэтому горизонтальный скролл уходит вниз. Вам нужно зафиксировать высоту контейнера детали, чтобы сам контейнер не менял высоту при отображении новых продуктов. Также, через css

Добрый день

Анастасия, scroll будет отображаться внизу контейнера, который "скролит свой контент". В данном случае деталь расширяет свою высоту, поэтому горизонтальный скролл уходит вниз. Вам нужно зафиксировать высоту контейнера детали, чтобы сам контейнер не менял высоту при отображении новых продуктов. Также, через css

спасибо, работает!

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

Есть необходимость настроить сортировку в выпадающем списке редактируемого реестра. 

 

На обычной странице мы решаем эту проблему через атрибут:

"State": {
              lookupListConfig: {
                orders: [{columnPath: "SortCode"}]
              }
            },

 

однако очевидно на детали это не отрабатывает.

 

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

Нравится

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

Если нужно сортировать список в колонке MyColumn по полю справочника SortCode, нужно описать такой метод в схеме детали

getGridRowViewModelConfig: function(config) {
                var result = this.callParent(arguments);
                if (result && result.rowConfig && result.rowConfig.MyColumn) {
                    result.rowConfig.MyColumn.lookupListConfig = {
                        orders: [{columnPath: "SortCode", direction: Terrasoft.OrderDirection.DESC}]
                    };
                }
                return result;
            },

 

 

 

Если нужно сортировать список в колонке MyColumn по полю справочника SortCode, нужно описать такой метод в схеме детали

getGridRowViewModelConfig: function(config) {
                var result = this.callParent(arguments);
                if (result && result.rowConfig && result.rowConfig.MyColumn) {
                    result.rowConfig.MyColumn.lookupListConfig = {
                        orders: [{columnPath: "SortCode", direction: Terrasoft.OrderDirection.DESC}]
                    };
                }
                return result;
            },

 

 

 

Вадим Курунов,

Спасибо!

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

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

Нравится

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

Добрый день!
Можно проверить делать по названию в "Управлении конфигурации"


Или попробовать добавить ее через мастер раздела на страницу.


 

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

 

Самый надёжный способ - это сделать запрос в БД следующего вида:

 

select count(*) from "SysDetail" d
join "SysSchema" s on d."EntitySchemaUId" = s."UId"
where s."Name" = 'Код_объекта';

где вместо Код_объекта укажите Ваш актуальный код объекта.

Если вернётся значение 0 - детали отсутствуют.

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

На форуме есть много разных примеров, но ни один из них не заработал на нашей версии. Нужно, чтобы деталь представляла собой таблицу, колонки которой - это колонки объекта, к которому привязана деталь, а каждая строка - это объекты, связанные через деталь с редактируемой страницей (допустим, деталь счета на странице контактов, где каждая строка - это счет текущего контакта). Нужно, чтобы при нажатии на плюс возле названия детали, добавлялась строка, которую пользователь может заполнить. Сейчас при нажатии плюса открывается страница редактирования детали, а нужно, чтобы деталь редактировалась напрямую в Grid'e. 
Financial Services, v7.15

Нравится

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

опишите то как вы добавляете от создания объекта до создания детали, включая примеры кода

Dima Avdoshin,

Я создал объект, привязал его к детали, добавил деталь на страницу. В схему детали добавил следующий код:

define("Schema5Detail", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"], function() {
	return {
		entitySchemaName: "BankAccount",
		attributes: {
            "IsEditable": {
                dataValueType: Terrasoft.DataValueType.BOOLEAN,
                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                value: true
            }
        },
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
            {
                "operation": "merge",
                "name": "DataGrid",
                "values": {
                    "className": "Terrasoft.ConfigurationGrid",
                    "generator": "ConfigurationGridGenerator.generatePartial",
                    "generateControlsConfig": { "bindTo": "generatActiveRowControlsConfig" },
                    "changeRow": { "bindTo": "changeRow" },
                    "unSelectRow": { "bindTo": "unSelectRow" },
                    "onGridClick": { "bindTo": "onGridClick" },
                    "activeRowActions": [
                        {
                            "className": "Terrasoft.Button",
                            "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "tag": "save",
                            "markerValue": "save",
                            "imageConfig": { "bindTo": "Resources.Images.SaveIcon" }
                        },
                        {
                            "className": "Terrasoft.Button",
                            "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "tag": "cancel",
                            "markerValue": "cancel",
                            "imageConfig": { "bindTo": "Resources.Images.CancelIcon" }
                        },
                        // {
                        //     "className": "Terrasoft.Button",
                        //     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        //     "tag": "remove",
                        //     "markerValue": "remove",
                        //     "imageConfig": { "bindTo": "Resources.Images.RemoveIcon" }
                        // },
                        {
                            "className": "Terrasoft.Button", // последняя кнопка в коде
                            "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "tag": "card",
                            "markerValue": "card",
                            "imageConfig": { "bindTo": "Resources.Images.RemoveIcon" }
                        },
                    ],
                    "initActiveRowKeyMap": { "bindTo": "initActiveRowKeyMap" },
                    "activeRowAction": { "bindTo": "onActiveRowAction" },
                    "multiSelect": false
                }
            }
        ]/**SCHEMA_DIFF*/,
		methods: {},
		mixins: {
			ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
		}
	};
});

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

Возьмите прекрасное дополнение с Marketplace и используйте готовые шаблоны https://marketplace.terrasoft.ru/template/templates-developing-custom-d…

Владимир Соколов,

большое спасибо, но, увы, это дополнение поддерживается только начиная с 7.16, а у меня установлена 7.15.
Нельзя как-то в коде настроить, в каком порядке отображать колонки объекта на гриде?

Гусейн Гулиев,

Вам проще будет обновиться до новой версии :-)

Гусейн Гулиев пишет:
это дополнение поддерживается только начиная с 7.16, а у меня установлена 7.15.

что-то мне подсказывает, что это дополнение просто появилось, когда была версия 7.16, и никто его на ранних не тестировал.  

Ну, и даже с этим дополнением иногда нужно перекомпилировать и очистить Redis, чтобы заработало, как надо

Я отредактировал отображаемые колонки детали и сохранил для всех пользователей, но пользователи, открывшие страницу детали хоть раз до изменения, не увидели изменений, пришлось удалить деталь и добавить заново

Добрый день.

Вы можете посмотреть как это реализовано в базовой логике на странице редактирования заказа, деталь Продукты. При нажатии "три точки" -> добавить у нас добавляется строка, которую можно редактировать. 

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

Привет, коллеги,

 

возникла потребность отображать HTTP ссылку в текстовом поле детали с редактируемым реестром.
https://prnt.sc/1ybk46n

Видел похожее поведение в детали SupplyPaymentDetailV2. Там есть ссылки, но они ведут на карточку системы (при клике на справочное поле).
https://prnt.sc/1ybkk9v

Также наше пост на комъюнити, где обсуждается похожий вопрос
https://community.terrasoft.ru/questions/klikabelnye-ssylki-v-detali-s-redaktiruemym-reestrom

Подскажите, пожалуйста, куда копать, чтобы добиться того, чего мы хотим? 

Нравится

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

Дмитрий добрый день!

На данный момент полу ссылку в системе можно реализовать только средствами разработки.

Для реализации можно использовать следующею статью или напрямую изменять дом дерево страницы.

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

Доброго времени суток. Имею пробелму. Нужно в преднастроенной странице в деталь карты поставить кнопку для активной записи детали. Кнопку "Заблокировать карту"

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

Нравится

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

У меня таким образом
В DIFF
 

		"operation": "merge",
        "name": "DataGrid",
        "values": {
                "activeRowAction": {"bindTo": "onActiveRowAction"},
                // "onButtoClick": {"bindTo": "Alert"},
                "activeRowActions": [
                        {
                                "className": "Terrasoft.Button",
                                "style":this.Terrasoft.controls.ButtonEnums.style.GREEN,
                                "markerValue": "myButtonAction",
                                "tag": "Delete",
                                "caption": "Delete",
 
                        }
                ]
        }

И не забыть добавить в LocalizableString
"Delete"

В методах
 

			onActiveRowAction: function(buttonTag, primaryColumnValue) {
                if (buttonTag === "Delete") {
                          this.Delete();  // нужная функция
 			                }
        },

 
 

Oleg, у меня с таким же способом не срабаытывает почему-то( Все так же как вы описали, но не появляется кнопка.

Oleg,

 

И не забыть добавить в LocalizableString

"Delete" 

Не достаточно того, что вы написали в Caption название? Я вот этот пункт не сделал, не добавлял в LocalizableString.

Добавить комментарий

Ислам Ибрагимжанов,

Попробуйте :)

 

Не срабатывает, прощу помочь. Кто сталкивался ?

Oleg,

не отработало.

Ислам, добрый день!

Реализация в этом примере рабочая.

Обратите внимание, что код нужно добавлять в "Схема детали: "Название вашей детали"" (так она будет отображатся в конфигурации).
Привожу пример своей реализации:

define("Schemae4042f8dDetail", [], function() {
	return {
		entitySchemaName: "NewTestDetail",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
        "operation": "merge",
        "name": "DataGrid",
        "values": {
                "activeRowAction": {"bindTo": "onActiveRowAction"},
                "activeRowActions": [
                        {
                                "className": "Terrasoft.Button",
                                "style":this.Terrasoft.controls.ButtonEnums.style.BLUE,
                                "markerValue": "myButtonAction",
                                "tag": "myAction",
                                "caption": "MyButton"
                        }
                ]
        }
}
		]/**SCHEMA_DIFF*/,
		methods: {
			onActiveRowAction: function(buttonTag, primaryColumnValue) {
                if (buttonTag === "myAction") {
                        // весь код ниже можно убрать, он демонстрирует, что значения
                        // primaryColumnValue и activeRowId равны
                        var activeRow = this.getActiveRow();
                        var activeRowId = activeRow.get("Id");
                        console.log(primaryColumnValue);
                        console.log(activeRowId);
                        // дальше Ваша реализация
                }
        },
		}
	};
});

 

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

Приветствую!

 

Интересует следующий вопрос: возможно ли реализовать автоматическое заполнение детали/деталей на записи при массовом импорте данных в раздел из Excel без указания в шаблоне полей детали.

 

Условный пример: У меня имеется раздел Контакты, на записи Контакта имеется деталь Навыки (деталь с редактируемым реестром).

В данной детали всегда должно быть n-количество записей с условно такими полями:
НаименованиеНавыка (string), Включен (bool), УровеньВладения (lookup)

Сами записи (заполнены только наименования, остальное пусто):

Навык1

Навык2

Навык 3
 

Данные записи должны быть в детали Навыки на каждом Контакте. При добавление контакта кнопкой Добавить можно предзаполнять исходя из isAddMode или isCopyMode, но если загрузка данных производится через импорт, то каким образом данную деталь на каждую добавленную запись заполнить, так скажем, значениями по-умолчанию?

Нравится

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

Добрый день, Ирина.

 

Вашу задачу можно решить несколькими вариантами:

1) написать sql-запрос, который вставит нужные данные во все детали для загруженных записей. Такой запрос нужно запустить после импорта;

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

2) импортом из Excel. Подготовить файл с данными, в котором каждая строка будет содержать название навыка и поле-ссылку, идентифицирующую родительскую запись. Таким образом, если у Вас 3 навыка и 2 записи в родительской таблице, то в этом файле должно быть 6 строк по 3 навыка на каждую родительскую запись.

Добрый день, Ирина.

 

Вашу задачу можно решить несколькими вариантами:

1) написать sql-запрос, который вставит нужные данные во все детали для загруженных записей. Такой запрос нужно запустить после импорта;

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

2) импортом из Excel. Подготовить файл с данными, в котором каждая строка будет содержать название навыка и поле-ссылку, идентифицирующую родительскую запись. Таким образом, если у Вас 3 навыка и 2 записи в родительской таблице, то в этом файле должно быть 6 строк по 3 навыка на каждую родительскую запись.

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