Здравствуйте! Столкнулся со следующей проблемой.
Невозможно сохранить изменения элемента "PrintReportUtilities", так как он создан сторонним издателем или установлен из файлового архива.
Как достучаться и написать в пакет NUi PrintReportUtilities свой отрывок кода.

Нравится

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

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

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

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

"Александр Кудряшов" написал:

Сейчас вам расскажут про снятие с поддержки при правке базовых пакетов

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

"Кадыров Надыр" написал:

Невозможно сохранить изменения элемента "PrintReportUtilities", так как он создан сторонним издателем или установлен из файлового архива.

Вносить изменения в базовые схемы нет возможности.

"Кадыров Надыр" написал:

Как достучаться и написать в пакет NUi PrintReportUtilities свой отрывок кода.

Только замещением с полным копированием кода схемы. Рекомендую поискать статьи о замещение на https://academy.terrasoft.ru/documents/technic-sdk/7-8/dokumentaciya-po…

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

Через мастер деталей создали 2 детали - Запросы поставщикам и Запросы инженерам на основе одного объекта - Запросы. Теперь нужно на каждой детали отфильтровать записи по типу запроса (запрос поставщикам и запрос инженерам). Вот код на примере одной из деталей:

В детали прописали "filterMethod":

"UsrSchema4Detail19b3960f": {
"schemaName": "UsrSchema4Detail",
"entitySchemaName": "UsrRequest",
"filter": {
"detailColumn": "UsrSale",
"masterColumn": "Id"
},
"filterMethod": "Order1Filter"
}

Затем в массиве metthods карточки раздела прописали функцию фильтрации:
Order1Filter: function() {
var filterGroup = new this.Terrasoft.createFilterGroup();
filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
filterGroup.add("UsrTypeRequestFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "UsrTypeRequest", "d0fbeb54-1381-4b01-a1f4-2bf074639122") // Образцы
);
filterGroup.add("ByOpportunityFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Opportunity", this.get("Id"))
);
return filterGroup;
}

Но фильтрация не работает. Что делаем не так?

Нравится

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

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

Рекомендую посмотреть схему детали ActivityDetailV2 - там добавлен фильтр, который отсеивает активности с типом Email.
Вам необходимо реализовать такую же логику в схеме UsrSchema4Detail.

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

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

"Демьяник Алексей" написал:

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

Рекомендую посмотреть схему детали ActivityDetailV2 - там добавлен фильтр, который отсеивает активности с типом Email.

Вам необходимо реализовать такую же логику в схеме UsrSchema4Detail.

Вопрос Дениса очень актуален! Нужно, чтобы фильтрация срабатывала сразу после добавления записи на деталь, а не после сброса кеша в браузере.

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

возник вопрос, как отслеживать изменения в текстовом поле карточки.
а именно, в зависимости от введенного [Числа] в определенное текстовое поле нужно изменять значение справочного поля. подобные изменения необходимо выполнять каждый раз, когда [Число] изменяется.
подскажите, как привязать к текстовому полю событие onChange (если таковое имеется), или каким образом вообще можно решить эту задачу.

заранее благодарен

Нравится

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

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

Есть два варианта решения:
1) На странице редактирования
2) На стороне сервера по событию изменения записи бизнес-процессом

Пример реализации на стороне страницы редактирования Вы можете посмотреть в схеме OrderProductPageV2:

"PrimaryPrice": {
	dependencies: [
		{
			columns: ["Price", "Amount", "DiscountAmount", "TaxAmount", "TotalAmount"],
			methodName: "calculatePrimaryValues"
		}
	]
}

Значение поля PrimaryPrice изменяется методом calculatePrimaryValues при изменении полей "Price", "Amount", "DiscountAmount", "TaxAmount", "TotalAmount".

Что касается бизнес-процесса, то реализуйте изменение записи элементом "Изменить данные". Процесс будет запускаться по событию "Изменение данных" в Вашем объекте. Обязательно укажите, какие поля должны быть изменены.

благодарю за ответ. попробую сделать так.

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

Беда, как говорится, не приходит одна.

Приведу примерный механизм изменения данных:

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

далее идет поиск нужного значения справочника и установка этого значения в справочное поле

var n =  item.get("Name");
var t = {
	displayValue: n,
	value: UsrLoial.value
};
this.set("UsrL", t);

Для справочника есть следующий метод для установки значения:

this.loadLookupDisplayValue("ИмяСправочника", значение);

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

Уважаемые форумчане!
На странице продажи OpportunityPageV2 создал справочное поле "Статус оплаты" со значениями "Не выставлен" и "Ожидание оплаты". В объекте Opportunity создал колонку "WaitForPay" типа дата/время.
Как мне сделать так, чтобы после сохранения продажи в WaitForPay заносилось значение даты и времени только, если выбрано значения "Ожидание оплаты"?

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

