binary data
download
js
pdf
Технические вопросы
7.x

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

Такая ситуация, есть обычная страница редактирования (PortalKnowledgeBasePage), а на ней обычная деталь (FileDetail), я хочу сделать так что бы при открытии страницы, сразу скачивался первый попавшийся файл на детали. На рендере страницы я вызываю этот метод:

renderDownloadFile: function () {
        var esqKnowledgeBaseFile = Ext.create("Terrasoft.EntitySchemaQuery", {
                "rootSchemaName": "KnowledgeBaseFile"
        });
        esqKnowledgeBaseFile.addColumn("Id");
        esqKnowledgeBaseFile.addColumn("KnowledgeBase");
        esqKnowledgeBaseFile.addColumn("Name");
        esqKnowledgeBaseFile.addColumn("Data");
        esqKnowledgeBaseFile.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                Terrasoft.ComparisonType.EQUAL, "KnowledgeBase", this.get("PrimaryColumnValue")));
        esqKnowledgeBaseFile.getEntityCollection(function(resultKnowledgeBaseFile) {
                if (resultKnowledgeBaseFile.success) {
                        var textFileAsBlob = new Blob([resultKnowledgeBaseFile.collection.getByIndex(0).get("Data")], {type:'application/pdf'});
                        var fileNameToSaveAs = resultKnowledgeBaseFile.collection.getByIndex(0).get("Name");

                        var downloadLink = document.createElement("a");
                        downloadLink.download = fileNameToSaveAs;
                        downloadLink.innerHTML = "Download File";
                        if (window.webkitURL != null) {
                                downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
                        } else {
                                downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
                                downloadLink.onclick = destroyClickedElement;
                                downloadLink.style.display = "none";
                                document.body.appendChild(downloadLink);
                        }
                        downloadLink.click();
                }
        }, this);
},

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

Нравится

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

Роман, проблема заключается в том что вы передаете в Blob стринг, вследствие чего файл получает нужный размер и тип, но абсолютно неправильное содержание. Работать массивами байтов в JavaScript не самая лучшая идея. Рекомендую Вам написать свой WCF сервис, который будет принимать Id записи, обращаться к базе данных и получать byte[]. Данный массив необходимо обвернуть в Stream и вернуть из сервиса добавив необходимый mime type.

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

"Мотков Илья" написал:Роман, проблема заключается в том что вы передаете в Blob стринг, вследствие чего файл получает нужный размер и тип, но абсолютно неправильное содержание. Работать массивами байтов в JavaScript не самая лучшая идея. Рекомендую Вам написать свой WCF сервис, который будет принимать Id записи, обращаться к базе данных и получать byte[]. Данный массив необходимо обвернуть в Stream и вернуть из сервиса добавив необходимый mime type.

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


Сделал как вы сказали, и все ровно не получается. Теперь клиентская сторона выглядит вот так:

onGetServiceInfoClick: function(idKnowledgeBase) {
				var serviceData = {
					KnowledgeBaseID: this.get("PrimaryColumnValue")
				};
				ServiceHelper.callService("CustomConfigurationService", "GetTransformValue",
				function(response) {
					var result = response.GetTransformValueResult;
					this.renderDownloadFile(result);
				}, serviceData, this);
			},
 
			renderDownloadFile: function (data) {
				var esqKnowledgeBaseFile = Ext.create("Terrasoft.EntitySchemaQuery", {
					"rootSchemaName": "KnowledgeBaseFile"
				});
				esqKnowledgeBaseFile.addColumn("Id");
				esqKnowledgeBaseFile.addColumn("KnowledgeBase");
				esqKnowledgeBaseFile.addColumn("Name");
				esqKnowledgeBaseFile.filters.addItem(Terrasoft.createColumnFilterWithParameter(
					Terrasoft.ComparisonType.EQUAL, "KnowledgeBase", this.get("PrimaryColumnValue")));
				esqKnowledgeBaseFile.getEntityCollection(function(resultKnowledgeBaseFile) { 
					if (resultKnowledgeBaseFile.success) {
						var textFileAsBlob = new Blob([data], {type:'application/pdf'});
						var fileNameToSaveAs = resultKnowledgeBaseFile.collection.getByIndex(0).get("Name");
 
						var downloadLink = document.createElement("a");
						downloadLink.download = fileNameToSaveAs;
						downloadLink.innerHTML = "Download File";
						if (window.webkitURL != null) {
							downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
						} else {
							downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
							downloadLink.onclick = destroyClickedElement;
							downloadLink.style.display = "none";
							document.body.appendChild(downloadLink);
						}
						downloadLink.click();
					}
				}, this);
			},

