Неоднократно задавал тут вопрос: возможно ли применить функционал расширенного фильтра к объекту "справочник".

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

на самом деле мне удалось этого добиться, правда не совсем стандартным способом...

  1. Создал раздел внутренними механизмами BPM
  2. Дропнул тейбл раздела в БД
  3. Создал представление (с inner join из 2 таблиц) с таким же названием в БД из п.2.
  4. Внес изменения в объект в БПМ - создал columns точь-в-точь как в представлении + установил признак "представление БД" (!)
  5. Закастомил страницу реестра.

Правда теперь не понимаю может ли эти изменения как-то негативно повлиять на работу приложения в целом?

Нравится

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

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

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

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

По поводу негативного влияния, всё зависит от кода view. Если он содержит ошибки или при наложении каких-то фильтров получится очень тяжёлый запрос на выборку, то база может «задуматься».

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

ключевое слово - расширенный фильтр.

К справочнику его не применить.

Соответственно создал раздел, (руками его создавать - неблагодарное дело). А уже потом ахалай-махалай с Vw...

Случайно обнаружил: подобное действие с разделом привело к ошибке (см. принт-скрин).

  УРЛ https://[url_app]/0/ServiceModel/EntityDataService.svc/ для меня крайне важен...

Значит, у нового раздела на основе view получилось совпадающее с существующим значение названия или чего-подобного. В результате при попытке системы построить список объектов, доступных по OData натыкается на пару дублей и не может однозначно выбрать.

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

Добрый день, подскажите пожалуйста как исправить ошибку , развернул приложение на сервере указал строку подключения в connectionstrings настроил web.config файл, при запуске приложения появляется ошибка 

"Could not load file or assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. Не удается найти указанный файл" 

Изображение удалено.

Нравится

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

Очень похоже, что данная ошибка связана с работой Microsoft .NET Framework.

Проверьте, какая версия .NET Framework установлена на этом сервере. Согласно документации на Академии версия Microsoft .NET Framework 4.7 и выше используется для версий bpm’online 7.11.1 - 7.13.1; Microsoft .NET Framework 4.7.2 — для версий bpm’online 7.13.2 и выше. Так как у Вас версия bpm'online 7.10, то, возможно, Вам подойдет .NET Framework 4.6.

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

Очень похоже, что данная ошибка связана с работой Microsoft .NET Framework.

Проверьте, какая версия .NET Framework установлена на этом сервере. Согласно документации на Академии версия Microsoft .NET Framework 4.7 и выше используется для версий bpm’online 7.11.1 - 7.13.1; Microsoft .NET Framework 4.7.2 — для версий bpm’online 7.13.2 и выше. Так как у Вас версия bpm'online 7.10, то, возможно, Вам подойдет .NET Framework 4.6.

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

Добрый день,Дмитрий! По тексту ошибки можно предположить что серверу не удается найти библиотеку .NETStandard. Проверьте еще раз обязательные компоненты Windows по инструкции.

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

Реализовал несколько методов, которые используют API BPM. Все отлично работает от имени пользователя Supervisor, но от любого другого пользователя, с аналогичными правами, сервер возвращает error: "Удаленный сервер возвратил ошибку: (401) Несанкционированный."

Помогите понять в чем косяк...

Нравится

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

У пользователя не хватает прав на работу через OData. Где добавить права, см. тут.

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

добавил... не помогло.

Значит, добавили не всюду, где надо. Там несколько пунктов.

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

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

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

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

такая же ошибка с доступом и к разделу "Обращения" - можно предположить, что дело совсем не в кастомном справочнике...

Значит, второй пользователь не совсем администратор, каких-то прав у него нет.

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

Григорий Чех,

ничего не помогло...

Григорий Чех,

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

В при обращении к другим объектам все работает успешно от пользователей из группы сис. админов.

...к сожалению так и не смог выявить в чем именно проблема.

Перераздайте права на ваш кастомный справочник

например через это приложение

Григорий Чех,

Заработало! Дело не в правах.

Пересоздал справочник: на странице редактирования любого раздела (я в контактах делал) создал поле с типом справочник и сохранил схему.

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

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

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

Столкнулся со странной ситуацией. Обратился к ТС, но все же решил и тут задать свой вопрос:

При реализации очередной кастомизации необходимо было выполнить запрос EntitySchemaQuery:

    

    var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager.GetInstanceByName("ServiceEngineer"));

    var colId = esq.AddColumn(esq.CreateAggregationFunction(AggregationTypeStrict.Count, "Id"));

    var esqFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "ServiceItem", serviseId);

    esq.Filters.Add(esqFilter);

    result = esq.GetSelectQuery(UserConnection).GetSqlText();

    return result;