Нравится

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

Добрый день!
Можно добавить проверку на моименте сохранения, каким значением заполнено справочное поле "Статус оплаты". В случае, если указано состояние "Ожидание оплаты", записывать дату в поле "WaitForPay". Для проверки соответствующих значений, лучше использовать константы, чтобы не сравнивать два значения типа GUID, потому что через некторое время Вы сами забудете, что Вы тут сравниваете и код станет не читаемым и не сопросождаемым.
Можно переопределить метод onSaved: function() {...} на странице OpportunityPageV2 и написать что-нибудь подобное:

onSaved: function() {
this.callParent(arguments);
this.checkIfWaitForPayStatus();
if (!this.isNewMode() && !this.get("IsProcessMode")) {
this.calculateCompleteness();
}
this.updateDetail({detail: "OpportunityTacticHistory"});
//... продолжение тела метода onSaved ... //
}

checkIfWaitForPayStatus: function () {
var payStatus = this.get("PayStatusLookup");
var waitForPayStatus = UserConstants.WaitForPayStatus.value;
var currentDate = this.getSysDefaultValue(Terrasoft.SystemValueType.CURRENT_DATE_TIME);
if (payStatus && payStatus.value === "waitForPayStatus") {
this.set("WaitForPay", currentDate);
}
}

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

Вы можете создать бизнес-процесс, который будет запускаться по событию изменения записи в объекте "Продажа", должна быть изменено значение в поле "Статус оплаты", фильтр "Статус оплаты" = "Ожидание оплаты".

Далее элементом "Изменить данные" Вы можете установить нужное значение в поле WaitForPay.

Спасибо, помогло

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

В продукте sales enterprice 7.8 нужно добавить на страницу раздела "Звонки" поле с типом "файл" для сохранения одной записи звонка.
В конфигурации , в объекте раздела "Звонки" я добавила поле с типом "файл". В мастере раздела это поле недоступно для добавления в схему.
Как добавить это поле на страницу редактирования раздела "Звонки"?

Нравится

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

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

Мастер раздела bpm'online не умеет работать с полями с типом "Изображение", "Файл".
Для решения Вы можете сделать следующее:
1) Создать поле с типом "Справочник", которое будет ссылаться на объект "Файл и ссылка звонка"
2) Прикрепить запись разговора на деталь "Файлы и ссылки"
3) Реализовать логику переноса ссылки на добавленный файл в созданное Вами поле.

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

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

Добрый день.
Что необходимо проверить если быстродействие упало?
Ситуация такова, есть рабочая и тестовая среда.
Настройки одинаковые.
Но тестовая работает в разы быстрее чем рабочая. С учётом того что в рабочей подключений 3.
Всё пересмотрели.
Поделитесь опытом на что обратить внимание.
Спасибо.

Нравится

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

Добрый день.

Попробуйте проверить скорость работая в разных браузерах, или второе приложение открывать в режиме инкогнито. Т.к. два приложения не смогут работать одновременно в одном браузере.
Дополнительно нужно убедиться, что для каждого из сайтов указано разное значение redis db (в диапазоне от db=0 до 13) в файле ConnectionStrings:

<add name="redis" connectionString="host=localhost;db=0;port=6379;maxReadPoolSize=25;maxWritePoolSize=25" />

Илья, почему от 0 до 13?

Это значение индекса базы данных сервера сессий Redis.
Можно и больше, если изменить параметр databases в конфигурационном файле redis.conf

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

Мне кажется, дело в другом.

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

Первым делом надо понять, кто тормозит: веб-сервер, SQL-сервер или вообще браузер пользлователя.

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

Если сайт — могут быть запущены БП, потребляющие много ресурсов.

Понять, в чём проблема, можно по загрузке процессора и памяти на обоих серверах, веб и SQL.

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

То есть дело было всё же в Redis?
О RedisDesktopManager не знал, спасибо, надо поставить, посмотреть.

Да. Конкретно у нас да.

А до этого еще была проблема с web.config
Использовался старый MicrosoftWSService вместо нового SuperWSService. Но имхо это не так было существенно как Редис)))

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

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

Нравится

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

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

Телефон - что бы начинался звонок?
WEB типа - типа строка сделать ссылочным, бы при клике был переход по адресу ?
поле e-mail - что бы при клике, открывался почтовик?

Все это уже реализовано в детали "Средства связи"

Нравится

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

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

