Приветствую, коллеги!
Запускается макрос по такой схеме:
- БП по таймеру
- Подпроцесс
- ScriptTask
- ReportService
- GenerateMSWordReport
- Макрос : IExpressionConverter
В макросе надо esq запрос выполнить, пытаюсь получить UserConnection:
- HttpContext.Current.Session["UserConnection"] не работает ибо HttpContext.Current == null
- Get("UserConnection") - нет метода Get
- context.UserConnection - нет context в объявленных
- UserConnection - не переменная, а тип
Как же все таки исхитриццо с UserConnection для esq? можно без него запрос сделать?
Нравится
Зверев Александр,
перед тем, как я посмотрел тот последний ответ, все заканчивалось как раз на пункте 4
Зверев Александр,
а теперь до пункта 7 добирается и в методе Evaluate на строке с получением UserConnection ломает процесс
Зверев Александр,
Теперь надо создать топик "Как получить SystemUserConnection в макросе?"
Попробуйте (HttpContext.Current.Application["AppConnection"] as AppConnection).SystemUserConnection.
Зверев Александр,
не работает, ибо
HttpContext.Current равно null
в каком месте можно глянуть, как инициализируется UserConnection, который берется из Get<UserConnection>(“UserConnection”) или context.UserConnecrion для БП?
В примере макроса вообще есть получение UserConnection и HttpContext.Current там не null:
_userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
Зверев Александр,
ну я же схему объяснил, печатная форма делается в БП, запускаемом по таймеру
A HttpContext.Current.Session[“UserConnection”] работает только при запуске через сервис
Если иначе никак, можно работать через OData, как во стороннем приложении.
Капец как сложно, мне всего то надо если ИПешник, ИНН без КПП выводить и запятой лишней не было :)
Формируйте нужный текст в каком-то поле контакта или контрагента, затем выводите в отчёте стандартными средствами, безо всяких макросов.
Решил - переписал:
1) ExpressionConverterHelper, что бы конструктор принимал параметр типа UserConnection и присваивал его аналогичного типа свойству и в методе GetValue
var expressionConverter = (IExpressionConverter)Activator.CreateInstance(expressionConverterClass); if (expressionConverter != null) { macrosValue.Data = expressionConverter.Evaluate(value, macrosElement.Argument); }
поменял на
dynamic expressionConverter = Activator.CreateInstance(expressionConverterClass); if (expressionConverter != null) { PropertyInfo propertyInfo = expressionConverter.GetType().GetProperty("UserConnection"); if (propertyInfo != null) { propertyInfo.SetValue(expressionConverter, UserConnection, null); } macrosValue.Data = expressionConverter.Evaluate(value, macrosElement.Argument); }
2) в классе ReportService меняем строку
var expressionConverterHelper = new ExpressionConverterHelper();
на
var expressionConverterHelper = new ZLExpressionConverterHelper(UserConnection);
3) в макросе в начале пишем:
private UserConnection _userConnection; public UserConnection UserConnection { get { if (_userConnection == null) { _userConnection = (UserConnection)HttpContext.Current?.Session["UserConnection"]; }; return _userConnection; } set => _userConnection = value; }
потом пользуем UserConnection