Реализовывал с использованием ServiceHelper, где для анализа данных реализовал два метода: GET и POST.

Странность заключается в том, что исходный код у данных методов одинаков, а результат разный (см. аттач GET.png и POST.png)

Изображение удалено.

Изображение удалено.

Нравится

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

Вероятно, дело не в GET и POST, а в том, что второй раз запускается под пользователем, у которого нет прав на таблицу ServiceEngineer. См. тут или тут.

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

Коллеги, подскажите есть ли в EntitySchemaQuery аналог Select COUNT (*)

Нравится

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

Добрый день!

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

new Select(UserConnection).Column(Func.Count(Column.Asterisk())).From("Account")

Если необходимо именно esq, то примерно так

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager.GetInstanceByName("Account"));
esq.AddColumn(esq.CreateAggregationFunction(AggregationTypeStrict.Count, "Id"));

Во втором варианте будет конечно не select count(*), а select count(Id), но, думаю, нужный эффект будет достигнут.

 

Ну и на всякий случай клиент

var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
	rootSchemaName: "Account"
});
esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, 'CountRows');

 

Добрый день!

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

new Select(UserConnection).Column(Func.Count(Column.Asterisk())).From("Account")

Если необходимо именно esq, то примерно так

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager.GetInstanceByName("Account"));
esq.AddColumn(esq.CreateAggregationFunction(AggregationTypeStrict.Count, "Id"));

Во втором варианте будет конечно не select count(*), а select count(Id), но, думаю, нужный эффект будет достигнут.

 

Ну и на всякий случай клиент

var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
	rootSchemaName: "Account"
});
esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, 'CountRows');

 

Лопатин Константин Николаевич,

Уточню:

Речь идет о запросе на сервере.

Сам запрос выглядит так:

Select COUNT (*) as CountServiceEngineers 

FROM [dbo].[ServiceEngineer] as [ServiceEngineer]

LEFT OUTER JOIN [dbo].[ServiceItem] as [ServiceItem] on [ServiceItem].id = [ServiceEngineer].[ServiceItemId]

Where [ServiceItem].Id = '9ac3a38b-fd9f-4802-b9d7-a3bcb28f8e96'

Во втором примере выше приведен именно серверный ESQ, о котором спрашиваете. Останется только наложить фильтр, как обычно.

Кстати, в приведенном запросе даже JOIN не нужен, поскольку ServiceItemId есть прямо в ServiceEngineer.

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

Добрый день.

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

record.changeProperty("ColumnName", {
    isValid: {
        value: isValid,
        message: columnMessage
    }
});

Но из-за того, что поле является обязательным эта проверка перекрывается базовым правилом обязательности поля, которое добавляется автоматически. 

Есть возможность как-то решить данную проблему, желательно не модифицируя сам объект.

Нравится

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

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

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

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

У своего правила можно задать position, чтобы выполнялось после других.

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

Привет!

 

Подскажите как в схеме с типом "Исходный код" прочитать значение ключа, добавленного мной в web.config в раздел appSettings?

<appSettings>
    <add key="MyKey" value="MyValue" />
</appSettings>

 

Нравится

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

Попробуйте при помощи WebConfigurationManager.AppSettings или ConfigurationManager.AppSettings. Например, в схеме LDAPUtilities есть:

var timeout = WebConfigurationManager.AppSettings["RequestTimeout"];

 

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

да, 

WebConfigurationManager.AppSettings работает

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

Добрый день!

Необходимо добавить раздел на контрагенты на портал.

Попробовал добавить раздел в рабочее место, он не отобразился. Попробовал добавлять с помощью sql скриптов. Есть у кого-нибудь актуальная документация по добавлению раздела на портал?

Нравится

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

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

С 7.13.2 добавили возможность создавать портальные разделы пользовательскими средствами в мастере разделов.

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

Добрый день коллеги, подскажите как добавить действие в cti панель звонков, к существующим действиям необходимо добавить создать лид из звонка

Прикрепленные файлы

Нравится

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

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

Также такая функция встроена в одну из интеграций с телефонией.

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

Добрый день!



Имеется унаследованная от "базовой схемы детали средств связи" деталь. Внутрь детали рядом с самим средством связи вставлены создаваемые вручную контейнеры (Terrasoft.Container) с чекбоксами (Terrasoft.CheckBoxEdit).

Задача: при полной отрисовки детали блокировать все чекбоксы кроме одного выбранного, если он есть, иначе не блокировать ничего. Решаю с помощью jquery на странице раздела. Т.к. не знаю, как поймать событие полной отрисовки детали (чтобы получить доступ к DOM), использую костыль в виде setTimeout. Как это событие можно отловить? 

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



Возможно есть какой-то способ решения этой задачи кроме jQuery?

Нравится

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

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

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

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