Здравствуйте. У нас система bpm online sales commerce Версия 7.7.0.2875

Мне нужно както быстро менять ответственного по активности и ответственного по контакту для нескольких контактов. Если делать через сиистему - то можна только по одному. Сначала в активности менять ответственного - сохранять а потом в контакте и сохранять. Это очень долго, если нужно сразу переставить 50-100 задач за день с одного менеджера на другого и при этом поменять ответственного в контакте.

Если какой-то быстрый метод для такой задачи? Спасибо!

Нравится

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

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

Для решения этой задачи Вы можете создать бизнес процесс, состоящий из трех элементов:
1) Начальный элемент
2) Изменить данные по объекту "Активность".
В фильтрации прописать условие, которое выберет записи, где нужно изменить ответственного.
В значение поле "Ответственный" необходимо установить нового ответственного
3) Конец процесса

С контактами - аналогично. Единственное отличие - во втором пункте объектом необходимо выбрать "Контакт".

Добрый день Алексей!!!

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

"Власов Михаил Викторович" написал:Чтобы в системе был универсальный настраеваемый инструмент, позволяющий в любой сущности конфигурации выполнять массовое замену значений

Особенно при чистке справочников. А то навводят городов, а потом их не почистить никак

"Владимир Соколов" написал:Особенно при чистке справочников. А то навводят городов, а потом их не почистить никак

Для этого гораздо лучше было бы вернуть с того света универсальный поиск дублей (3.х), который эту проблему позволял решать.

"Александр Кудряшов" написал:Для этого гораздо лучше было бы вернуть с того света универсальный поиск дублей (3.х), который эту проблему позволял решать.

Тоже идею надо публиковать. Глядишь, сделают одновременно с выпуском беспилотных автомобилей Google на улицы в 2018 году :)

Беспилотники Google врятли успеют появиться, япония обганяет в данном вопросе Google мобили. Их мобили уже по улицам городов, не всех но уже ездят. Народ читал, сильно не довольны, так как Аварий по вине беспилотного автомобиля, сейчас в японии очень большие. А у Google они еще в рамках их тестовых площадок ездят.

Здравствуйте!
А как мне выбрать фильтр чтобы вибырвльсь все активности - задачи, без Email? Как мне отбросить эти Емейлы?

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

В элементе "Изменить данные" по объекту "Активность" добавить условие "Тип" не равно E-mail.

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

Добрый день. Работаю с BPMonline 7.3. Необходимо реализовать экспорт в Excel отчета, который на данный момент вызывается с указанием фильтров в разделе "Аналитика" модуля Документ. Как это можно сделать?

Нравится

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

Добрый день Наталия!!!

по умолчанию в версии 7.3 как и выше создавать Отчеты в Эксель формате нет возможности. Для того чтобы создать Отчет в эксель формате я бы советовал использовать, загрузив во Внешние сборки, стороннюю DLL позволяющую формировать отчеты в Эксель формате. Я к примеру использую DLL от компании Syncfusion - "Syncfusion.XlsIO.Base.dll"

Или у вас Наталья в другом проблема, и я вас неправильно понял, прочитав ваше сообщение. Поясните пожалуйста побее детально, задачу что требуется решить. Спасибо!!!

Добрый день, Михаил!

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

Клиент хотел бы иметь такой же отчет в виде XLS файла.

Добрый день Наталия!!!

как я и писал выше, для решения вашей задачи вам лучше использовать стороннюю DLL позволяющую создавать Отчеты в эксель формате. Еще раз повторюсь стандартными инструментами BPMOnline этого не умеет делать, только PDF, Word

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

Возможно, с помощью Power Pivot через ODATA вытащить данные из bpm, и уже в Excel построить отчет?

"Владимир Соколов" написал:Возможно, с помощью Power Pivot через ODATA вытащить данные из bpm, и уже в Excel построить отчет?

Можно и таким способом реализовать данную задачу. Но я думаю нужно привести пример для Наталии. Попробую за сегодня накидать пример как я реализовывал данную задачу на примере маленького отчета, и как вы Владимир предлагаете реализовать. Но думаю клиенту нужно чтобы прямо из программы формировался отчет.

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

