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

Было много вопросов на эту тему, но создаю еще, т.к. версия 7.12.

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

Нравится

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

Здравствуйте, Евгений!

Пока отсутствует возможность изменять цвет для определённой ячейки в зависимости от какой-то логики ( можно только для всей записи).

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

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

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

Воронка строится на основании кейсов конкретного раздела, а мне нужно построить воронку продаж по 3-м сущностям: лид(его стадии)+контрагент(его стадии)+продажа(ее стадии).

Подскажите, можно ли это реализовать?

Нравится

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

Добрый день, Роман!

Да, данный функционал сквозной воронки (начиная с лида) уже реализуется в системе и будет готов в релизе к концу этого лета. Вы можете более подробно описать свой кейс и мы учтем пожелание при данной реализации в рамках уже существующей проблемы 4662 (например, какие стадии в контрагенте вы делаете? вы хотите учитывать лиды, которые квалифицируются в контрагенты или лиды, как потребности по определенной базе контрагентов, а потом уже сколько этих потребностей переросло в продажи?).

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

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

Возникла идея прикрутить получение данных об организации по ИНН, как в 1С.

Варианты реализации вижу такие:

1. на странице AccountBillingInfo делаем обращение к веб-сервису, специально для этого созданному, веб-сервис обращается к стороннему сервису за данными и выдает результат.

2. на странице AccountBillingInfo на JS городим запросник, всю логику в этом запроснике реализуем.

Какие еще могут быть способы и как идеологически верно?

Нравится

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

Реализаций может быть много.

В 7.12 появился элемент БП для работы с сервисами. Можно написать процесс, который получает данные из внешнего источника, заносит в нужное поле и сохраняет запись. Но если хотите не хранить в базе, а показывать прямо со стороннего сервиса на ходу, то придётся всё клиентским JS, тут готовых решений нет.

Также можно посмотреть, как устроено обогащение информации о контрагенте, возможно, стоит реализовать что-то похожее.

Адреса и параметры веб-сервисов, с которыми работает 1С, можно посмотреть в исходниках её конфигурации.

 

Зверев Александр,

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

За ссылку на пример с БП большое спасибо.

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

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

Добрый день!

Есть такой метод

            calcCountRec: function() {

                    var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

                        rootSchemaName: "UsrProductInActivity"

                    });

                    esq.addAggregationSchemaColumn("Id",

                        Terrasoft.AggregationType.COUNT, "UsrProductInActivityCount");

                    esq.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL, "UsrActivity",  this.get("UsrActivity").value));

                    esq.getEntityCollection(function(response) {

                        if (response.success) {

                            var collection = response.collection;

                           if (collection) {

                                this.set("CountRec", collection.getByIndex(0).get("UsrProductInActivityCount"));

                            }

                        }

                    }, this);

                    

                },

 

где CountRec - это виртуальный атрибут

            "CountRec": {

                "type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

                "dataValueType": this.Terrasoft.DataValueType.FLOAT

            }

 

 

Необходимо при сохранении записи в методе save написать некие проверки, в которых было бы задействовано значение рассчитанного атрибута CountRec

Подскажите, где и как можно вызвать метод calcCountRec, чтобы значение CountRec не было undefined ? (может быть надо как-то сам метод изменить?)

если в save вызвать, и потом в save проверки - то значение undefined

если в onEntityInitialized вызвать, а потом в save проверки - то значение undefined

 

 

Нравится

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

Можно вообще всё вычислять без арибута прямо в методе сохранения. Или сделать обычное поле и заполнять значением суммы при сохранении записи на детали продуктов при помощи БП или триггера.

Зверев Александр,

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

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

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

Зверев Александр,

Это одно из вычислений(просто пример вычисления)

Есть второе вычисление - в другом методе

                

                calcCurrencyIdFromActivity: function() {

                var activityId = this.get("UsrActivity");

                if (activityId) {

                    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                        rootSchemaName: "Activity"

                    });

                    esq.addColumn("Id");

                    esq.addColumn("UsrCurrency.Id", "CurrencyActivity");

                    esq.filters.add("ActivityId", this.Terrasoft.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL, "Id", activityId.value));

                    esq.getEntityCollection(function(response) {

                        if (response && response.success) {

                            if (!response.collection.isEmpty()) {

                                var result = response.collection.getItems()[0];

                                this.set("CurrencyIdActivity", result.get("CurrencyActivity"));

                            }

                        }

                    }, this);

                }

            }

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

типа if this.get("CurrencyIdActivity").value==.. &&  this.get("CountRec").value

Но если вызывать эти функции, а потом посмотреть значения этих атрибутов, то они undefined, соответственно проверку выполнить невозможно.

 

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

