Какие есть базовые варианты автоматического заведения пользователей портала по действию на клиентской части ?

Нравится

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

Добрый день. 



В базовой версии есть возможность самостоятельной регистрации пользователей портала. 



Детальнее с настройкой данного функционала Вы можете ознакомиться здесь (Настройка самостоятельной регистрации пользователей на портале) - https://academy.terrasoft.ru/documents/service-enterprise/7-12/nastroyk…

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

Скопировал через меню конфигураций в BPM default-ую конфигурацию. После этого сгенерировал для всех и скомпилировал систему. 

Пользовался новой конфигурацией, но обнаружил, что не работает открытия дизайнера страницы  (зависает при открытии) с ошибкой Элемент с ключом "'1088b060-7cfb-4444-b318-048fce072b0f' уже существует.

По профайлеру обнаружил, что запрос дублирует записи(все по 2штуки), первые 2 строки и есть мой идентификатор.

SELECT

    [Lookup].[Id] [Id],

    [Lookup].[CreatedOn] [CreatedOn],

    [Lookup].[CreatedById] [CreatedById],

    [CreatedBy].[Name] [CreatedBy.Name],

    [CreatedBy].[PhotoId] [CreatedBy.PhotoId],

    [Lookup].[ModifiedOn] [ModifiedOn],

    [Lookup].[ModifiedById] [ModifiedById],

    [ModifiedBy].[Name] [ModifiedBy.Name],

    [ModifiedBy].[PhotoId] [ModifiedBy.PhotoId],

    [Lookup].[ProcessListeners] [ProcessListeners],

    [Lookup].[Name] [Name],

    [Lookup].[Description] [Description],

    [Lookup].[SysEntitySchemaUId] [SysEntitySchemaUId],

    [Lookup].[SysPageSchemaUId] [SysPageSchemaUId],

    [Lookup].[SysLookupId] [SysLookupId]

    --,[SysLookup].[Name] [SysLookup.Name]

    --,[SysSchema].[Name] [SysSchema.Name]

FROM

    [dbo].[Lookup] [Lookup] WITH(NOLOCK)

    LEFT OUTER JOIN [dbo].[Contact] [CreatedBy] WITH(NOLOCK) ON ([CreatedBy].[Id] = [Lookup].[CreatedById])

    LEFT OUTER JOIN [dbo].[Contact] [ModifiedBy] WITH(NOLOCK) ON ([ModifiedBy].[Id] = [Lookup].[ModifiedById])

    LEFT OUTER JOIN [dbo].[SysLookup] [SysLookup] WITH(NOLOCK) ON ([SysLookup].[Id] = [Lookup].[SysLookupId])

    LEFT OUTER JOIN [dbo].[SysSchema] [SysSchema] WITH(NOLOCK) ON ([SysSchema].[UId] = [Lookup].[SysEntitySchemaUId])

 

Видимо нет фильтра для конфигурации. Как его установить?

Нравится

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

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

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

 

По поводу работы с несколькими конфигурациями написано на Академии:

https://academy.terrasoft.ru/documents/technic-sdk/7-12/osnovnye-pravil…

https://academy.terrasoft.ru/documents/technic-sdk/7-12/organizaciya-sr…

https://academy.terrasoft.ru/documents/technic-sdk/7-12/kak-sozdat-polz….

а где фильтрацию добавлять, если немного доработать систему?

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

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

Добрый день! Подскажите, как задать CSS стили для колонок на детали с реестром?

Нравится

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

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

Для реализации Вашей бизнес-задачи, Вам необходимо применить свои CSS стили к конкретному контролу в схеме (например, OrderDetailV2), на которых Вы планируете изменить стиль.



Примерный алгоритм реализации:

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



- создать свой модуль (пример модуля - CommonCSSV2);

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

- в замещающей схеме страницы редактирования раздела, в define прописать пользовательский модуль. Например:

