Вопрос

Добрый день, подскажите пожалуйста как исправить ошибку , развернул приложение на сервере указал строку подключения в 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.

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

Добрый день,Дмитрий! По тексту ошибки можно предположить что серверу не удается найти библиотеку .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, он срабатывает после полной отрисовки модуля стоит посмотреть в его сторону

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

Есть такой метод:

addRecords: function(detailColumnName, segmentName, isEditableSegment) {
            var masterId = this.get("MasterRecordId");
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: this.entitySchemaName
            });
            esq.addColumn(segmentName);
            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));
            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));
            esq.getEntityCollection(function(result) {
                var existsContactsCollection = [];
                if (result.success) {
                    result.collection.each(function(item) {
                        existsContactsCollection.push(item.get(segmentName).value);
                    });
                }
                var config = {
                    entitySchemaName: segmentName,
                    multiSelect: true,
                    columns: ["Type"]
                };
                
                var isAccount;
                if (segmentName === "Account") {
                    config.filters = Ext.create("Terrasoft.FilterGroup");
                    config.filters.add("first", Terrasoft.createColumnFilterWithParameter(
                        Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));
                    isAccount = true;
                }
                if (existsContactsCollection.length > 0) {

                    var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsContactsCollection);
                    existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;

                    existsFilter.Name = "existsFilter";
                    if (isAccount) {
                        config.filters.add("second", existsFilter);
                    } else {
                        config.filters = existsFilter;
                    }
                }
                this.openLookup(config, function(config) {
                    methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);
                }, this);
            }, this);
        },
где detailColumnName = "Campaing",
segmentName = "Product",
entitySchemaName = "ProductUsage"

В ProductUsage есть идентификатор родительского объекта (Campaing) и идентификатор продукта (Product)

Он нужен для того, чтобы лукап выводил только те записи, которых нет в детали для этого объекта и отрабатывает корректно, но вот когда на детали больше записей, чем 2100, БД SQL выдает ошибку, что конструкция IN принимает максимум 2100 параметров, поэтому я решил переделать запрос под конструкцию NotExists.

Изменил этот метод с фильтрами на следующий:

addNotExistsRecords: function(detailColumnName, segmentName, isEditableSegment) {
            var masterId = this.get("MasterRecordId");
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: this.entitySchemaName
            });
            esq.addColumn(segmentName);
            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));
            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));
            esq.filters.add("isEqualsTo", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "Product.Id", "ProductId"));
                
            var config = {
                entitySchemaName: segmentName,
                multiSelect: true,
                columns: ["Type"]
            };
            
            var isAccount;
            if (segmentName === "Account") {
                config.filters = Ext.create("Terrasoft.FilterGroup");
                config.filters.add("first", Terrasoft.createColumnFilterWithParameter(
                    Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));
                isAccount = true;
            }
            
            var existsFilter = Terrasoft.createNotExistsFilter("Id", esq);
            existsFilter.Name = "existsFilter";
            if (isAccount) {
                config.filters.add("second", existsFilter);
            } else {
                config.filters = existsFilter;
            }
            
            this.openLookup(config, function(config) {
                methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);
            }, this);
        },

 

Однако при выполнении происходит ошибка errorCode: "NotSupportedException", message: "None", stackTrace: undefined, errors: Array(0)
Где я ошибся при построении фильтров?

По сути нужно повторить такой запрос:

select Id from Product where NOT EXISTS(select Id from ProductUsage where CampaignId = 'f39db115-d2f4-4936-b415-bf6543187463' AND IsDeleted = 'false' AND Product.Id = ProductId)
 

У меня такой же вопрос

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

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

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

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

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

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