Зверев Александр,

то есть те же самые 2 метода,вызвать их в методе save, но  внутри методов вместо записи  в виртуальные атрибуты запись в локальную переменную?

то есть вместо, например,

this.set("CountRec", сollection.getByIndex(0).get("UsrProductInActivityCount"));

будет

var cc= сollection.getByIndex(0).get("UsrProductInActivityCount"))

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

Или вы имеете ввиду объединить 2 метода в один как-то?

 

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

 

Зверев Александр,

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

 

Можно записать просто в локальную переменную внутри обработчика сохранения. Для удобства вызова написать функцию, которая получает на вход нужные Id и возвращает по ним значение из таблиц базы.

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

Функция нижеприведенная, к сожалению, не может вернуть ни значения currencyActivity, ни значения sumQuantity, ни значения сс, потому что все эти переменные существуют только  в рамках esq.getEntityCollection(function(response) {...}

calcCheckCurrency: function() {

                var activityId = this.get("UsrActivity");

                if (activityId) {

                    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                        rootSchemaName: "Activity"

                    });

                    esq.addColumn("Id");

                    esq.addColumn("UsrCurrency.Id", "CurrencyActivity");

                    esq.addColumn("UsrSumQuantity","SumQuantity");

                    esq.filters.add("ActivityId", this.Terrasoft.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL, "Id", activityId.value));

                    esq.getEntityCollection(function(response) {

                        if (response && response.success) {

                            if (!response.collection.isEmpty()) {

                                var result = response.collection.getItems()[0];

                                var currencyActivity=result.get("CurrencyActivity");

                                var sumQuantity=result.get("SumQuantity");

                                

                                

                                if ((currencyActivity !==this.get("UsrCurrency").value) &&

                                    (

                                    ((this.isAddMode() || this.isCopyMode()) && (sumQuantity>=1))

                                    ||

                                    ((this.isEditMode()) && (sumQuantity>1))

                                    )

                                   )

                                    {

                                        var cc=1;

                                        //this.showInformationDialog("Валюта не совпадает //с ранее выбранной");

                                    }

    

                            }

                        }

                    }, this);

                }

        },

 

                

В таком случае можно всю логику реализовать тоже внутри функции, которая вызывается по завершению getEntityCollection.

Добрый день! Внутри это где? Не поняла вас.

Проблема-то как раз в том, что асинхронно работает, и после завершения getEntityCollection  не доступны данные там вычисленные, они undefined.

Нужно, если условие не выполняется (условие проверяется внутри getEntityCollection), то выводить предупреждение и не сохранять карточку. Если выполняется, то сохранять карточку.

О методе save написан текст вышеприведенный, условие проверяется внутри getEntityCollection, предупреждение выводится - все прекрасно. Но не понятно, как вызвать здесь родительское стандартное сохранение

Если написать так:

                                if ((currencyActivity !==this.get("UsrCurrency").value) &&

                                    (

                                    ((this.isAddMode() || this.isCopyMode()) && (sumQuantity>=1))

                                    ||

                                    ((this.isEditMode()) && (sumQuantity>1))

                                    )

                                   )

                                    {

                                        var cc=1;

                                        this.showInformationDialog("Валюта не совпадает с ранее выбранной");

                                    }

                                   else this.callParent(arguments);

то возникает ошибка (Cannot read property 'superclass' of undefined)

                            

Если this.callParent(arguments) поставить в методе save в конце всей вышеприведенной функции, то тогда предупреждение выводится, но и сохранение также происходит ( а надо, чтобы не происходило)

 

 

 

 

 

Похожий вопрос решают тут.

 

Зверев Александр,

Спасибо, помогла связанная тема 

https://community.terrasoft.ru/questions/pereopredelenie-metoda-save-pr…

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

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

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

Нравится

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

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

Либо же модифицировать логику при нажатии кнопки в самой миникарточке задачи на этой панели, она реализована в схеме ActivityDashboardItemViewModel.

 

Если же есть пожелания по более удобной реализации, можете завести идею и там подробнее описать желаемое поведение системы.

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

Всем доброго времени суток!

Нужна Ваша помощь.

Развернул приложение на локальном ПК v7.12

Сайт запускается. но когда аутентифицируюсь в консоли выбивает ошибки:

http://prntscr.com/jav3ap

 

Во вложении так же логи ошибок.

Подскажите, что может быть не так?

Благодарю!

Прикрепленные файлы

Нравится

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

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

Запросите в поддержке "чистые" бинарные файлы 7.12.0.2702-sales-enterprise-marketing-service-enterprise-en и разверните приложение на них. Ранее полученные файлы с облачного приложения отличаются от коробочных, вследствие чего возникает указанная ошибка.