"Власов Михаил Викторович" написал:
Но думаю клиенту нужно чтобы прямо из программы формировался отчет.

Именно так!

Поднимаю вопрос....

Здравствуйте, Наталия!
Для загрузки внешних библиотек Вам необходимо перейти в конфигурацию. В конфигурации есть вкладка "Внешние сборки". Именно туда необходимо загружать *.dll файлы.

Пример формирования отчета в формате *.docx, *.pdf Вы можете посмотреть в схеме ReportHelper.

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

Коллеги, подскажите:
Как конфигурировать или изменять процессы выполняемые системой по нажатию стандартных кнопок процессов в гридах и на формах? Например кнопка "Распределить" в сущности Лид.

Нравится

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

Павел,
Подход следующий: определить в какой схеме добавлена кнопка – найти в схеме реализацию кнопки – найти обработчик на кнопку.
Кнопка “Распределить” реализована в преднастроенной странице LeadManagementDistributionPageV2(видно по адресной строке браузера). Страница открывается по процессу LeadManagementDistribution.
Базовые схемы/процессы изменить не получится, они не доступны для редактирования.
Как вариант можно деактивировать базовые процессы, сделать их копию и редактировать в соответствии с задачами.

Показать все комментарии
7.7
конфигурирование
Технические вопросы
7.x

Здравствуйте! Встала задача добавить для сущности Заказы вычисляемое поле, которое представляет собой разность полей Итого (Amount) и Суперкомиссия (UsrSuperFee). Создал такое поле по примеру из документации. Но так как это поле заполняется только в модели при выполнении метода onEntityInitialized() при загрузке карточки редактирования заказа, появляется кнопка "Сохранить" для сохранения этого значения в базу. Если же вынести вычисляемое поле в раздел Заказов, то там в этом поле будут, естественно, одни нули, потому что метод onEntityInitialized() здесь не выполняется.

Подскажите, пожалуйста, как правильно готовить вычисляемые поля? Не нажимать же на кнопку "Сохранить" на каждом заказе, чтобы заполнить его!

Нравится

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

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

по данной ссылки, что вы предоставили в своем обращение все правильно и верно описано как создать Вычисляемое поле. И в приведенном примере в документации Функция  this.calculateBalance исполняется в методе  onEntityInitialized для того чтобы при открытии карточки принудительно происходил расчет данного поля, что приведен в примере. Если вам этого не требуется выполнять а требуется чтобы расчет происходил, только к примеру при изменение какого-либо поля, то функцию  calculateBalance из метода  onEntityInitialized требуется исключить. И тогда при каждом открытии выполняться данная функция не будет. Или добавить условия при исполнение которого выполнялась бы данная функция.

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

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

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

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

Да, именно эту задачу мне требуется решить.

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