А сам веб сервис вот так:

public class CustomConfigurationService
    {
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public MemoryStream GetTransformValue(string KnowledgeBaseID)
        {
            var UserConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
            var KnowledgeBaseFileESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "KnowledgeBaseFile");
            KnowledgeBaseFileESQ.AddAllSchemaColumns();
            var KnowledgeBaseIDFilter = KnowledgeBaseFileESQ.CreateFilterWithParameters(FilterComparisonType.Equal, "KnowledgeBase", new Guid(KnowledgeBaseID));
            KnowledgeBaseFileESQ.Filters.Add(KnowledgeBaseIDFilter);
            var KnowledgeBaseFileEnteties = KnowledgeBaseFileESQ.GetEntityCollection(UserConnection);
 
            var data = KnowledgeBaseFileEnteties[0].GetColumnValue("Data") as byte[];
            var result = new MemoryStream(data);
 
            return result;
        }
    }

Ну и в последнем методе "renderDownloadFile", параметр data вот такой

И ещё пробовал с веб сервиса передать массив байтов, и принимать его вот так:

var textFileAsBlob = new Blob(data, {type:'application/pdf'});

Все ровно ничего хорошего не получилось

Роман, данный функционал уже реализован в системе. Посмотрите в сервис FileService. К примеру для файла с страницы редактирования контактов достаточно сформировать тэг

<a target='_self' href='http://localhost:8087/0/rest/FileService/GetFile/e9eafee9-c4e4-4793-ad0a-003bd2c6a9b4/564a97fc-7290-4343-b45e-8f466e5fad5b"'></a>

Где e9eafee9-c4e4-4793-ad0a-003bd2c6a9b4 - UId объекта ContactFile, а 564a97fc-7290-4343-b45e-8f466e5fad5b - Id файла из таблицы ContactFile. UId будет проще всего скопировать напрямую с уже созданных линков на детали "Файлы и ссылки".

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

создаю "Замещающие клиентский модуль"
в него копирую все содержимое из QualifyLead
компилирую, после этого нажимаю в карточке лида "Квалифицировать" и получаю пустую страницу и ошибку в консоле
"all-combined.js:298 Uncaught TypeError: Cannot read property 'source' of undefined"

что я делаю не так?

Нравится

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

Добрый день!
Собственно вопрос: как добавить кнопку в деталь Средства связи контакта?
Хочу добавить Кнопку отправки смс возле кнопки позвонить.(как на скриншоте)
PS. кнопка появляется только для "мобильных" номеров.

Нравится

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

Добрый день Василий!!!

так как детали средств связи контрагента и контакта генерируются автоматически при открытии карточки редактирования. То метод отвечающий за инициализацию, генерацию и прорисовку генерируемых полей - это метод  getItemViewConfig схемы  ContactCommunicationDetailV2 . Прошу внимательно изучить данный метод на предмет как происходит генерация представления полей в зависимости от типа Средств связи. И тогда вы найдете то место где происходит добавление Иконки. Если будут вопросы при изучение. Пишите. С радостью на них отвечу.

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

Добавление кнопки "Позвонить" реализовано в схеме BaseCommunicationDetail методы:
1) getIconTypeButtonConfig
2) getCommunicationItemViewConfig

Очень интересная ситуация я даже и не обращал внимание что деталь "ContactCommunicationDetail" оказывается рабочая, а деталь "ContactCommunicationDetailV2" не рабочая. Хотя в заголовки детали "ContactCommunicationDetail" написано "Средства связи контакта (устаревшая версия)". Это я говорю про конфигурацию BPMOnline Sales Enterprise 7.7.0.2293. Поэтому приношу извинение, что повел по ложному пути. Да действительно описанные методы Алексеем верные.