Обработчики нажатия на "иконки" на детали "Средство связи" реализована в схеме BaseCommunicationViewModel. Вам необходимо добавить "иконки" на страницу редактирования раздела "Контакты" (ContactPageV2) и реализовать обработчики нажатия на иконки по аналогии с BaseCommunicationViewModel.

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

Добрый день!
Задача такая - в разделе Заказы есть деталь Площадка - объект, куда необходимо доставить продукт. Площадок в заказе может быть несколько. Необходимо отобразить на карте объекты в выбранных заказах.

На странице OrderSectionV2 добавила кнопку "Показать площадку на карте", при этом в В define и function прописала "MapsUtilities", "MapsHelper".
Добавила функцию:

openShowOnMap: function() {
                                var items = this.getSelectedItems();//отмеченные галкой заказы - массив
                                var Farm = [];//массив площадок
                                var select = Ext.create("Terrasoft.EntitySchemaQuery", {
                                        rootSchemaName: "UsrPlatform1C"
                                });
                                select.addColumn("UsrPlatform");
                                select.addColumn("UsrOrder");
                                select.filters.add("UsrPlatformId", this.Terrasoft.createColumnInFilterWithParameters("UsrOrder", items));
                                select.getEntityCollection(function(result) {
                                        if (result.success) {
                                                Terrasoft.each(result.collection.getItems(), function(item) {
                                                        Farm.push(item.set("UsrPlatform").value);
                                                });
                                        }
                                });
                                var selectS = Ext.create("Terrasoft.EntitySchemaQuery", {
                                        rootSchemaName: "UsrFarm"
                                });
                                selectS.addColumn("Id");
                                selectS.addColumn("UsrName");
                                selectS.addColumn("UsrAdress");
                                selectS.addColumn("UsrCity");
                                selectS.addColumn("UsrRegion");
                                selectS.addColumn("UsrCountry");
                                selectS.addColumn("UsrGPSN");
                                selectS.addColumn("UsrGPSE");
                                selectS.filters.add("FarmId", this.Terrasoft.createColumnInFilterWithParameters("Id", Farm));
                                selectS.getEntityCollection(function(result) {
                                        if (result.success) {
                                                var mapsConfig = {
                                                        mapsData: []
                                                };
                                                result.collection.each(function(item) {
                                                                var address = [];
                                                        if (item.get("UsrCountry") && item.get("UsrCountry").displayValue) {
                                                                address.push(item.get("UsrCountry").displayValue);
                                                        }
                                                        if (item.get("UsrRegion") && item.get("UsrRegion").displayValue) {
                                                                address.push(item.get("UsrRegion").displayValue);
                                                        }
                                                        if (item.get("UsrCity") && item.get("UsrCity").displayValue) {
                                                                address.push(item.get("UsrCity").displayValue);
                                                        }
                                                        address.push(item.get("UsrAdress"));
                                                        var dataItem = {
                                                                caption: item.get("UsrName"),
                                                                content: "

"

+ item.get("UsrName") + "
"
+ address.join(", ") + "
",
                                                                address: item.get("UsrAdress") ? address.join(", ") : null,
                                                                //конвертирование полей долготы и широты
                                                                gpsN: parseFloat(item.get("UsrGPSN")),
                                                                gpsE:  parseFloat(item.get("UsrGPSE")),
                                                                updateCoordinatesConfig: {
                                                                        schemaName: "UsrFarm",
                                                                        id: item.get("Id")
                                                                }
                                                        };
                                                        mapsConfig.mapsData.push(dataItem);
                                                });
                                                MapsUtilities.open({
                                                        scope: this,
                                                        mapsConfig: mapsConfig
                                                });
                                        }
                                }, this);
                        }

При отладке кода выяснила, что фильтрация по выбранным заказам выполняется, получаем выбранные заказы и площадки в этих заказах.
А в запросе при выборе Адреса, Региона, Страны получаем данные ВСЕХ площадок, которые есть в базе данных, а не только полученных из предыдущего запроса. (скриншот во вложении). Помогите, пожалуйста, разобраться в чем ошибка в фильтрации в запросе!!!

Нравится

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

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

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

И на момент добавления фильтра в строке:

selectS.filters.add("FarmId", this.Terrasoft.createColumnInFilterWithParameters("Id", Farm));

массив Farm пустой. Следовательно, фильтрация не отрабатывает. Рекомендую Вам смотреть в сторону использования метода Terrasoft.chain или же формировать второй запрос к базе данных в callback функции первого запроса, а если точнее то сразу после кода:

Terrasoft.each(result.collection.getItems(), function(item) {
            Farm.push(item.set("UsrPlatform").value);
        });

Илья, спасибо большое за Ваш ответ.

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

Добрый день!

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

Нравится

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

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

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

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