Здравствуйте. Разворачиваю приложение bpm on-site, на IIS Windows 7.
Но вот в чем проблема, приложение установил в IIS, путь к базе тоже вроде всё корректно прописано, НО когда запускаю приложение после ввода логина и пароля, в окне входа, появляется логотип "bpm'online", и ВСЁ, дальше ничего не происходит. Страницу не грузит, просто логотип bpm, приложение пересоздавал кучу раз с разными параметрами. Может кто-нибудь подскажет, в чем проблема может быть?

Нравится

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

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

Скорее всего не хватает ролей/компонент на веб-сервере IIS.
Перечень найдете по ссылке https://academy.terrasoft.ru/documents/sales-enterprise/7-10/ustanovka-…

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

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

Нравится

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

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

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

Приятной работы!

Да, спасибо помогло!)

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

Добрый день, Коллеги!
Возникла проблема с сортировкой записей в печатной форме.

Описание:
В разделе Заказ была добавлена Custom деталь с редактируемым реестром. На эту делать с помощью функционала импорта загружаем продукты из excel файла.
Во время импорта была реализована генерация порядкового номера продукта в соответствии с порядком записей в файле (Скриншот: "Порядок продуктов на детали с сортировкой по колонке порядковый номер".
Далее уже используем сортировку по колонке "Номер продукта" на детали для приемлемого вида.
Однако регистрация записей в базе происходит в произвольном порядке, и при печати файла продукты, в скачанном docx файле, не отсортированы (Скриншот: Порядок продуктов в распечатанном docx файле).

Вопрос: Как именно можно реализовать сортировку продуктов в распечатанном файле при его генерации по колонке "Номер продукта" детали, содержащей актуальную нумерацию? Возможно есть какой-то стандартный функционал сортировки при настройке печатной формы?

Заранее спасибо за помощь, Коллеги!

Нравится

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

Здравствуйте,
Есть справочник «Печатные формы», там открываете вашу печатную форму. Там есть закладка «Табличные части», табличные части можно изменить, и нужному полю, установить нужную сортировку. См скр:

Максим, огромное спасибо! Глупая невнимательность

Добрый день!

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

Руслан, например, можно формировать Excel-отчёт и затем уже в Excel сортировать так, как нужно.

Как вариант, да. Но если это, допустим, коммерческое предложение, которое формируется в PDF?

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

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

Нельзя просто так отбросить формат вывода, отчёты Word и PDF генерируются принципиально различно.

 

Если речь о Word, нужно смотреть ReportService, там направления определяют в коде функции GetAdditionalMacrosesData.

Почему же принципиально? Я как раз использую ReportService в котором с помощью флага задается формат формирования отчета (WORD или PDF), т.е. не надо писать дополнительный код, просто true/false. Печатная форма разрабатывалась еще на версии 7.14.х. Новую версию построителя отчетов еще не пробовал, вы наверно его имеете ввиду упоминая принципиальные отличия.

Спасибо за подсказку с функцией GetAdditionalMacrosesData. Глянул на нее, все методы приватные, видимо нужно будет дублировать класс ReportService с переопределением методов. Может как нибудь, но пока руки не поднимаются.

 

Руслан Хасанов пишет:

Почему же принципиально? Я как раз использую ReportService в котором с помощью флага задается формат формирования отчета (WORD или PDF), т.е. не надо писать дополнительный код, просто true/false.

Руслан, в более новых версиях вывод Word-отчёта в PDF отключили. На днях обсуждали. Тем, кто уже у себя использовали, пока оставили.

Руслан Хасанов пишет:

Спасибо за подсказку с функцией GetAdditionalMacrosesData. Глянул на нее, все методы приватные, видимо нужно будет дублировать класс ReportService с переопределением методов. Может как нибудь, но пока руки не поднимаются.

Либо же подойти с другой стороны и модифицировать саму информацию в базе о табличной части отчёта. Она хранится в таблице SysModuleReportTable в текстовом поле MacrosList структурами вроде:

  {
    "caption": "Активность.Фактическое завершение",
    "metaPath": "6d33ae9b-e8b1-46d0-bd42-b8a8ca3d4f6b.f944fa96-ddd0-4cb5-ab5b-19c08048beed",
    "metaPathCaption": "Активность.Фактическое завершение",
    "aggregationType": "",
    "subFilters": null,
    "dataValueType": "DateTime",
    "sort": "Descending"
  },

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

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

Зверев Александр пишет:

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

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

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

Такой подход неудобен тем, что если надо внести корректировку в печатную форму, то это придется делать на всех формах и чем их больше, тем сложнее поддерживать. Поэтому решил переопределить логику ReportService, но столкнулся с проблемой - при запуске проекта в Visual Studio команда (оригинал инструкции из коробки, т.е. я ни чего еще не менял): 

var reportGenerator = ClassFactory.Get<IReportGenerator>("Word"); 

выбрасывается исключение:

Error creating an instance of the "Terrasoft.Configuration.IReportGenerator" class

Потыкался и обнаружил что инструкция: 

ClassFactory.Get<Terrasoft.Configuration.ReportService.ReportHelper>();

в Visual Studio выполняется без ошибок.

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

Руслан, видимо, разница в том, что в во втором случае создают класс по названию, а в первом — по интерфейсу IReportGenerator и параметру. Может, такой способ при запуске не из системы не подходит?

 

Класс отчёта Word задан в схеме WordReportGenerator:

#region Class: WordReportGenerator
/// <summary>
/// Provides report generating functionality.
/// </summary>
[DefaultBinding(typeof(IReportGenerator), Name = "Word")]
public class WordReportGenerator : IReportGenerator
{

Видны те самые интерфейс, от которого наследуется класс, и параметр Word, который у Вас передаётся в ClassFactory.

 

Может, для целей отладки из Studio, создавать класс по полному названию, а уже потом, когда готовую логику будете размещать в схеме, напишете ClassFactory.Get<IReportGenerator>("Word"). Судя по схеме PdfAsyncReportGenerator, где использован именно этот вариант, он сам по себе допустим.

Спасибо, Александр, за помощь. Попробую пойти предложенным вами способом.

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

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

Добрый день!
Работаю в версии 7.8. В разделе "Продажи" есть вкладка "Продукты" внутри которой есть базовая деталь "Продукты в продаже". Цель: сделать базовую деталь "Продукты в продаже" с редактируемым реестром и добавить туда дополнительные поля.
Для этого:
- создал замещающий объект OpportunityProductInterest, куда добавил свои необходимые поля;
- создал замещающий клиентский модуль OpportunityProductPageV2, куда добавил свои поля;
- создал свою схема детали "Продукт в продаже" SuOpportunityProductDetailV2 (родительский объект Базовая схема детали с реестром ( NUI )), куда добавил следующий код:

define("SuOpportunityProductDetailV2", ["ConfigurationGrid", "ConfigurationGridGenerator",
   "ConfigurationGridUtilities"],
   function() {
   return {
      entitySchemaName: "OpportunityProductInterest",
      attributes: {
         "IsEditable": {
            dataValueType: Terrasoft.DataValueType.BOOLEAN,
            type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
            value: true
         }
      },
      details: {},
      diff: [
         {
            "operation": "merge",
            "name": "DataGrid",
            "values": {
               "className": "Terrasoft.ConfigurationGrid",
               "generator": "ConfigurationGridGenerator.generatePartial",
               "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
               "changeRow": {"bindTo": "changeRow"},
               "unSelectRow": {"bindTo": "unSelectRow"},
               "onGridClick": {"bindTo": "onGridClick"},
               "activeRowActions": [
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "save",
                     "markerValue": "save",
                     "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "cancel",
                     "markerValue": "cancel",
                     "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "remove",
                     "markerValue": "remove",
                     "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                  }
               ],
               "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
               "activeRowAction": {"bindTo": "onActiveRowAction"},
               "multiSelect": false
            }
         }
      ],
      mixins: {
         ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
      },
      methods: {
                addRecord: function() {
                                        var defValues = this.get("DefaultValues") || [];
                                        defValues.push({
                                                name: "Quantity",
                                                value: 1
                                        });
                                        defValues.push({
                                                name: "OfferDate",
                                                value: new Date()
                                        });
                                        this.set("DefaultValues", defValues);
                                        this.callParent(arguments);
                                },

                               
                                getFilterDefaultColumnName: function() {
                                        return "Product";
                                },

                                getGridDataColumns: function() {
                                        return {
                                                "Product.Name": {path:  "Product.Name"}
                                        };
                                }
      }
   };
});
;

- в OpportunityPageV2 переопределил базовую деталь

//Переопределение базовой детали "Продукт в продаже(OpportunityProduct)"
                        OpportunityProduct: {
                                "schemaName": "SuOpportunityProductDetailV2",
                                "entitySchemaName": "OpportunityProductInterest",
                                "filter": {
                                        "detailColumn": "Opportunity",
                                        "masterColumn": "Id"
                                }
                        }

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

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

Нравится

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

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

За функционал открытия новой страницы редактирования, при нажатии кнопки "+" отвечает метод addRecord из схемы "BaseGridDetailV2". Вам стоит смотреть в сторону переноса логики данного метода в схему детали "SuOpportunityProductDetailV2".

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

Доброго дня! Стикнувся з проблемою відлагодження коду JS у версії 7.7.0.2773_BankCustomerJourney. Після заміщення сторінки ContactPageV2 та зміни ісходного коду я мушу кожного разу зафіксувати клієнтські модулі в базі даних. У попередніх версія для того щоб побачити свої зміни портібно було просто очистити кеш в браузері. Підкажіть, будь ласка, чи можна че зробити у версії 7.7. Дякую!

Нравится

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

Здравствуйте, вероятно, Вы работаете в режиме clientUnits useFileContent="true" когда исходные коды выгружаются в файловую систему, и разработку ведете во внешнем редакторе.
Если работать с clientUnits useFileContent="false" и разрабатывать в браузере, таких проблем быть не должно.

Файл SectionBundleModule призван ускорить работу продуктивного сайта, собирая все схемы страниц и секций в одном файле. Любые изменения в браузере, в схемах страниц, при внесении изменений в них в браузере, и после очистки кеша, попадут в SectionBundleModule.

Если же вы разрабатываете во внешнем редакторе и не хотите постоянно фиксировать изменения в БД, соответствующей кнопкой в конфигураторе, для того что бы они попали в SectionBundleModule. Вы можете выключить механизм сбора файлов схем в единый SectionBundleModule. Установкой флага в веб. конфиге по адресу …\Terrasoft.WebApp в ложь: add key="UseIncludeDependenciesSource" value="false"

Який саме веб конфіг портібно встановити в false?

...\Terrasoft.WebApp\Web.config.

add key="UseIncludeDependenciesSource" value="false"
в файле
...\Terrasoft.WebApp\Web.config

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

Добрый день! Подскажите, пожалуйста, как можно сделать активными ссылки в полях карточки (версия 7.х). У нас есть 2 поля "ссылка на карту" и "ссылка на фото", в которых указаны адреса ссылок, но в в карточке они не активны. Пробовали решить эту задачу следующим образом: в пакете Custom создали модуль ActivityLink с кодом

Terrasoft.sdk.RecordPage.configureColumn("UsrShields", "primaryColumnSet", "UsrFoto", {
viewType: Terrasoft.ViewTypes.Preview
});

Terrasoft.sdk.RecordPage.configureColumn("UsrShields", "primaryColumnSet", "UsrMapReference", {
viewType: Terrasoft.ViewTypes.Preview
});

где UsrShields – таблица в БД, UsrFoto, UsrMapReference – поля. Не помогло

Нравится

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

Юлия, Вы используете не bpm библиотеки, а продукта terrasoft 3.x

Для 7.х

в DIFF колонки добавьте

showValueAsLink: true,
href: {
   bindTo: "getLink"
}

в METHODS реализуйте логику, которая будет возвращать url

getLink: function() {
   return {
      url: "url",
      caption: "Caption"
   }
}

Мария, добрый вечер! спасибо за ответ. В колонку вставила код и метод, ничего не изменилось.
это прописала в колонке:
{
"operation": "insert",
"name": "UsrFoto",
"values": {
"layout": {
"column": 0,
"row": 7,
"colSpan": 24,
"rowSpan": 1
},
"bindTo": "UsrFoto",
"caption": {
"bindTo": "Resources.Strings.UsrFotoCaption"
},
"textSize": 0,
"contentType": 1,
"labelConfig": {
"visible": true
},
"enabled": true,
"showValueAsLink": true,
"href": {
"bindTo": "getLink"
}
},
"parentName": "Header",
"propertyName": "items",
"index": 15
}

В методе: как Вы написали. Ссылка не активна...

Юлия, Вы пробовали отладку кода? Что пишет в консоли?
Метод нужно дополнять своей логикой. Я привела только алгоритм.

Пример можете посмотреть в BaseSchemaViewModel

Мария, добрый день! вставили такой метод:
getLink: function() {

var Foto = this.get("UsrFoto");
return {
url: Foto,
caption: Foto.displayValue
};

}
Не отображается страница. Во вложении скрин ошибки

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

Также обратите внимание на предыдущий комментарий:

"Мария Ватулина" написал:

Юлия, Вы пробовали отладку кода? Что пишет в консоли?

Метод нужно дополнять своей логикой. Я привела только алгоритм.

Пример можете посмотреть в BaseSchemaViewModel

Наглядно посмотрите как это сделано в BaseSchemaViewModel и реализуйте по аналогии

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

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

getLink: function() {
				var foto = this.get("UsrFoto");
				var target1 = "_blank";
				if (foto != null) {
					return {
						url: foto,
						caption: foto,
						target: target1
					};
				}
				else 
				return {};
			}

Настя, приложение bpm’online является одностраничным по своей сути. Это обозначает, что работа в приложении предполагается только в одной вкладке браузера. Вы могли это заметить, например, если откроете в разных вкладках реестр раздела и страницу добавления записи в этот раздел. Если во второй вкладке Вы произведете некие действия, то обновление не отобразится в первой вкладке, пока сама страница не будет обновлена.
Также это обозначает, что стандартный функционал открытия ссылок в другой вкладке (например, при нажатии колесиком мышки) нами не предусматривался. Даже если в приложении есть некоторые ссылки, с которыми есть возможность так работать, то это особенности браузера, а не наша функциональность.

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

И еще, если в реестре нажать на эту ссылку - она открывается в новой вкладке, это реализовано скорее всего в BaseSchemaViewModel, куда нам посоветовали посмотреть Вы и Мария. Я так думаю, что скорее всего где-то в этой функции:

		/**
		 * Выполняет открытие карточки в цепочке.
		 * @protected
		 * @virtual
		 * @param {Object} config конфигурация открываемой карточки.
		 */
		openCardInChain: function(config) {
			this.showBodyMask();
			var historyState = this.sandbox.publish("GetHistoryState");
			this.sandbox.publish("PushHistoryState", {
				hash: historyState.hash.historyState,
				silent: config.silent,
				stateObj: {
					isSeparateMode: config.isSeparateMode || true,
					schemaName: config.schemaName,
					entitySchemaName: config.entitySchemaName,
					operation: config.action || config.operation,
					primaryColumnValue: config.id,
					valuePairs: config.defaultValues,
					isInChain: true
				}

А конкретнее isSeparateMode: config.isSeparateMode || true
Может быть я ошибаюсь..

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

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

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

На днях мы отметили релиз линейки bpm'online 7.6, а сейчас давайте взглянём на её прадедушку — Terrasoft CRM 2.6. Бесценный артефакт в отличном состоянии был недавно продан на одном из онлайн-аукционов:
коробка

Книга, которую читают, когда делать совсем нечего или когда всё уже поломано:mrgreen:
инструкция
Лысый клиент чувствует нашу заботу:wink:
диск
Бывает softkey, а это — hardkey
ключ
Интерфейс платформы 2.X. Контакты
контакты
Контрагенты
контрагенты
Задачи
задачи

Нравится

Поделиться

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

"Зверев Александр" написал:Лысый клиент чувствует нашу заботу

Мне вот всегда казалось, что этот товарищ чешет затылок в поисках ответа на поставленный вопрос - чувствуют ли?
Хорошая была версия :cool:

Александр Кудряшов, возможно и так. Особенно в свете того, что он напоминает Хитмана.

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

Добрый день!

У нас стоит CRM Террасофт версия версия 3.3.1.163

Создали фильтр "Удалить" Он отбирает тех клиентов, которых надо удалить из базы.
Сейчас CRM не дает удалять записи, если в них содержится информация какая-либо. (см. вложенный файл).
Как можно отфильтрованные записи удалить все и сразу, а не по одному контакту?

Спасибо

Нравится

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

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

С уважением,
Группа компаний Terrasoft

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

Да, именно так и есть - в контактах есть информация, связь с другими объектами.

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

Самым быстрым способом является SQL запрос.

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

В клиенте поля имеют название тоже что и значение Name в админке. Например: edtName, edtContactID) и выскакивает ошибка приложения "error loading from stream". Кеш чиститься каждое утро. Заметил что ошибка появляется в карточке "Задача". Картка была переделана, появились вкладки, много новых полей.

Нравится

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

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

По описанию трудно понять в чем суть проблемы. Рекомендую Вам не только очистить кэш приложения, но и перерегистрировать библиотеки. Также желательно активировать отладчик и посмотреть где именно происходит ошибка.

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

Необходимо заполнять в Word документах поля с чек-боксами (прикрепил скриншот), возможно ли настроить эти поля в CRM и потом ответы на них экспортировать в файл вордовский (при формировании документов)?

Нравится

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

Здравствуйте, Сергей.

Вы создали тему в разделе "Terrasoft CRM 2.8".

Прошу уточнить, Вы не ошиблись или речь идет о другом продукте (Terrasoft 3.X, BPMonline)?

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