Добрый день.
Спасибо за отзывы. Понял как сделать.)

Добрый день.
Столкнулся с такой проблемой.
Если добавить в деталь две записи с отправкой смс то кнопка из правой пропадает. Видно на скриншоте.
Она есть но ее не видно, появляется при уменьшении окна(уменьшении длины поля для ввода телефона).
А также при нажатии на кнопку отправить вызывается выпадающия список для правой записи. Видно на скрншоте 2.
Вопрос:
как отобразить эту кнопку?
Или как уменьшить длину поля для ввода?

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

Замещал два модуля BaseCommunicationDetail и BaseCommunicationViewModel.
В BaseCommunicationDetail в методе getCommunicationItemViewConfig добавил smsButtonConfig.
В BaseCommunicationViewModel добавил обработку нажатия на кнопку метод onSMSButtonClick.
Оба файла прикрепил.
Код BaseCommunicationDetail:

---------------------------------------------------
            methods: {
                init:function(){
                    this.callParent(arguments);
                    debugger;
                },
                getCommunicationItemViewConfig: function() {
                    //var itemViewConfig = this.callParent(arguments);
                    var itemViewConfig = ViewUtilities.getContainerConfig("item-view",
                        ["detail-edit-container-user-class", "control-width-15"]);
                    var typeMenuItems = this.getTypeMenuItems();
                    var typeButtonConfig = this.getTypeButtonConfig(typeMenuItems);
                    var iconTypeButtonConfig = this.getIconTypeButtonConfig();
                    var textEditConfig = this.getTextEditConfig();
                    itemViewConfig.items.push(typeButtonConfig, textEditConfig, iconTypeButtonConfig);
 
 
                    var smsButtonConfig = this.getSmsButtonConfig();
                    itemViewConfig.items.push(smsButtonConfig);
                    return itemViewConfig;
                },
                getSmsButtonConfig: function() {
 
                    var smsButtonConfig = {
                        className: "Terrasoft.Button",
                        classes: {
                            wrapperClass: "detail-icon-type-btn-user-class"
                        },
                        imageConfig: {
                            bindTo: "getSMSImageConfig"
                        },
                        style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        selectors: {wrapEl: "#iconType"},
                        click: {
                            bindTo: "onSMSButtonClick"
                        },
                        visible: {
                            bindTo: "getTypeIconButtonVisibility"
                        }
                        //hint: {
                        //    bindTo: "getTypeIconButtonHintText"
                        //},
                        //markerValue: {
                        //    bindTo: "getIconTypeButtonMarkerValue"
                        //}
                    };
                    return smsButtonConfig;
                },
            },
Показать все комментарии
Веб сервисы
Технические вопросы
7.x

