Как в SelectQuery добавить фильтр Greater на колонку CreatedOn

Нравится

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

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

А где нужно на сервере или на клиенте?

c# esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Greater, "CreatedOn", ТвояДата));

js filterGroup.add("Sort", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.GREATER, "CreatedOn", "ТвояДата"));

На всякий случай еще есть GREATER_OR_EQUAL

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

Установила приложение

https://marketplace.terrasoft.ru/template/raschet-rabochih-dney-v-biznes-processah 

 

не работает 

нет Действие процесса 'Добавить рабочие дни'

нет Действие процесса 'Получить количество рабочих дней'

 

как настроить данное приложение? 

Нравится

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

Добрый день!

Уточните, пожалуйста, продукт и версию Creatio, а также в каком пакете выполняете настройку бизнес-процесса - в пакете Custom или в своем пользовательском пакете?

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

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

 

Такой вопрос: Я создаю несколько справочников, они должны хранить в своих полях id других справочников. Как мне реализовать эту связь в "Управление конфигурацией"? И как мне правильно их связать?

Нравится

1 комментарий
Лучший ответ

Добрый день! Пример данной реализации можете посмотреть, например, в объекте LeadProduct.

Справочник основан на объекте. Чтобы добавить в него связь с другими справочниками (=объектами) найдите объект справочника и добавьте туда поле с типом "Справочник" и укажите название справочника, связь с которым необходимо добавить, при необходимости выполнив замещение объекта в пользовательском пакете (подробнее читайте в академии)

Добрый день! Пример данной реализации можете посмотреть, например, в объекте LeadProduct.

Справочник основан на объекте. Чтобы добавить в него связь с другими справочниками (=объектами) найдите объект справочника и добавьте туда поле с типом "Справочник" и укажите название справочника, связь с которым необходимо добавить, при необходимости выполнив замещение объекта в пользовательском пакете (подробнее читайте в академии)

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

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

Нравится

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

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

 

Для генерации файлов используется библиотека DocumentFormat.OpenXml. Теоретически, так можно сгенерировать и макрос, хотя проще вручную создать его в файле-шаблоне, который потом загрузить в систему.

 

Но макрос можно запустить только уже при открытии в самом Excel.

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

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

макросом я называю код который содержится в Excell файле .

да -Бейсик, Александр - Есть пример ? Может подскажите решение.

Мы купили систему 2 месяца назад, так что простите за может элементарные вещи. Задача - необходимо сформировать отчет в котором много расчетных полей сложение, проценты и тд. пробовал реализовать на фастрепорт и ворд - не то, при формировании в ворде необходимо создавать расчетные поля, поля создаются в таблице это ни к чему , ранее решал аналогичные задачи - передается из ПО курсор (сформировнаная таблица) и в сохраненном шаблоне  Excel  запускается курсор, все преобразования и красота реализуются уже  в excele , что-то подобного нет ? какой путь порекомендуете?

Попробуйте сторонние дополнения для выгрузки в Excel из маркета. Например, Excel reports builder или Advanced excel reports. В них заявлено использование шаблона файла с форматированием и формулами. Наверное, и макросами.

посмотрел, все отлично. спасибо, но не то.

Отвечаю на изначальный вопрос: нет, запускать макрос на Бейсике в момент генерации печатной формы нельзя. Производите все расчёты на уровне логики в системе, либо настроенными в ячейках Excel-файла шаблона формулами.

Спасибо

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

Добрый день! Подскажите пожалуйста, как построить график плановой кривой в разделе "Итоги"? Какие необходимы данные для этого и можно ли вообще реализовать данный функционал?

Пример прикреплен в картинке:Изображение удалено.

Нравится

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

Андрей, а где у вас хранится информация о плане? В разделе Планирование?

В общем, при первом приближении я бы попробовал взять данные из объекта Планирование (надо смотреть как там это хранится), либо сделал бы View на основе опять же Планирования и выводил это на график как отдельную серия с типом линия.

Сидоров Александр Валерьевич,