define("DashboardDesignerV2", ["css!DashboardDesignerV2CSS", "CommonCSSV2"]

- в diff кнопки подключить пользовательский CSS класс.

Максим, можете, пожалуйста, уточнить, с какой целью надо изменить стили детали с реестром?

Показать все комментарии
поле справочника
справочник
7.11
sales

Всем привет. Такой вопрос.

В разделе выведено справочное поле (lookup), к примеру ссылка на организацию. Через get я могу получить id-шник выбранной записи (value) и имя записи (displayValue).

Стоит задача прочитать другие поля записи этого справочника через js код, например ИНН организации. Подскажите есть ли какая-то функция, передав в которую guid записи справочка, названия схемы и названия поля она возврвщала значение этого поля. Как это сделать через EntitySchemaQuery я представляю, но может есть вариант попроще?

Нравится

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

через attributes подтягиваете нужные вам колонки. пример

Account: {
   lookupListConfig: {
      columns: ["UsrINN"]
   }
}

//где-то в коде
var acc = this.get("Account");
var inn = acc ? acc.UsrINN : null;

 

Варфоломеев Данила,

Спасибо, попробую.

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

Всем привет. Помогите разобраться.

Нужно добавить новое представление на секцию.

Переопределил getDefaultDataViews, добавил в него новое представление. Получилось вот так:

Изображение удалено.

Кнопка появилась, только вот только нету никаких данных.

Что нужно делать.(В документации не нашел)(Исходник прикрепил)

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

Нравится

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

Ну по хорошему вам прямая дорога в ActivitySectionV2 (посмотреть как там реализован sheduler). 

Чисто на уровне теории: при переключении между разными view перещёлкиваются булевы включатели -> исчезает, допустим, грид, появляется либо новый грид и рефрешится коллекция данных под него, либо какие-то кнопки/списки/детали/др. визуальные элементы + запускаются методы под их наполнение.

В любом случае это куча переключателей и биндов на visible.

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

Пример: добавление нового представления реестра контактов, в котором будут контакты только с типом B2B:

define("ContactSectionV2", ["GlbClientConstants"], function(clientConstants) {
    return {
        entitySchemaName: "Contact",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        attributes: {},
        methods: {
            getDefaultDataViews: function() {
                var baseDataViews = this.callParent(arguments);
                baseDataViews.GridDataViewB2B = {
                    name: "GridDataViewB2B",
                    caption: this.get("Resources.Strings.B2BButtonCaption"), // Section header 
                    hint: this.get("Resources.Strings.B2BButtonCaption"), // Hint for button
                    icon: this.get("Resources.Images.B2BDataViewIcon") // Image for button
                };
                return baseDataViews;
            },
            loadActiveViewData: function() {
                var activeViewName = this.getActiveViewName();
                if (activeViewName === "GridDataViewB2B") {
                    this.loadGridData();
                }
                this.callParent(arguments);
            },
            loadGridDataView: function(loadData) {
                var gridData = this.getGridData();
                if (gridData && loadData) {
                    gridData.clear();
                }
                this.setViewFilter(this.get("ActiveViewName"));
                this.reloadGridColumnsConfig(false);
                this.reloadSummaryModule();
                this.callParent(arguments);
            },
            loadGridDataViewB2B: function(loadData) { // "load" + DataView.name
                this.loadGridDataView(loadData);
            },
            setActiveView: function(activeViewName) {
                this.callParent(arguments);
                if (activeViewName === "GridDataViewB2B") {
                    this.set("IsGridDataViewVisible", true);
                }
            },
            setViewFilter: function(activeViewName) { // Add filter for your "DataView"
                var sectionFilters = this.get("SectionFilters");
                if (activeViewName === "GridDataViewB2B") {
                    sectionFilters.add("FilterB2BType", this.Terrasoft.createColumnFilterWithParameter(
                        this.Terrasoft.ComparisonType.EQUAL, "Type", clientConstants.ContactTypes.B2B));
                } else {
                    sectionFilters.removeByKey("FilterB2BType");
                }
            }
        }
    };
});

Также можно действительно смотреть примеры реализации в базовом функционале, как подсказал Варфоломеев Данила

Кто бы сделал такое дополнение на Marketplace :)

Варфоломеев ДанилаОдеяненко Юлия,

Спасибо большое!

Показать все комментарии
мини-карточка
Лид
карточка контакта
7.11
sales

Коллеги, возникло желание (очень справедливое) при создании контакта из лида не вбивать заново информацию, которую уже занесли в систему.

Соответственно, вопрос: как в мини-карточке (второй вопрос - в нормальной карточке) создания нового контакта заполнить поля имеющейся информацией?

Изображение удалено.

 

Изображение удалено.

Нравится

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

Владимир,

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

Более подробная информация о квалификации лида находится на сайте академии в статье Квалификация лида.

"(очень справедливое)" - справедливости в этом мире нет. Поэтому придётся ручками на странице лида подписываться вот на это сообщениеНу и возвращать список дефолтных значений.



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

Соротюк Татьяна пишет:

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

Автоматически генерировать - это хорошо, но не всегда правильно. Хотелось бы перенести это на контролируемый способ, но упростить работу пользователей.



Будем пробовать предложенный вариант. Спасибо!

Показать все комментарии
Кейсы
справочники
7.11
sales

Всем привет!

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

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

В голову приходит подобный код

if (this.isAddMode() || this.isCopyMode()) {

this.set("UsrStatus", значение справочника)

}

Но ничего подобного я не обнаружил в исходниках страницы продаж или лидов.

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

Вопрос два, как установить значение справочного поля через set? 

Знаю, что качестве второго аргумента в set нужно передавать конструкцию {value: "Guid",

                                              displayValue: "Caption" }

Как правильно получить guid, зная только название справочного поля? Напрямую писать guid это слишком костыльно выглядит.

Нравится

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

1) На уровне объекта у колонки св-во: "значение по умолчанию". смотрим на какое справочное поле биндится полоска стадий, ну и соответственно ему задаём значение.