Всем доброго дня.
Столкнулся с проблемой настройки веб-сервиса в BPMonline Sales 7.7.0.2293

        [ServiceContract]
        public interface IService
        {
                [OperationContract]
                string TestService(string param1, string param2);
        }
        public class TestServiceBpm : IService
        {
                public string TestService(string param1, string param2)
                {
                        ...
                }

..\Terrasoft.WebApp\ServiceModel\TestServiceBpm.svc:

%@ ServiceHost Language="C#" Debug="true" Service="Namespace.TestServiceBpm" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

..\Terrasoft.WebApp\ServiceModel\http\services.config:

behaviorConfiguration="BaseServiceBehavior" name="Namespace.TestServiceBpm">
 
  name="TestService"
  binding="webHttpBinding"
  behaviorConfiguration="RestServiceBehavior"
  bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
  contract="Namespace.IService" />
  address="soap" binding="basicHttpBinding" contract="Namespace.IService" />
  address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
 >

web-config :

path="ServiceModel/TestServiceBpm.svc">
    >
      >
        users="*" />
      >
    >
  >

При попытке достучаться через браузер (http://hostName/1/ServiceModel/TestServiceBpm.svc)
получаю ошибку

Exception Message: An XML comment cannot contain '--', and '-' cannot be the last character. Line 92, position 7.
...

при попытке добавить ServiceReference в VS:

There was an error downloading 'http://hostName/1/ServiceModel/TestServiceBpm.svc/_vti_bin/ListData.svc/$metadata'.
The operation has timed out
Metadata contains a reference that cannot be resolved: 'http://hostName/1/ServiceModel/TestServiceBpm.svc'.
The remote server returned an unexpected response: (302) Found.
Too many automatic redirections were attempted.
If the service is defined in the current solution, try building the solution and adding the service reference again.

Подскажите пожалуйста, в чем моя ошибка!

Нравится

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

Добрый день!

Мы поддерживаем создание веб-сервисов только через конфигурацию.
Подробную информацию по настройке Вы найдете на нашей академии по ссылке - https://academy.terrasoft.ua/documents/technic-sdk/7-8-0/integraciya-s-…

Сергей, добрый день!
Не очень понимаю что вы имеете ввиду. Есть ссылки:
http://www.community.terrasoft.ua/forum/topic/16414
http://www.community.terrasoft.ua/forum/topic/16393
из которые понятно, что создавать веб-сервисы в 7.х можно так, как пытаюсь я.

Добрый день!
Первое:
..\Terrasoft.WebApp\ServiceModel\TestServiceBpm.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="Namespace.TestServiceBpm" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>

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

Ошибка

Exception Message: An XML comment cannot contain '--', and '-' cannot be the last character. Line 92, position 7.
...

говорит о том, что где-то в конфиге есть ошибка

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

Здравствуйте! В схеме карточки редактирования заказа в системном методе setValidationConfig() регистрирую метод-валидатор для одного из полей. Внутри этого метода делаю запрос к таблице заказов с помощью EntitySchemaQuery и провожу проверку на корректность данных. Как известно, запрос на выборку данных запускается с помощью метода EntitySchemaQuery.getEntityCollection(function(result) { ... }). По-видимому, данный метод работает асинхронно, поэтому метод-валидатор заканчивает свою работу, не дожидаясь результата выборки. В итоге, валидация всегда получается успешной вне зависимости от результата проверки.

Как можно решить эту проблему? Есть ли способ выполнить выборку из базы синхронно?

Нравится

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

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

Предоставьте, пожалуйста, полный листинг Вашего кода.

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

подскажите пожалуйста вам Валидацию когда требуется производить в момент заполнения формы или перед сохранением? если к примеру требуется сделать перед сохранением, то ваша задача решаема. За это отвечает метод  asyncValidate . Если у вас конфигурация Sales, пример можно подсмотреть в схеме  ContractPageV2 , там как раз перед сохранением идет проверка Уникальности номера, при проверке выполняется запрос к Базе данных.

для сведения на клиентской стороне все SQL запросы выполняются Асинхронно. И это правильно. Это увеличивает производительность программы. Плюс чтобы вы понимали на клиентской стороне должны быть построены самые элементарные запросы. Если запрос нетривиальный, его требуется строить и выполнять уже на стороне сервера, т.е писать код на C#.

будут вопросы с радостью на них отвечу

Вот код функции, отвечающей за валидацию (упрощенный пример):

actNumberValidator: function() {	
	var invalidMessage = "";
 
	// Получаем список заказов
	var orderEsq = Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "Order",
		isDistinct: true
	});
	orderEsq.addColumn("Number");
	orderEsq.addColumn("UsrActNumber", "ActNumber");
 
	orderEsq.getEntityCollection(function(result) {
		var orderCollection = result.collection.collection;
		var isActNumberExists = orderCollection.items.some(function(item) {
			return item.get("ActNumber") === this.get("UsrActNumber");
		}, this);
 
		if (isActNumberExists) {
			invalidMessage = "Заказ с таким номером акта уже существует";
 
			return {
				invalidMessage: invalidMessage, 
				fullInvalidMessage: invalidMessage
			};
		}
	}, this);
 
	return {
		invalidMessage: invalidMessage,
		fullInvalidMessage: invalidMessage
	};
}

Я понимаю, что такой тяжелые запросы к базе лучше не выполнять на клиенте, но валидацию необходимо проводить перед сохранением изменений объекта. Насколько я знаю, сделать это возможно только на клиенте.
Михаил, не могли бы вы объяснить, как работает валидация с использованием метода asyncValidate?

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