Вся информация будет храниться там, да

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

 

По поводу данных, в новых версиях уже используется не общий объект «Планирование», а отдельные: «Планирование по контрагенту», «Планирование по ответственному» и др. Смотрите объекты, входящие в пакет CoreForecast.

 

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

 

А вообще, в разделе планирования уже настроены итоги:

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

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

Добрый день!

 

После обновления на 7.16.1 сделал копию из продакшн базы в разработческую, в разработческой доработал пакет, выгрузил, загружаю в продакшн, получаю:

2020-08-05 17:24:21,283 Загрузка файла: ZL.Root.zip 100%
2020-08-05 17:24:21,330 Началось резервное копирование конфигурации.
2020-08-05 17:24:21,330 Загрузка пакетов из архива
2020-08-05 17:24:21,346 Пакет "ZL.Root" загружен
2020-08-05 17:24:21,346 Загрузка пакетов из базы данных
2020-08-05 17:24:21,853 System.ApplicationException: Невозможно установить пакет из zip-архива в то время как существует SVN-пакет с таким же UId.
   в Terrasoft.Core.AppInstallation.Packages.Backup.ZipPackageBackupManager.SaveBackup(IList`1 composedPackages, String backupPath, String code)
   в Terrasoft.Core.ServiceModelContract.PackageInstaller.PackageInstallerServiceInternal.<>c__DisplayClass25_0.<CreateBackup>b__0()
   в Terrasoft.Core.ServiceModelContract.PackageInstaller.BaseInstallerServiceInternal.InvokeWithLogging(Action action)

Как сие явление побороть?

Нравится

2 комментария
Лучший ответ

Здравствуйте! Ваш пакет  на продакшене - ZL.Root привязан к SVN для этого Вам необходимо выполнить несколько SQL запросов:

Отвязка пакета от репозитория

UPDATE SysPackage 
SET 
    [SysRepositoryId] = null
WHERE  [Name]= 'ZL.Root'

 

Блокирование пакта(+ задаем ему признак установленный):

 

update SysPackage
set IsChanged = 0, InstallType = 1, IsLocked = 0, Maintainer = 'Customer'
where Name in ('ZL.Root')

После этих манипуляций должно нормально устанавливаться

Здравствуйте! Ваш пакет  на продакшене - ZL.Root привязан к SVN для этого Вам необходимо выполнить несколько SQL запросов:

Отвязка пакета от репозитория

UPDATE SysPackage 
SET 
    [SysRepositoryId] = null
WHERE  [Name]= 'ZL.Root'

 

Блокирование пакта(+ задаем ему признак установленный):

 

update SysPackage
set IsChanged = 0, InstallType = 1, IsLocked = 0, Maintainer = 'Customer'
where Name in ('ZL.Root')

После этих манипуляций должно нормально устанавливаться

Нигрескул Алексей,

Сработало, спасибо!

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

Здравсвуйте! Есть некоторая проблема с написанным мной исходным кодом.

При запуске Бизнес-процесса при получении сигнала от объекта или таймера, где в задании сценарии вызывается вебсервис и метод без передачи параметров(плюс вдобавок это метод void), вызывается такая ошибка:

System.ServiceModel.ServiceActivationException: Set AspNetCompatibilityEnabled true

   в Terrasoft.Web.Common.BaseService.get_UserConnection()

   в Terrasoft.Configuration.WebService1C.UpdatesBankNameAndAdresAll()

   в Terrasoft.Core.Process.qrtProcess_f3c9148MethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)

   в Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)

   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

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

Нравится

5 комментариев
Лучший ответ

Возможно не передается UserConnection, добавь в БП

var userConnection = Get<UserConnection>("UserConnection");

WebService1C service = new WebService1C(userConnection);

 

а, в схему добавь:

public UserConnection UserConnection {

            get;

            private set;

        }

        

        public WebService1C(UserConnection userConnection) {

            UserConnection = userConnection;

        }

Вызываю вебсервис и метод так:

WebService1C service = new WebService1C();

service.UpdatesBankNameAndAdresAll();

return true;

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

Также когда вебсервис и метод вызывается в коде джаваскрипта при помощи SrrviceHelper, тоже все работает нормально.

Вот код метода:

[OperationContract]

        [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Wrapped,

            RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]

        public void UpdatesBankNameAndAdresAll() {

            

            string guid1cBank = "";

            Guid id = new Guid();

            

            var esqBank = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "AccountBillingInfo");

            esqBank.AddAllSchemaColumns();

            var banks = esqBank.GetEntityCollection(UserConnection);

            foreach (var bankItem in banks) {

                guid1cBank = bankItem.GetTypedColumnValue<string>("qrtGuid1cBank");

                id = bankItem.GetTypedColumnValue<Guid>("Id");

                if(guid1cBank != String.Empty){

                    UpdatesBankNameAndAdresOne(id);

                }

            }

        }

Возможно не передается UserConnection, добавь в БП

var userConnection = Get<UserConnection>("UserConnection");

WebService1C service = new WebService1C(userConnection);

 

а, в схему добавь:

public UserConnection UserConnection {

            get;

            private set;

        }

        

        public WebService1C(UserConnection userConnection) {

            UserConnection = userConnection;

        }

Да, вы правы, но частично

Вот что надо добавить в веб-сервис, чтобы можно было его использовать(вызывать в коде Js и БП) нормально:

 

    public WebService1C() {}

        

        public WebService1C(UserConnection userConnection) {

            this._userConnection = userConnection;

        }

        

        private UserConnection _userConnection;

        protected UserConnection UserConnection {

            get {

                if (_userConnection != null) {

                    return _userConnection;

                }

                _userConnection = CurrentHttpContext.Session ["UserConnection"] as UserConnection;

                if (_userConnection != null) {

                    return _userConnection;

                }

                var appConnection = (AppConnection)CurrentHttpContext.Application ["AppConnection"];

                _userConnection = appConnection.SystemUserConnection;

                return _userConnection;

            }

        }

        

        private HttpContextBase _httpContext;

        protected virtual HttpContextBase CurrentHttpContext {

            get { return _httpContext ?? (_httpContext = new HttpContextWrapper (HttpContext.Current)); }

            set { _httpContext = value; }

        }

 

в Using прописано это:

 

using System;

    using System.Configuration;

    using System.ServiceModel;

    using System.ServiceModel.Web;

    using System.ServiceModel.Activation;

    using Terrasoft.Common;

    using Terrasoft.Core;

    using Terrasoft.Core.Entities;

    using Terrasoft.Web.Common;

    using System.Collections.Generic;

    using System.IO;

    using System.Linq;

    using System.Net;

    using System.Text;

    using System.Threading.Tasks;

    using System.Web;

    using System.Collections.ObjectModel;

    using System.Data;

    using Newtonsoft.Json;

    using Terrasoft.Core.DB;

    using System.Runtime.Serialization;

Атюкин Егор Эдуардович,

прочитайте про веб сервисы здесь 

Описанное Вами выше поведение говорит о том, что если процесс минует пользователя, то UserConnection отсутствует в текущем контексте

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

Делаю отчет в FastReport по аналогии со статьей в Академии. 

https://academy.terrasoft.ru/documents/technic-sdk/7-16/primer-nastroyki-otcheta



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

Источники данных.

{
    "ProviderName": "MortgageConclusionDataProvider",
    "Schemas": {
        "MortgageConclusionData": {
            "GroupName": {"DataValueType": 1},
            "Account": {"DataValueType": 1},
            "PreparationDate": {"DataValueType": 7},
            "ConclusionType": {"DataValueType": 1}
        },
        "LevelSecurityData": {
            "MortgageConclusion": {"DataValueType": 0},
            "SublimitTypes": {"DataValueType": 0},
            "NameSublimitTypes": {"DataValueType": 1},
            "Groupe": {"DataValueType": 1},
            "TargetUse": {"DataValueType": 1},
            "AmountLimit": {"DataValueType": 5}
        },
        "LocalizableStrings": {
            "ReportTitle": {"DataValueType": 1},
            ...
        }
    }
}



В сервисе прописываю логику:

 

public Task<ReportDataDictionary> GetData(UserConnection userConnection, IReadOnlyDictionary<string, object> parameters) {
            var filter = ExtractFilterFromParameters(userConnection, _entitySchemaUId, parameters);
            var result = new ReportDataDictionary {
                // Заполнить колонки в отчете.
                ["MortgageConclusionData"] = GetMortgageConclusionData(userConnection, _entitySchemaUId, filter),
                ["LevelSecurityData"] = GetLevelSecurityData(userConnection, _entityLevelSecuritySchemaUId),
                ["LocalizableStrings"] = GetLocalizableStrings(userConnection)
            };
            return Task.FromResult(result);
        }

И при формировании отчета ошибка 

 Error while sending request 

    response status: 500 (Internal Server Error)

    request url: ...FastReportService/CreateReport

    method: POST

    request data: {"reportTemplateId":"a1c1f160-a7c2-56a0-edcb-1101dde5a74e","reportCaption":"Заключение","reportSchemaName":"MortgageConclusion","report...

Через Profiler запросы сформировались, данные есть.

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

Спасибо!

Нравится

6 комментариев
Лучший ответ

Судя по сообщению из логов, второе исключение происходит в схеме FastReportService, в функции:

[Obsolete("7.15.3")]
[OperationContract]
[WebGet(UriTemplate = "GetReportFile/{key}")]
public Stream GetReportFile(string key) {
	var data = PopFromSessionData(key);
	string contentDisposition = "attachment; filename*=UTF-8''" + data.Key;
	var reportStream = new MemoryStream(data.Value);
	WebResponseProcessor.AssignFileResponseContent(HttpContextAccessor.GetInstance(), "application/pdf; charset=UTF-8", reportStream.Length, contentDisposition);
	return reportStream;
}
 
private KeyValuePair&lt;string, byte[]&gt; PopFromSessionData(string sessionKey) {
	var data = (KeyValuePair&lt;string, byte[]&gt;)UserConnection.SessionData[sessionKey];
	UserConnection.SessionData.Remove(sessionKey);
	return data;
}

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

[Obsolete("7.15.3")]
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
public string CreateReport(Guid reportTemplateId, string reportCaption, string reportSchemaName, string reportFilters) {
	try {
		var reportParameters = new Dictionary&lt;string, object&gt; {
			["EsqFilters"] = new Dictionary&lt;string, Filters&gt; {
				[reportSchemaName] = JsonConvert.DeserializeObject&lt;Filters&gt;(reportFilters)
			}
		};
		var reportBytes = InternalCreateReport(reportTemplateId, reportParameters);
		return PushToSessionData(new KeyValuePair&lt;string, byte[]&gt;($"{HttpUtility.UrlPathEncode(reportCaption)}.pdf", reportBytes));
	} catch (Exception exception) {
		throw new WebFaultException&lt;FastReportGenerationException&gt;(
			new FastReportGenerationException(exception),
			HttpStatusCode.InternalServerError);
	}
}

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

 

А у Вас response status: 500 только на конкретном отчёте, который разрабатываете, на остальных нормально?

 

По поводу примеров, кроме описанного в академии, в системе есть ещё стандартные «Знаменательные события контакта» и «Полнота наполнения данными». В первом — несколько источников и схема ContactAnniversariesReportDataProvider, в ней интересующая Вас функция:

public Task&lt;ReportDataDictionary&gt; GetData(UserConnection userConnection,
    IReadOnlyDictionary&lt;string, object&gt; parameters) {
    var contactFilter = ExtractFilterFromParameters(userConnection, _contactEntitySchemaUId, parameters);
    var result = new ReportDataDictionary {
        ["Contact"] = GetContactData(userConnection, _contactEntitySchemaUId, contactFilter),
        ["ContactAnniversary"] = GetContactAnniversaryData(userConnection, _contactAnniversaryEntitySchemaUId,
            contactFilter),
        ["LocalizableStrings"] = GetLocalizableStrings(userConnection)
    };
    return Task.FromResult(result);
}

 Но обратите внимание, выше в коде есть сами функции GetContactData и GetContactAnniversaryData, получающие из базы коллекцию данных с указанным фильтром.

Елена, ошибка 500 происходит на сервере, то есть в логах должна быть более подробная информация, где именно в коде она возникает.

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

2020-08-05 18:06:11,849 [192] ERROR  Terrasoft.Web.Common.ServiceModel.ErrorHandler ProvideFault - Internal Server Error
System.ServiceModel.Web.WebFaultException`1[Terrasoft.Configuration.Reporting.FastReport.FastReportGenerationException]: Internal Server Error (Дополнительные сведения об ошибке — Terrasoft.Configuration.Reporting.FastReport.FastReportGenerationException: Error during report generation).
2020-08-05 18:06:11,864 [192] ERROR  Terrasoft.WebApp.FileWebEventProvider RaiseInternal - Date: 05.08.2020 18:06:11
Date (UTC): 05.08.2020 15:06:11
 
Exception Message: Internal Server Error
Exception Type: System.ServiceModel.Web.WebFaultException`1[Terrasoft.Configuration.Reporting.FastReport.FastReportGenerationException]
Exception Source: Terrasoft.Configuration
 
Exception Stack Trace:
   в Terrasoft.Configuration.Reporting.FastReport.FastReportService.CreateReport(Guid reportTemplateId, String reportCaption, String reportSchemaName, String reportFilters)
   в SyncInvokeCreateReport(Object , Object[] , Object[] )
   в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
   в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
 
SessionID: xxiqbf2pqlqi4uvge2vbjffb
Request URL: /0/rest/FastReportService/CreateReport
Request Path: /0/rest/FastReportService/CreateReport
Request UrlReferrer: http://192.168.222.228:82/0/Nui/ViewModule.aspx
Request Type: POST
User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36
User Host Address: 192.168.10.131
User: Supervisor
Is Authenticated: True
Authentication Type: Forms
Is Secure Connection: False
 
Application Version: 7.16.0.4449
 
Application Virtual Path: /0
Application Trust Level: Full
 
Is Local: False
 
Process ID: 3988
Process Name: w3wp.exe
OS Version: Microsoft Windows NT 10.0.14393.0
Net Framework Version: 4.0.30319.42000
DBExecutor Type: MSSqlExecutor
 
&lt;--&gt;
 
2020-08-05 18:06:11,880 [192] ERROR  Terrasoft.Web.Common.ServiceModel.ErrorHandler HandleError - Internal Server Error
System.ServiceModel.Web.WebFaultException`1[Terrasoft.Configuration.Reporting.FastReport.FastReportGenerationException]: Internal Server Error (Дополнительные сведения об ошибке — Terrasoft.Configuration.Reporting.FastReport.FastReportGenerationException: Error during report generation).
2020-08-05 18:06:11,974 [192] ERROR  Terrasoft.Web.Common.ServiceModel.ErrorHandler ProvideFault - Ссылка на объект не указывает на экземпляр объекта.
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
   в Terrasoft.Configuration.Reporting.FastReport.FastReportService.PopFromSessionData(String sessionKey)
   в Terrasoft.Configuration.Reporting.FastReport.FastReportService.GetReportFile(String key)
   в SyncInvokeGetReportFile(Object , Object[] , Object[] )
   в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
   в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
2020-08-05 18:06:11,974 [192] ERROR  Terrasoft.WebApp.FileWebEventProvider RaiseInternal - Date: 05.08.2020 18:06:11
Date (UTC): 05.08.2020 15:06:11
 
Exception Message: Ссылка на объект не указывает на экземпляр объекта.
Exception Type: System.ServiceModel.FaultException`1[System.NullReferenceException]
Exception Source: 
 
Exception Stack Trace:
 
 
SessionID: xxiqbf2pqlqi4uvge2vbjffb
Request URL: /0/rest/FastReportService/GetReportFile/undefined
Request Path: /0/rest/FastReportService/GetReportFile/undefined
Request Type: GET
User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36
User Host Address: 192.168.10.131
User: Supervisor
Is Authenticated: True
Authentication Type: Forms
Is Secure Connection: False
 
Application Version: 7.16.0.4449
Application Virtual Path: /0
Application Trust Level: Full
Is Local: False
 
Process ID: 3988
Process Name: w3wp.exe
OS Version: Microsoft Windows NT 10.0.14393.0
Net Framework Version: 4.0.30319.42000
DBExecutor Type: MSSqlExecutor
 
&lt;--&gt;
 
2020-08-05 18:06:11,989 [192] ERROR Terrasoft.Web.Common.ServiceModel.ErrorHandler HandleError - Ссылка на объект не указывает на экземпляр объекта.
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
   в Terrasoft.Configuration.Reporting.FastReport.FastReportService.PopFromSessionData(String sessionKey)
   в Terrasoft.Configuration.Reporting.FastReport.FastReportService.GetReportFile(String key)
   в SyncInvokeGetReportFile(Object , Object[] , Object[] )
   в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
   в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

 

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

Куда смотреть, что проверять?)

 

Судя по сообщению из логов, второе исключение происходит в схеме FastReportService, в функции:

[Obsolete("7.15.3")]
[OperationContract]
[WebGet(UriTemplate = "GetReportFile/{key}")]
public Stream GetReportFile(string key) {
	var data = PopFromSessionData(key);
	string contentDisposition = "attachment; filename*=UTF-8''" + data.Key;
	var reportStream = new MemoryStream(data.Value);
	WebResponseProcessor.AssignFileResponseContent(HttpContextAccessor.GetInstance(), "application/pdf; charset=UTF-8", reportStream.Length, contentDisposition);
	return reportStream;
}
 
private KeyValuePair&lt;string, byte[]&gt; PopFromSessionData(string sessionKey) {
	var data = (KeyValuePair&lt;string, byte[]&gt;)UserConnection.SessionData[sessionKey];
	UserConnection.SessionData.Remove(sessionKey);
	return data;
}

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

[Obsolete("7.15.3")]
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
public string CreateReport(Guid reportTemplateId, string reportCaption, string reportSchemaName, string reportFilters) {
	try {
		var reportParameters = new Dictionary&lt;string, object&gt; {
			["EsqFilters"] = new Dictionary&lt;string, Filters&gt; {
				[reportSchemaName] = JsonConvert.DeserializeObject&lt;Filters&gt;(reportFilters)
			}
		};
		var reportBytes = InternalCreateReport(reportTemplateId, reportParameters);
		return PushToSessionData(new KeyValuePair&lt;string, byte[]&gt;($"{HttpUtility.UrlPathEncode(reportCaption)}.pdf", reportBytes));
	} catch (Exception exception) {
		throw new WebFaultException&lt;FastReportGenerationException&gt;(
			new FastReportGenerationException(exception),
			HttpStatusCode.InternalServerError);
	}
}

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

 

А у Вас response status: 500 только на конкретном отчёте, который разрабатываете, на остальных нормально?

 

По поводу примеров, кроме описанного в академии, в системе есть ещё стандартные «Знаменательные события контакта» и «Полнота наполнения данными». В первом — несколько источников и схема ContactAnniversariesReportDataProvider, в ней интересующая Вас функция:

public Task&lt;ReportDataDictionary&gt; GetData(UserConnection userConnection,
    IReadOnlyDictionary&lt;string, object&gt; parameters) {
    var contactFilter = ExtractFilterFromParameters(userConnection, _contactEntitySchemaUId, parameters);
    var result = new ReportDataDictionary {
        ["Contact"] = GetContactData(userConnection, _contactEntitySchemaUId, contactFilter),
        ["ContactAnniversary"] = GetContactAnniversaryData(userConnection, _contactAnniversaryEntitySchemaUId,
            contactFilter),
        ["LocalizableStrings"] = GetLocalizableStrings(userConnection)
    };
    return Task.FromResult(result);
}

 Но обратите внимание, выше в коде есть сами функции GetContactData и GetContactAnniversaryData, получающие из базы коллекцию данных с указанным фильтром.

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

Спасибо за помощь, 

«Знаменательные события контакта» нашла, сделала полностью по аналогии. Та же ошибка.

Ошибка исчезает, как только убираю второй источник данных(

Может быть дело в версии, отчет на 16.1 - наша 16.0...

Если дело в версии, зарегистрируйте тестовый сайт и проверьте такое же там.

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

Здравствуйте! Наблюдается следующая проблема, а именно конфликт библиотек  Google.Apis, в связи с этим не можем реализовать на стороне Ceatio нужный функционал. В академии прочел статью про метод разработки пакет-проект в которой говориться, что данного конфликта быть не должно т.к. пакет является изолированным, однако разработав такой пакет и вызывая его функционал из другого пакета системы конфликт так же остался - https://prnt.sc/truxr1.

Вот ссылка на скачивание разработанного нами пакета(пакет тестовый)- https://drive.google.com/file/d/19YyYJ6rLjEdS7N2HXRNduBw0oOZkdSkA/view?…

функционал вызываем данным образом:

namespace Autobooking.CreatioIntegrationApp

{

    using System;

    using System.Collections.Generic;

    using System.IO;

    using System.Net;

    using System.Threading.Tasks;

    using Terrasoft.Configuration;

    using Terrasoft.Core;

    using Terrasoft.Core.Factories;

    using Terrasoft.Web.Common;

    using SysSettings = Terrasoft.Core.Configuration.SysSettings;

    using WebRequest = System.Net.WebRequest;

    using AutobookingGoogleAnalyticsApi.Interfaces;

    public sealed class CreatioIntegrationAppService : BaseService

    { 

        public CreatioIntegrationAppService(UserConnection userConnection) {

            UserConnection = userConnection;           

        }

 

        public string GetSysSetting(string settingName) {

            return SysSettings.GetValue(UserConnection, settingName, null);

        }

 

 

        public void StartAnalytic() {

                var service = ClassFactory.Get(new ConstructorArgument("userConnection", UserConnection),

                new ConstructorArgument("serviceAccountEmail", "testEmail"),

                new ConstructorArgument("applicationName", "testAppName"), new ConstructorArgument("secretFile", null));

        service.AuthenticateServiceAccount();

        }        

    }

}

Нравится

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

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

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

Александр, по поводу конфликта версий, всё как обычно с библиотеками: им или залить себе ту же версию, что у «в коробке» (более старую), или аргументировать, чтобы обновили «в коробке» до более новой. Если используется не самая новая версия системы, прежде всего попробовать обновить, возможно, в актуальной библиотеку тоже обновили.

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

Коллеги,  подскажите 

хочу деталь в пользовательском разделе привязать к ID раздела (уникальному номеру), но при выборе при привязке детали не вижу ID раздела (в таблице это поле есть) . вопрос - стандартными средствами это выполнить невозможно ? или это глюк

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

Нравится

3 комментария
Лучший ответ

Здравствуйте! Деталь привязывается к разделу при настройке карточки редактирования записи раздела как через мастер раздела так и через Конфигурацию. 

Например:

В моем случае это карточка раздела Страховка - https://prnt.sc/ttpycc, я подвязываю деталь транспортное средство.

Так же прочтите данную статью.

Здравствуйте! Деталь привязывается к разделу при настройке карточки редактирования записи раздела как через мастер раздела так и через Конфигурацию. 

Например:

В моем случае это карточка раздела Страховка - https://prnt.sc/ttpycc, я подвязываю деталь транспортное средство.

Так же прочтите данную статью.

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

Спасибо, все получилось - первые шаги.

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