2) this.loadLookupDisplayValue(guid, #колонка_объекта_в_которую_надо_установить_значение#, callback, scope)

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

Варфоломеев Данила, а можно еще пример работы с методом loadLookupDisplayValue?

К примеру мне нужно получить установить значение "Подписан" в справочной поле Состояние договора, название схемы ContractState, название поля на карточке usrContractState. Что нужно выполнить?

Трефилов Павел Сергеевич пишет:

пример работы с методом

this.loadLookupDisplayValue("UsrContractState", "d7e40d7c-1fa4-49cb-a0d5-57a936f9a463"); //подменить на id значения "Подписан". Метод установит значение.

//или, если нужен коллбек:

this.loadLookupDisplayValue("UsrContractState", "d7e40d7c-1fa4-49cb-a0d5-57a936f9a463", function() {
    //сюда провалимся после того, как система установит значение. Удобно, когда надо дальше работать со значением UsrContractState.
}, this)

 

Варфоломеев Данила,

Понятно, по сути не сильно это отличается от установки через set.

 this.set("UsrContractState", {value: "d7e40d7c-1fa4-49cb-a0d5-57a936f9a463", displayValue: "Подписан"});

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

Трефилов Павел Сергеевич пишет:

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

Не только. К UsrContractState через lookupListConfig/columns вы можете подгружать допполя. Так вот в случае вызова loadLookupDisplayValue, функция их подгрузит, через set - нет.

Показать все комментарии
печатная форма
7.11
sales

Коллеги, здравствуйте.



Возможно ли реализовать печатную форму прайс-листа в объекте "продукты" в каталоге выбора продуктов?



К примеру не заходя на карточку продукта, а в продуктовом каталоге при нажатии на кнопку "выбрать все записи" или "несколько записей" выбрать интересующие нас продукты и по ним вывести печатную форму?



Заранее спасибо!

Нравится

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

Здравствуйте, Роман!

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

Если создавать печатную форму для раздела "Продукты", то вывести список продуктов таблицей не получится, так как можно будет только выгрузить по 1 файлу Word отдельно для каждого продукта (то есть, для каждой записи раздела).

Для того, чтоб выводить в печатную форму таблицу с названиями продуктов, можем предложить:

- добавить продукты на деталь какой-нибудь сущности (продажа/заказ/счет и т. п.), 

- создать ПФ, которую можно будет выводить со страницы того раздела, где деталь с продуктами,

- в ПФ добавить табличную часть по тому объекту, на детали которого находятся продукты.

Показать все комментарии
часовой пояс
часовые пояса
7.11
sales

Коллеги, 

а почему в справочнике "Часовые пояса" значения недоступны для добавления, редактирования и удаления? 



Клиент хочет использовать другой список, но есть подозрение, что это где-то зашито в коде и вызовет проблемы

Нравится

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

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

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

Кстати, а как в системе отслеживается переход (и не переход) на летнее-зимнее время? Летом с Москвой одна разница, а зимой другая.

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

для понимания того, как bpm'online работает с датами, нужно помнить следующее:

  • В базе даты хранятся в UTC, т.е. "по Гринвичу"
  • При создании соединения приоритет использования часового пояса следующий (по убыванию):
  1. Часовой пояс из профиля пользователя.

    При этом используется колонка "TimeZoneId" из таблицы "SysAdminUnit".

     
  2. Системная настройка «DefaultTimeZone».

    По умолчанию заполняется значением "(GMT) Coordinated Universal Time" (в пакете Base есть соотв. привязка данных), т.е. с нулевым смещением.

     
  3. Клиентский часовой пояс.

    Определяется по передаваемому с клиентского приложения UTC смещению.

     
  4. Часовой пояс сервера приложений.

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

 

Показать все комментарии
filterGroup
Serialize
Deserialize
module
7.11
sales

Добрый день.

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

Пробовал передать просто объект filterGroup - параметр с объектом не передается в модуль.

Пробовал передать 

filterGroup.serialize() 

- при десериализации строки получаю совершенно другую структуру объекта

Terrasoft.deserialize(filterGroup)

При добавлении этого фильтра в ESQ-запрос

происходит ошибка:

"Uncaught TypeError: a.on is not a function"

Подскажите, как корректно:

1. передать объект в параметры модуль?

2. провести сериализацию группы фильтров с последующим 



 

Нравится

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

ага. упирался уже в данный нюанс. Не могу найти пример с проекта, но фишка в serializationInfo. Вот пример из дефолтной конфигурации:

var serializationInfo = sectionFilters.getDefSerializationInfo();
serializationInfo.serializeFilterManagerInfo = true;
var deserializedFilters = Terrasoft.deserialize(sectionFilters.serialize(serializationInfo));

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



В консоли по быстрому накидал. Посмотрите, как различаются 2 результата десериализации (в моём примере v=Terrasoft.createFilterGroup()):

Варфоломеев Данила,

Огромное спасибо! Всё получилось.

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