какой минус я вижу сразу в вашем запросе. Это вы делаете запрос к БД и получаете весь список Заказов, и далее перебираете их и сравниваете их. А если в БД будет Миллион записей? то все клиент ваш подвиснет навсегда или надолго. Давайте идти по порядку. Опишите задачу, какое поле проверяем (при Валидации) какой правильно должен отрабатываться запрос к БД и цель этого запроса. и далее я вам помогу составить и запрос и приведу как этот запрос Асинхронный будет работать при валидации полей. И еще пока незабыл данная валидация когда должна работать при Заполнение полей или при сохранение карточки редактирования. Спасибо!!!

Опишу задачу. Для каждого заказа заполняется поле [Номер акта]. Нумерация актов идет отдельно для каждого контрагента, указанного в прикрепленном к заказу договоре в поле [Наша компания]. Соответственно, в контрагенте есть поле [Номер последнего заказа]. При добавлении нового заказа с указанным договором (поле [UsrContract]) запускается процесс для увеличения номера последнего заказа. Поля [Номер акта] и [Номер последнего акта] должны быль редактируемы. Поэтому при заполнении номера акта необходимо проверять его уникальность.
Может быть, предложите другое, более оптимальное решение данной задачи?

"Дмитрий Д." написал:Нумерация актов идет отдельно для каждого контрагента, указанного в прикрепленном к заказу договоре в поле [Наша компания].

Вопрос где хранится данный номер Акта? в отдельной таблице или где? так как по умолчанию в конфигурации Sales Актов выполненных работ нет. Данная сущность создана с нуля? это отдельный раздел и таблица? если так то как Акт и договор связаны, какой связью "1 ко многим"? Далее вопросы как Заказ связан с Актом выполненных работ и для чего это сделано? я просто немного не понял как у вас сейчас это все Дмитрий реализовано. Поясните поподробнее пожалуйста. Я скажу вам свое мнение правильно или нет. И как бы я реализовал. Так как данную задачу в своей конфигурации я уже выполнил. спасибо!!!

Отдельной сущности Акт нет. Акт распечатывается на объекте Заказ и содержит в шапке примерно такой текст: "Акт №<номер_акта> от <дата_окончания_отчетного_периода> выполненных работ и оказанных услуг к Приложению №<номер_приложения> договора №<номер_договора> от <дата_подписания_договора>". Номер акта хранится в кастомном поле Order.UsrActNumber. Сейчас это поле заполняется руками. Нужно, чтобы это поле заполнялось автоматически. Для этого у контрагента было заведено поле Account.UsrActLastNumber для хранения номера последнего акта. При добавлении нового заказа данное поле инкрементируется и заносится в Order.UsrActNumber.

Хорошо Дмитрий если развивать вашу идею, то вам достаточно при сохранение заказа обновлять поле "UsrActLastNumber" в Контрагентах, а при создании (именно при создании) нового Заказа и при выборе Контрагента из БД заполнять поле "UsrActNumber" + 1 и все. Цель Валидации я просто тогда далее не вижу. Или я чего-то не понял. Поясните пожалуйста еще раз спрашиваю Дмитрий для какого поля вы желаете проводить валидацию и в какой момент в момент Заполнения или в момент Сохранения. Спасибо!!!

Поле UsrActNumber доступно для редактирования. При редактировании этого поля хотелось бы проверить его значение на уникальность.

"Дмитрий Д." написал:Сейчас это поле заполняется руками. Нужно, чтобы это поле заполнялось автоматически.

Выше именно это вы Дмитрий писали о поле "UsrActNumber". Т.е. вы желаете чтобы пользователь заполнил номер акта вручную, а программа проверила Равняется или нет введенный новый номер акта ("UsrActNumber") последнему номеру контрагента ("UsrActLastNumber"). И если номера равны выдать предупреждение об этом. Данную задачу вы желаете решить? я правильно вас понял? если до то еще раз повторюсь как вам требуется провести Валидацию в момент ввода или перед сохранением? спасибо!!!

Михаил, давайте подойдем к вопросу с другой стороны. Расскажите, как это реализовано у вас? Как вы работаете с актами?

