Добрый вечер!

Вопрос довольно популярный, но хотелось бы найти конкретный ответ. Я добавил кнопку на одну из карточке, точнее две кнопки, одну в секции, а другую в странице. На кнопку добавил обработчик, реализовал вызов основной функции через sanbox. Осталось проблема с видимостью кнопки, необходимо что бы в зависимости от определенного поля кнопка становилась невидимой. 

Пробовал следовать инструкции https://academy.terrasoft.ru/documents/technic-sdk/7-12/kak-dobavit-kno…

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

В общем прочитать нужное поле не получилось, в частности если читать поле таким способом, то возвращается undefined

var id = this.get("ActiveRow");

this.get("GridData").get(id).get("UsrField");

Опытным методом выяснил, что если вытащить поле в список, то оно доступно.

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

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

Второй вариант, более сложный нужно как-то прочитать поле через sandbox.

Буду благодарен, если подскажите. 

Нравится

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

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

При изменении поля публикуйте сообщение и передавайте значение, а в карточке/секции подпишитесь на это сообщение, и в callback по переданному значению включайте/выключайте кнопку.

https://academy.terrasoft.ua/documents/technic-sdk/7-12/sandbox-obmen-s…

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

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

Возник вопрос по экспорту файлов из объекта "продукты".

В данный момент при эскпортировании файла из продуктов не прогружается фото, есть ли какой-то обходное решение?

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

Нравится

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

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

На текущий момент нету готовых решений по выгрузке фото с помощью экспорта в Excel.

Мы передали данное пожелание команде разработки для анализа возможности внедрения в будущих версиях продукта.

Андрей, спасибо за ответ

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

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

Нравится

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 класс.

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

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

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

В разделе выведено справочное поле (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 :)

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

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

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

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

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

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

 

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

Нравится

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

Владимир,

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

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

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



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

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

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

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



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

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

Всем привет!

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

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

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

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 - нет.

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

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



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



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



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

Нравится

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

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

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

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

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

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

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

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

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