Сергей Кy6риш,

Здравствуйте! Так мне необходима именно данная сборка для доработки функционала и дебага. Ранее разворачивал 7.11.3 данных ошибок не было.

 

Нигрескул Алексей,

У вас и будет именно ваша сборка для доработок и дебаггинга, все что вам нужно хранится в вашей БД.

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

Литвинко Павел,

здравствуйте. У меня SalesEnterprise + Marketing

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

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

Есть файл *.dbf около 25 столбцов и 300000 строк. Нужно импортировать в бд bpm. На данный момент импорт реализован в БП через "Задание-сценарий" и данные успешно импортируются, но это занимает ооочень много времени и блокирует приложение полностью. Как можно ускорить процесс или хотя-бы сделать так, чтобы приложение не висло?

Нравится

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

Добрый день! Добавьте после стартового сигнала - сигнал ожидания 1сек. В результате, данный скрипт будет выполняться в параллельном потоке

Если система используется on site и вариант выше всё равно работает слишком долго,  то можно подключиться к базе dbf и залить данные в основную базу bpm'online при помощи SQL Server Management Studio. Учтите, при таком сохранении не отработает логика на уровне объектов и БП, её нужно будет реализовать самостоятельно.

Чубко Илья,

Спасибо!

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

Всем привет, есть необходимость подключить стороннюю JS библиотеку.

Создаю свою папку с библиотекой, в этой директории: Terrasoft.WebApp\Resources\ui

папка "ExternalLib", файл ExternalLib.js

В LeadPage:

 define("LeadPageV2", ["LeadPageV2Resources", ......, "jQuery","ExternalLib"

В консоле получаю ошибку("Файл не найден") :

https://xxx.ru/0/ExternalLib.js?hash=0ccc17c0d48d40469d1f114c719c305a

Подскажите пожалуйста, в чем проблема?

 

Нравится

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

Приветствую, Роман!

Таким образом вы не подключите внешнюю библиотеку, т.к. система не знает, что она существует.

Вам просто нужно создать новый модуль в конфигурации, с помощью define определить его и скопировать текст библиотеки. Советую посмотреть, как в конфигурации подключается jQuery (модуль так и называется).

Здравствуйте! Посмотрите в данной статье описано как использовать файловый контент в пакетах: https://academy.terrasoft.ru/documents/technic-sdk/7-12/ispolzovanie-fa…

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

Добрый день!

Есть активность, продукты в активности.

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

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

 

Общая стоимость пересчитывается, но для того, чтобы обновленное значение общей стоимости отобразилось на странице, приходится перегружать эту страницу(например, f5)

Подскажите, пожалуйста, как можно автоматическое обновление?

 

 

 

Нравится

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

"как можно автоматическое обновление?" это пять :)

обновление можно так:

1) поставить subscriber на деталь

2) делать loadEntity/или просто подгрузку единичного поля

подсмотреть пример - в реализации детали продуктов в заказе. (чтобы долго не искали: функция updateAmount вызывается в ProductEntryPageUtils)

Большое спасибо)

Варфоломеев Данила, сделал как в продуктах в заказе, при создании договора. При изменении продукта в детали сумма не меняется

Без конкретики сложно сказать. Если в оригинале меняется, а в Вашей копии — нет, значит, не всё скопировали.

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

Печатные формы не сохраняются из Ворда в ВРМ.

В логах IIS вижу

PUT /0/ServiceModel/EntityDataService.svc/SysModuleReportCollection(guid'dba75638-ad82-4a16-a64b-60dad3243605')/File - 443 Supervisor 31.44.80.30 Microsoft+ADO.NET+Data+Services - 405 0 0 0

Гуид действительно мой.

Чего не хватает IIS-у?

Нравится

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

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

Проблема может быть в том, что у Вас активна надстройка WebDAV. Для того, чтоб ее деактивировать, необходимо открыть Стартовое меню, найти "Включение или отключение компонентов Windows" ("Turn Windows features on or off"), в блоке IIS найти WebDAVPublishing и деактивировать.

Также рекомендуем проверить базу данных на наличие триггеров, которые запрещают сохранение ПФ. В базовой конфигурации они отсутствуют,но были кейсы, когда у пользователей они обнаруживались.

Одеяненко Юлия,

нужно ли после деактивации перезагружать сервер или сайт?

Алексей-Карягин, 

такой необходимости нет. Можно только переподключиться к приложению через плагин.

Одеяненко Юлия,

Оказалось что есть :) Но главное, что всё заработало, спасибо!

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