Дмитрий я к данному вопросу подошел следующим образом. Я разделил сущности Договор на 2 части, хозрасчетные договора, данные договора закрываются реализациями и счет-фактурами. И договоры об оказании услуг, вот данные договора закрываются Актами выполненных работ. все разделено на отдельные сущности. У каждой сущности своя нумерация, свои отчетные документы, свои бизнес-процессы. Это маленькое начало большого айсберка :) А в целом полностью закрыл Складской учет, работа с поставщиками, работа с покупателями, управление денежными потоками. Получилось очень даже неплохо. Вот по какому пути я пошел изначально.

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

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

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

да все верно Дмитрий вы поняли. Но смысл есть всегда, во первых данные сущности хранятся отдельно чтобы для данной сущности были свои Отчетные формы, свои бизнес-процессы. Так как BPMOnline изначально создавалась и позиционирует себя как система BPMN позволяющая пользователю помощь в работе и недопустить ошибок и увеличить его производительность. Это первая цель. Вторая цель выгрузка результативных документов из BPMOnline в 1С. Так как бухгалтерия работает в 1С. Пока в BPMOnline бухгалтерия не работает. Но и над этим вопросом я сейчас занимаюсь. Я не пытаюсь скопировать и клонировать 1С. Я сейчас проектирую и разрабатываю систему, на платформе BPMOnline которая закроет все вопросы. Но будет гораздо удобнее, быстрее и т.д. Вот моя цель и задача на сегодня.

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

Після оновлення з SVN при переході на розділ і натиснення на кнопку "Добавить" не прогружається сторінка. Структуру об єктів оновляв, дані встановлював, компілював. Фото з помилкою показано на рис.1 та рис.2. Підкажіть в чому може бути проблема.

Нравится

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

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

Для проведения анализа прошу направить на support@terrasoft.ru читабельные скриншоты и подробное описание сути вопроса с указанием продукта и версии.

Спасибо.

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

Добрый день.
Подскажите как из BPMOnline 7.5 выгрузить Id, Code(кастомное поле) Контрагентов(

SELECT [Id], [Code] FROM [Account]
) в файл. Есть ли стандартные средства для этого или надо писать самим?

Нравится

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

настройте внешний вид списка контрагентов (лучше в виде списка) соответствующим образом и выгрузите по кнопке "Экпорт" в действиях секции

"Дмитрий Степанов" написал:настройте внешний вид списка контрагентов (лучше в виде списка)

Только там не возможности вывести поле Id.
Или я ошибаюсь?

"Маланчак Василий Тарасович" написал:Только там не возможности вывести поле Id.
Или я ошибаюсь?

Добрый день Василий!!!

нет вы не ошибаетесь, системное поле Id вывести в список раздела нет возможности. Если вам к примеру разово требуется получить список Контрагентов с определенными полями, то я бы сделал следующим образом:
1. Сформировать в SQL Server Management Studio правильный SQL запрос
2. Исполнить в консоли запрос
3. Полученные результат выборки скопировать и вставить в Эксель документ.

все а далее уже в Экселе к примеру обрабатываете как вам требуется. По данному пути бы я пошел если мне требуется получить список контрагентов с их "Id" идентификаторами.

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

"Власов Михаил Викторович" написал:2. Исполнить в консоли запрос

а это как? объясните пожалуйста поподробнее.
Там ~60000 записей.

Дайте почту, я вам пошлю инструкцию

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

Часто бывает необходимо отправить клиенту счет, коммерческое предожение и т.д. Как известно, базовая функциональность bpm´online предлагает это решать так:

  • Нажали на кпонку "Печать"
  • Сохранили документ (ну он сам в принципе сохранился)
  • Создали новый E-mail
  • Прицепили к нему этот файл и отправили

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

  • Создали новый заказ
  • Процессно создали событие E-mail
  • Сгерерировали и сохранили печатную форму заказа
  • Открыли окно события с вложением и отправили

Вот скрипт:

var RecordId = GetGuid>("OrderId"); // Id записи, для которой генерируем файл, параметр процесса
var ActivityId = GetGuid>("ActivityId"); // Id активности, к которой его цепляем, параметр процесса
var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
ReportData data = new ReportData();
ReportService reportService = new ReportService();
var ReportSchemaId = "2fcb529e-e3a8-4926-85c6-585f53e25765"; // Id шаблона печатной формы отчета
data = reportService.GenerateMSWordReport(ReportSchemaId, RecordId.ToString(), true); //true - перевод в pdf, false - MS Word
var reportStream = new MemoryStream(data.Data);