В [#Object#]SectionPageV2 нет метода onEntityInitialized(). По этой причине поле не считается, т.к. метод не вызывается.
В [#Object#]SectionPageV2 есть метод initData(), который Вы можете расширить для решения этой задачи.

"Демьяник Алексей" написал:В [#Object#]SectionPageV2 нет метода onEntityInitialized(). По этой причине поле не считается, т.к. метод не вызывается.

День добрый Алексей!!!

автор инцидента в первом своем сообщение давал ссылку на Академию, как в карточке редактирования создать и разместить вычисляемые поля. И именно данный метод "onEntityInitialized" есть в базовой и замещающих карточках редактирования. А потом желание перешло уже в раздел. Вот теперь я совсем запутался, что требуется Автору.

Алексей, не подскажете, как из initData() получить доступ к коллекции элементов заказов раздела, чтобы вставить логику расчета разности двух полей и поместить его в третье?

"Дмитрий Д." написал:Алексей, не подскажете, как из initData() получить доступ к коллекции элементов заказов раздела, чтобы вставить логику расчета разности двух полей и поместить его в третье?

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

при инициализации раздела и получение Потока Данных у вас не получится выполнить заполнение Вычисляемого поля. Для этого вам требуется создать отдельный бизнес-процесс который при срабатывание определенных условий на входе пересчитывал бы Одно данное поле в базе данных, а в разделе вы бы уже видели результат. Но и данный метод я бы сказал является ошибочным, так как если в Таблице будет Миллион записей, то на пересчет потребуется очень огромное количество времени и ресурсов. Это неверный подход. В опубликованной Вами ссылке Как добавить вычисляемое поле описан алгоритм создания вычисляемого поля для карточки редактирования. Рекомендую именно в карточки редактирования разместить данное вычисляемое поле. А в разделе еще раз повторюсь отображать только результат вычисления.

В дополнении к рекомендации заполнять данные в карточке, могу предложить для случаев, когда в карточке поле еще не рассчитано, но в реестре уже хочется видеть эту информацию:
1. Вывести в реестр данную физическую колонку, которую вы будете вычислять в карточке.
2. В схеме реестра, переопределить метод «addItemsToGridData», который срабатывает при загрузке порции данных в реестр. Т.к. реестр не отображает миллион строк, а только небольшими порциями (по 15 строк) удовлетворяющими фильтрацию, плюс при прокрутке вниз. Так же загружает все порциями, и в этот момент так же срабатывает метод «addItemsToGridData».
3. В методе для незаполненных строк, производить любые вычисления, и заполнять любые существующие колонки. (Важно: данные не уйдут в БД, а будут только информационными. В БД запись делайте при работе с карточкой.)
Пример переопределения метода, в котором я читаю и меняю поле Title строк. По аналогии можно читать и менять любое поле:

addItemsToGridData: function() {
   this.callParent(arguments);
 
   var gridDataItems = this.getGridData().getItems();
   gridDataItems.forEach(function(item) {
      var oldTitle = item.get("Title");
      item.set("Title", oldTitle + "!!!");
   }, this);
 
   console.log("new items loaded");
}

P.S. Так же думая об оптимизации при прокрутке реестра, не забудьте анализировать что поле уже заполнено к примеру так: if (item.get("Title")) { тут логика } что бы не выполнять лишние операции.
В моем случае это не имеет смысла, Title у меня и так всегда заполнен, и пример исключительно тестовый.

Еще немного оптимизации, анализ в методе только новой добавочной (15 строк) коллекции, зачем бегать по всему реестру, если там уже все рассчитано:

addItemsToGridData: function(dataCollection, options) {
	// forEach only new
	dataCollection.getItems().forEach(function(item) {
		var oldTitle = item.get("Title");
		item.set("Title", oldTitle + "!!!");
	}, this);
 
	this.callParent(arguments);
	console.log("new items loaded");
}

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

Максим, спасибо! Уже близко к истине. Только, насколько я понимаю, item в методе addItemsToGridData есть ViewModel, поэтому если какой-либо столбец не выводится в разделе, доступ к нему посредством метода item.get() невозможен. В этом случае нужно будет получать значения полей запросом к базе.

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

Благодарю.

"Дмитрий Д." написал:И еще: есть ли способ (может, с помощью скрипта?) рассчитать значения нового поля на основе существующих данных для всех записей раздела Заказы разом?

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

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

Да, там всегда есть ID записи, по которой можно сделать esq, но в этом мало смысла, так как есть метод «initQueryColumns», который и определяет список загружаемых в модель колонок.
Можно заставить загружаться все колонки в модель, что несколько замедлит загрузку реестра:

initQueryColumns: function(esq) {
	this.callParent(arguments);
	this.addAllColumns(esq);
}

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

initQueryColumns: function(entitySchemaQuery) {
   this.callParent(arguments);
   if (!entitySchemaQuery.columns.contains("IntegrationId")) {
      entitySchemaQuery.addColumn("IntegrationId");
   }
},

Разом изменить все существующие записи, можете либо бизнес процессом, либо SQL запросом.
В первом случае логику будете писать на C#, во втором на Transact-SQL.
Это если вы имеете в виду все-все существующие записи, а не только те, что выведены в реестр. И имеете в виду физические данные в базе данных, а не только информационно в реестре. Так как напоминаю, что в реестр данные грузятся порционно.

"Щиголь Максим" написал:Разом изменить все существующие записи, можете либо бизнес процессом, либо SQL запросом.
В первом случае логику будете писать на C#, во втором на Transact-SQL.

Я считаю что данную операцию лучше выполнять разово. Если создавать как постоянную бизнес-логику работы системы, то это может только привести к потере производительности, как я уже говорил выше всегда нужно помнить что рано или поздно количество записей в Таблице может достигнуть Миллиона записей и SQL серверу будет очень тяжело исполнять описанную бизне-логику.

Можете подсказать пример написания и выполнения SQL-скрипта в bpm'online 7.7? Что-то не нахожу подобного в документации.

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

Собственно, необходимо для каждого Order вычесть из поля Amount поле UsrSuperFee и вставить результат в поле UsrAmountWithSuperFee.

"Дмитрий Д." написал:

Можете подсказать пример написания и выполнения SQL-скрипта в bpm'online 7.7? Что-то не нахожу подобного в документации.

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

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

"Дмитрий Д." написал:Собственно, необходимо для каждого Order вычесть из поля Amount поле UsrSuperFee и вставить результат в поле UsrAmountWithSuperFee.

вот Дмитрий сам запрос на обновление

update p set
p.UsrAmountWithSuperFee = p.Amount - p.UsrSuperFee
from Order as p

Спасибо, Алексей и Михаил, за помощь!
Я так решил: если нужно, чтобы вычисляемое поле объекта получало значение в зависимости от значений других полей, то сначала необходимо прогнать всю таблицу sql-запросом для заполнения вычисляемого поля, а уже в карточке редактирования объекта реализовывать логику пересчета его значения при необходимости.

Показать все комментарии
Технические вопросы
7.x

При создании письма из карточки заказа открывается карточка письма. На вкладке "Основная информация" проставлен связанный с ним заказ. Где идет обработка данной операции? Разве не в коде карточки EmailPageV2 пакета Order?

entitySchemaName: "Activity",
                        methods: {
                                /**
                                 * Копирует значения колонок из схемы в текущую модель.
                                 * @overridden
                                 * @param {Object} entity Схема активности.
                                 */

                                copyEntityColumnValues: function(entity) {
                                        var order = entity.get("Order");
                                        if (order) {
                                                this.set("Order", order);
                                        }
                                        this.callParent(arguments);
                                },

                                /**
                                 * Возвращает массив загружаемых колонок.
                                 * @private
                                 * @overridden
                                 * @return {Array} Массив колонок.
                                 */

                                getEmailSelectColumns: function() {
                                        var columnsArray = this.callParent(arguments);
                                        columnsArray.push("Order");
                                        return columnsArray;
                                }
                        },

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

Нравится

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

Нашел вот такую инструкцию на эту тему:
Связывание писем по пользовательскому объекту (например, Лид)
sozdaniesvyazannoyaktivnosti.doc

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

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

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

Добрый день Александр!!!

я немного вас не понял, вы желаете чтобы при создание Письма из Заказа заполнялись бы и другие поля в карточки Письма из Заказа, помимо Реквизита "Заказ". Я правильно вас понял, или вы желаете что-то другое выполнить при создание Письма из карточки Заказа?

Смотрите, при создании письма из заказа у нас автоматически заполняется поле Заказ детали Связи вкладки Основная информация. Поле Контакт остается пустым. Следующим этапом происходит следующее:
1.Встаем в поле Заказ
2.Открывается список доступных заказов для выбора
3.Выбираем тот же самый (!) заказ
4.Поле Заказ заполнено, поле Контакт заполнено.
Следовательно при выборе другого или того же самого элемента в данной детали - обновляются связи, и поля заполняются, в соответствии с тем, как они заполнены в карточке заказа.
Потому такой вопрос: можно ли как то при инициализации карточки вызвать тот же самый метод, который срабатывает при смене значения поля Заказ детали Связи? И если возможно, то как называется данный метод?

Во-первых для начала стоило бы уточнить что вы добавляете активность через кнопку быстрого добавления активности которая по умолчанию скрыта в заказе, и для того что бы она появилась вы добавили метод:

getAddButtonMenuVisible: function() {
   return true;
},

В карточке заказа. Или из какой вы карточки создаете письмо, ваш второй комментарий вводит в заблуждение. Если же вы добавляете письмо через деталь «Письма» в заказе, то связь и так проставляется, делать для этого ничего не нужно.

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

setAdditionalDefValues: function(openCardConfig, next) {
	if (this.entitySchema.name === "Order") {
		openCardConfig.defaultValues.push({
			name: "Order",
			value: this.get("Id")
		});
		next();
	} else {
		next();
	}
}

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

P.S. за всю логику этой кнопки быстрого добавления активностей(писем) отвечает схема(миксин) QuickAddMixin, там и инициируется вызов метода setAdditionalDefValues

Никакой кнопки не добавлялось. Пошагово процесс добавления представлен на скриншотах


На скриншотах используется с кодом

setAdditionalDefValues: function(openCardConfig, next) {
        if (this.entitySchema.name === "Order") {
                openCardConfig.defaultValues.push({
                        name: "Order",
                        value: this.get("Id")
                });
                next();
        } else {
                next();
        }
}

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

Тогда все очень просто. QuickAddMixin в данном случае совсем не при чем. Контакт при выборе заполняется стандартными rules в схеме EmailPageV2 пакета Order. Которые не срабатывает после логики детали по заполнению полем вызывающей карточки. Все что вам нужно сделать, инициировать перевыбор при инициализации. Если заказ заполнен, а контакт нет.
В замещающей схеме EmailPageV2 пишите:

onEntityInitialized: function() {
	this.callParent(arguments);
 
	if(this.get("Order") && (!this.get("Contact"))) {
		var oldOrder = this.get("Order");
		this.set("Order", null);
		this.set("Order", oldOrder);
	}
},

Чистите кеш, перезаходите и проверяете. Как контакт, так и заказ при создании письма через деталь, будет заполнен.

Начну попорядку.
1. задача - При выборе заказа, на странице редактирования Активности, заполнять поле контакт.
Решение:

Создаем замещающий модуль страницы редактирования Активности и пишем код:

define("ActivityPageV2", [],
    function() {
        return {
            entitySchemaName: "Activity",
            attributes: {
                /**
                 * Заказ
                 */
                "Order": {
                    dataValueType: this.Terrasoft.DataValueType.LOOKUP,
                    lookupListConfig: {
                        columns: ["Contact"]
                    },
                    dependencies: [
                        {
                            columns: ["Order"],
                            methodName: "onOrderAttributeChange"
                        }
                    ]
                }
            },
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            methods: {
                /**
                 * Заполняем поле контакт, после выбора Заказа
                 * @private
                 */
                onOrderAttributeChange: function() {
                    var order = this.get("order");
                    if (order) {
                        var contactOrder = order.Contact;
                        if (contactOrder) {
                            this.loadLookupDisplayValue("Contact",
contactOrder.value);
                        }
                    }
                }
            },
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
            rules: {}
        };
    });

2 задача - При редактирование карточки Заказа требуется создать Еmail сообщение, при создание карточки редактирования EmailPageV2 заполнить поле контакт. Здесь все так же просто, выполнить замещение страницы редактирования Заказа. И написать следующий код:

define("OrderPageV2", [],
	function() {
		return {
			entitySchemaName: "Order",
			details: /**SCHEMA_DETAILS*/{
				EmailDetailV2: {
					schemaName: "EmailDetailV2",
					entitySchemaName: "Activity",
					filter: {
						masterColumn: "Id",
						detailColumn: "Order"
					},
					defaultValues: {							
						Contact: {masterColumn: "Contact"}
					}
				}
			}/**SCHEMA_DETAILS*/,
			attributes: {},
			methods: {},
			rules: {},
			userCode: {},
			diff: /**SCHEMA_DIFF*/[
			]/**SCHEMA_DIFF*/
		};
	});

все при создание емайл будет заполняться поле Контакт взятое со страницы редактирования Заказа.

"Щиголь Максим" написал:

Тогда все очень просто. QuickAddMixin в данном случае совсем не при чем. Контакт при выборе заполняется стандартными rules в схеме EmailPageV2 пакета Order. Которые не срабатывает после логики детали по заполнению полем вызывающей карточки. Все что вам нужно сделать, инициировать перевыбор при инициализации. Если заказ заполнен, а контакт нет.

В замещающей схеме EmailPageV2 пишите:

onEntityInitialized: function() {

        this.callParent(arguments);

               

        if(this.get("Order") && (!this.get("Contact"))) {

                var oldOrder = this.get("Order");

                this.set("Order", null);

                this.set("Order", oldOrder);

        }

},

Чистите кеш, перезаходите и проверяете. Как контакт, так и заказ при создании письма через деталь, будет заполнен.


Поле контакт заполняется, но вот код из карточки EmailPageV2 пакета UIv2 не отрабатывает, а конкретно функция OnContactChange:

				onContactChange: function() {
					var ext = this.Ext;
					var contact = this.get("Contact");
					var recipient = this.get("Recepient");
					if (ext.isEmpty(recipient) && !ext.isEmpty(contact) && !ext.isEmpty(contact.Email)) {
						var email = ext.String.format(this.get("Resources.Strings.EmailFormatString"),
							contact.displayValue, contact.Email);
						this.set("Recepient", email);
					}
				},

А именно в условии !ext.isEmpty(contact.Email) не выполняется, в отладчике пишет что contact.Email - пустое.

"Бахматов Александр Валерьевич" написал:Поле контакт заполняется, но вот код из карточки EmailPageV2 пакета UIv2 не отрабатывает, а конкретно функция OnContactChange:

Добрый день Александр!!!

я в своих сообщениях ответил полностью на ваши вопросы и описал как решить ваши задачи. По вопросу работы функции OnContactChange, на память не помню как она срабатывает, но судя даже по названию срабатывает при изменение контакта, и подстановки заполненного Email у контакта в поле "Recepient". вот как работает данная функция, что вас не устраивает в работе данной функции?

"Власов Михаил Викторович" написал:что вас не устраивает в работе данной функции?

Срабатывать она срабатывает, но в отладчике видно, что в объекте Contact не заполняются поля. Т.е. заполняется лишь display_value и value, в то время как должны еще заполняться поля Email и т.д. Потому if не отрабатывает и Recepient не заполняется в карточке.

Добрый день Александр!!!

тогда вам нужно заместить данную страницу, перед замещением конечно проверить следующее: (ниже привожу пример как правильно должен быть описан атрибут  Contact в замещающей странице редактирования  EmailPageV2 )

            attributes: {
                /**
                 * Контакт
                 */
                "Contact": {
                    lookupListConfig: {
                        columns: ["Email"]
                    }
                }
            }

вот только при таком описание Аттрибута контакт сработает следующий ваш код:

 ...
 if (ext.isEmpty(recipient) && !ext.isEmpty(contact) && !ext.isEmpty(contact.Email)) {
     ....
 }

Т.е. добавив этот атрибут, мы добавили его в возвращаемый объект и потому теперь заполняются поля display_value, value и email? Я правильно понимаю логику этой замены?

Добрый день Алексей!!!

описывая Атрибут Контакт добавляя:

   lookupListConfig: {
      columns: ["Email"]
   }

вы тем самым даете инструкцию при генерации и открытие страницы, что при формирование Выборки требуется еще для Атрибута "Контакт" выбрать его Емайл. И далее уже в коде проверяем если Контакт заполнен, то легко выбираем Емайл контакты выполнив инструкцию "contact.Email". Вот и все!!

если что непонятно написал, пишите перефразирую свою мысль.

Т.е., если мне понадобится обратиться к какому то атрибуту, я должен буду добавлять его в карточку, на примере Email?

"Бахматов Александр Валерьевич" написал:Т.е., если мне понадобится обратиться к какому то атрибуту, я должен буду добавлять его в карточку, на примере Email?

Александр если вам требуется получить Реквизит из другой сущности, как в вашем примере на карточке редактирования Емайл вам требуется получить Емайл контакта. то вам нужно именно в карточке редактирования описать следующее:

повторюсь еще раз

            attributes: {
                /**
                 * Контакт
                 */
                "Contact": {
                    lookupListConfig: {
                        columns: ["Email"]
                    }
                }
            }

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

Спасибо за объяснение!

Показать все комментарии
записи реестра
карточка контрагента
Технические вопросы
7.x

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

1. Название последней активности
2. Статус последней активности
3. Другие поля. Например, ответственный, даты и.т.д. т.е. любые поля сущности Активность.

И что бы все это отображалось в реестре, вид Плиточный.

Нравится

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

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

подскажите пожалуйста а какую цель вы преследуете, выполняя и выполнив описанную вами задачу? не легче настроить раздел Активности по описанным вами выше кретериям, создав разные преднастроенные Динамические фильтры. Я думаю идти от обратного всегда легче. Так как выполняя вашу задачу в разделе контрагенты система Автоматически будет генерить Левые соединение или Вложенные запросы, а это дополнительная нагрузка на SQL сервер.

Михаил, цель - чтобы визуально видеть какое последнее действие по контрагенту было не заходя в карточку контрагента. При формировании динамического фильтра таже проблема возникает:
- нельзя отфильтровать кнтрагента по названию последней активности
- нельзя отфильтровать по другим колонкам конкретной активности https://yadi.sk/i/ycf23ySBrpEBG

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

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

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

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

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

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

Нравится

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

Павел,
Задача решается с помощью элемента “Добавить данные”. Записи хранятся в таблице Reminding. Самый простой способ – добавить уведомление из приложения, посмотреть какие поля заполнены в таблице БД и по аналогии заполнить эти поля в процессе.
Также следует учитывать – в системе существуют провайдеры, которые считают и обновляют кол-во уведомлений в зависимости от объекта привязки и типа уведомления. Для основных разделов такие провайдеры уже реализованы. При необходимости следует создать пользовательский провайдер. Пример в системе – ActivityNotificationProvider.

"Зарицкий Олег Васильевич" написал:

Павел,

Задача решается с помощью элемента “Добавить данные”. Записи хранятся в таблице Reminding. Самый простой способ – добавить уведомление из приложения, посмотреть какие поля заполнены в таблице БД и по аналогии заполнить эти поля в процессе.


Здравствуйте, а где можно посмотреть эти поля? В самом объекте Reminding?

Добрый день!
Reminding – развязочная таблица, которая хранит внешние ключи на разные сущности.
Название полей и их тип легче посмотреть в объекте [Уведомление/ Reminding].
Какие значения там хранятся можно посмотреть в таблице БД – Reminding.

Показать все комментарии
Технические вопросы
7.x

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

Возникла такая задача: при выборе клиента в Заказе автоматически заполнять поля в Доставка -> Информация о получателе -> Контактный телефон(ContactNumber) и Имя получателя(ReceiverName). В замещающую страницу OrderPageV2 был добавлен код:

methods: {

init: function() {
this.callParent(arguments);
this.on("change:Client", function() {
var modelPage = this.Ext.getCmp("OrderPageV2Container").model;
var infoClient = modelPage.get("Client");
this.set("ReceiverName", infoClient.displayValue);
this.set("ContactNumber", "12345");
},
this);
}
},

Поля ReceiverName и ContactNumber автоматически заполняются, НО при нажатии на кнопку Сохранить, данные из полей пропадают. После закрытия заказа и открытия его заново, данные поля заполнены верно.

Как сделать так, чтоб содержимое данных полей не исчезало после нажатия на кнопку Сохранить??? Может кто-то сталкивался с такой проблемой?

Нравится

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

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

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

Спасибо. Данное вами решение помогло.

Показать все комментарии
7_стандартный_раздел
MultiSelect
Технические вопросы
7.x

Здравствуйте. В стандартном разделе есть функционал по кнопке "Действие" - выбрать несколько записей. При этом интерфейс строк раздела меняется, и в строках появляется поле чекбокса для выбора записи. Это все ок. Вопрос: Как реализовать механизм "выбрать все записи"? (отметить все записи галочками, одним кликом).

Нравится

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

Здравствуйте, Олег.
Вы задали данный вопрос в раках обращения 0300891
По нему Вы получите ответ.

Олег, во вложении инструкция для 7.3, но думаю, что для 7.6 тоже подойдет.
dobavlenie_deystviya_vybrat_vse.docx

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

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

Интересует вопрос получения данных контактов через Коллекции, данные в мануале ( https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/rabota-s-obekta... ) пишут, что при использовании $top=60 как GET переменную можно получить коллекции 60-ти контактов, но выдает поток только на один контакт.

Нравится

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