var entityFileSchema = userConnection.EntitySchemaManager.GetInstanceByName("ActivityFile");
var entityFile = entityFileSchema.CreateEntity(userConnection);
entityFile.SetDefColumnValues();
entityFile.SetColumnValue("ActivityId", ActivityId.ToString());
entityFile.SetColumnValue("Name", "Poptavka.pdf");
entityFile.SetColumnValue("TypeId", "{529BC2F8-0EE0-DF11-971B-001D60E938C6}"); // - тип вложения файл, не менять
entityFile.SetColumnValue("Size", reportStream.Length);
entityFile.SetStreamValue("Data", reportStream);
entityFile.Save();
return true;

Usings:
Terrasoft.Reports
Terrasoft.Configuration.ReportService
System.IO
System.Web

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

Удачи :)

Нравится

Поделиться

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

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

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

http://<адрес сайта>/0/ViewPage.aspx?Id=41899fab-093e-4808-86db-5794b9836745&recordId=0d8c28ce-9794-42be-8427-3d5d60e60c1f&entitySchemaUId=0a62cd3d-6541-4c5c-903f-e5b0fc665297&treeGridId=PageContainer_TreeGrid&SysModuleEditId=00000000-0000-0000-0000-000000000000&SelectedModuleId=00000000-0000-0000-0000-000000000000&ParentEntitySchemaId=00000000-0000-0000-0000-000000000000&typeColumnUId=%2294f2a9f755c74ecf9b6417583ddc058b%22&closeMessage=ReportEditPageClosed

вас интересует кусок recordId=0d8c28ce-9794-42be-8427-3d5d60e60c1f, где 0d8c28ce-9794-42be-8427-3d5d60e60c1f и есть наш id шаблона

Спасибо. Работает

ну я бы удивился, если бы нет :smile:

:) Ваш код работает, а вот открыть в БП потом письмо не получаеться, так как не корректно отрабатывает елемент "Страница редактирования" - открывает страцицу Задачи, а не письма. В техпотдержке уже взяли в работу

:) Ваш код работает, а вот открыть в БП потом письмо не получаеться, так как не корректно отрабатывает елемент "Страница редактирования" - открывает страцицу Задачи, а не письма. В техпотдержке уже взяли в работу

да не может быть! посмотрите картинку - так у вас? Вы там точно указали карточку email?

очень маленькая картинка. Можна немного больше?

очень маленькая картинка. Можна немного больше?

ну там смысл, что в элементе "Открыть преднастроенную страницу" надо выбрать Страница - Email (не страница Задача)

да так и выбрал. Все равно открывает задачу. Проверял и на других БП - это глюк елемента. Версия 7.8.0.1134

aaaaa....7.8... не проверял

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

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

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

Схема

Спасибо!

Нравится

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

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

Отличий в лицензировании от обычной схемы нет. Вы делаете запрос лицензий и устанавливаете их в системе.

Здравствуйте Илья,

Подтвердите пожалуйста что я вас правильно понял. Я могу сгенерировать файл, необходимый для получения файла активации и использовать второй на любом из серверов веб-фермы? BPM'online будет активирована на целом кластере?

Спасибо.

Владимир,

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

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

Сегодня импортировали лицензии на кластер и столкнулись с проблемой. Сейчас у нас веб ферма состоит из двух нод. Для тестирования я захожу на каждую из них напрямую. Обе предлагают ввести логин и пароль. После этого первая нода пропускает на веб сайт и позволяет с ним работать, а вторая остается на месте. Google Chrome, которым я пользуюсь показывает 1 предупреждение и 3 ошибки.

В прикрепленном файле находится вывод из консоли Google Chrome. Предупреждение в первой строке, а ошибки в строках 2, 3 и 102.

Скажите пожалуйста возможно кто-то сталкивался с такой проблемой и как ее исправить?

Спасибо.

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

Вероятнее всего, проблема не в лицензировании БД, а в настройках сайта/веб-сервера. Для детального анализа вопроса необходимо направить подробное описание вопроса на support@terrasoft.ru

У меня такой же вопрос.
Я поднял тестовый сервер, и взял лицензию которую генерили для работающего сервера. Лицензия загрузил, без ошибок, все появилось. Проделал очистку базы данных Redis, но все равно при вводе заново логина и пароля, выводится ошибка лицензии.
Что я делаю не так ? Мне надо перегенерировать лицензию для тестового сервера ?

У меня похожий вопрос.
Могу ли я лицензию выписанную на одном сервере, использовать для другого в тестовых целях?
Я загрузил файл лицензии на тестовый сервер без ошибок, но при следующем входе все равно вылетает ошибка лицензий и предлагает перейти к конфигурированию лицензий.

Очистку базы данных сессий на сервере Redis делал.

Насколько мне известно, для того чтобы тестовое приложение работало под лицензией рабочего приложения, они должны использовать один и тот же сервер БД. Разные базы, конечно, но сервер один

Показать все комментарии
real_estate
OLX
резервное копирование
7.x

Доброго времени суток.
Собственно 2 вопроса:
1. Real Estate доступен только в облаке. Резервируеться ли база клиента. Если да, то как можно получить доступ к файлам?
2. Можно ли выставлять и забирать объявления с olx.ua? Можно ли настроить трекинг по свом объявлениям на olx?

Нравится

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

Добрый день, Ярослав!

1. Каждую ночь создается резервная копия баз данных наших клиентов (ориентировочно в период с 00:00 до 03:00). Также, есть возможность запустить резервное копирование базы в любой момент времени обратившись с службу поддержки (например, если Вы собираетесь внести какие-либо исправления/изменения, которые могут повлиять на всю систему и опасаетесь негативных последствий). Бинарные файлы сайта и сама база данных может быть предоставлена пользователю, также по запросу в службу поддержки. Сама работа с системой, конфигурацией, базой возможна и без прямого доступа через раздел "Конфигурация".
2. Система по умолчанию интегрируется только с агрегатором zipal.ru, а он уже в свою очередь публикует объявления на более чем на 150 сайтах. С полным списком сайтов, на которых возможна публикация можно ознакомится здесь: https://zipal.ru/sites

"Адасюк Валерий Викторович" написал:

Добрый день, Ярослав!

1. Каждую ночь создается резервная копия баз данных наших клиентов (ориентировочно в период с 00:00 до 03:00). Также, есть возможность запустить резервное копирование базы в любой момент времени обратившись с службу поддержки (например, если Вы собираетесь внести какие-либо исправления/изменения, которые могут повлиять на всю систему и опасаетесь негативных последствий). Бинарные файлы сайта и сама база данных может быть предоставлена пользователю, также по запросу в службу поддержки. Сама работа с системой, конфигурацией, базой возможна и без прямого доступа через раздел "Конфигурация".

2. Система по умолчанию интегрируется только с агрегатором zipal.ru, а он уже в свою очередь публикует объявления на более чем на 150 сайтах. С полным списком сайтов, на которых возможна публикация можно ознакомится здесь: https://zipal.ru/sites


Спасибо за ответ.
А интеграция с Украинскими площадками недвижимости есть? Или хотябы опыт партнеров по связке?

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

"Адасюк Валерий Викторович" написал:

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


можно будет связатся как-то с этим партнером или посмотреть решение? На данный момент интерено связать с OLX і dom.ria

Смотреть чужой сайт, как это сделано, вряд-ли кто-то даст. На сколько знаю подобные реализации делались уже партнером Террасофта - компанией "Consimple" Ну а если делать самому, то просто через API, пример уже есть в коробке - это zipal/ И в документации для разработчиков использовать информацию по интеграции

"Мотков Илья" написал:

Смотреть чужой сайт, как это сделано, вряд-ли кто-то даст. На сколько знаю подобные реализации делались уже партнером Террасофта - компанией "Consimple" Ну а если делать самому, то просто через API, пример уже есть в коробке - это zipal/ И в документации для разработчиков использовать информацию по интеграции


спасибо. будем смотреть

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