Привет всем!

 

Столкнулся с проблемкой. 

В Sales есть страница Document:

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

 

Если выбрать файл, кликнуть на троеточие около attachments, то появится контекстное меню, где можно выбрать Change Properties

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

Тогда откроется детали файла.

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

Как можно решить эту проблему?

Нравится

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

Добрый день.

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

Через мастер раздела не получится по простому.

Кисловский Михаил Андреевич пишет:

Добрый день.

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

Через мастер раздела не получится по простому.

А как найти эту карточку?

И можно где-нибудь посмотреть пример? Я не нашел в документации.

 

Кисловский Михаил Андреевич,

А как найти эту карточку?

И можно где-нибудь посмотреть пример? Я не нашел в документации.

Michael Tkachev,

добрый день! просмотрите в FileDetailV2

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

Мне бы пример какой-нибудь. Надо добавить кнопку с выпадающим меню. Меню берется из Lookup-а.

Михаил, если имеете в виду окно, которое открывается по этому пункту меню (с полями «название» и «описание»), то это схема LinkPageV2.

Но карточка общая для файлов всех разделов, а объекты в каждом свои («Файл и ссылка контакта» и др.), то есть, если нужно добавить там справочное поле только для раздела документов, нужно не только добавить поле в объект, но и сделать свою карточку на основе LinkPageV2 с этим полем, а также предусмотреть, чтобы она открывалась вместо стандартной, что прописано в вышеупомянутой Алексеем FileDetailV2. Получается, для конкретного раздела будут свои аналоги и FileDetailV2, и LinkPageV2.

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

Всем привет!

 

https://academy.terrasoft.ru/documents/technic-sdk/7-15/sozdanie-anonimnogo-veb-servisa

В данном пример говориться как создать анонимный веб-сервис, в котором показано как выгребать данные.

Все работает прекрасно. По крайней мере я смогу получить DocumentFile.

Кто-нибудь знает, а если и покажет пример до добавлению, обновлению и удалению подобных объектов?

Нравится

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

{Получение одной записи}

var statusSchema = UserConnection.EntitySchemaManager.GetInstanceByName("OrderStatus");

var newStatus = statusSchema.CreateEntity(UserConnection);

newStatus.FetchFromDB("Name", "4. Completed");

var item = newStatus.GetTypedColumnValue<Guid>("Id");

 

{Изменение}

var schema = UserConnection.EntitySchemaManager.GetInstanceByName("OrderStatus");

var communication = schema.CreateEntity(UserConnection);

communication.FetchFromDB("Name", city);

communication.SetColumnValue("CommunicationTypeId", Guid.Parse(typeId));

communication.SetColumnValue("AccountId", primaryEntityId);

communication.SetColumnValue("Number", number);

communication.Save();

 

{Добавление}

var schema = UserConnection.EntitySchemaManager.GetInstanceByName("OrderStatus");

var communication = schema.CreateEntity(UserConnection);

communication.SetDefColumnValues();

communication.SetColumnValue("CommunicationTypeId", Guid.Parse(typeId));

communication.SetColumnValue("AccountId", primaryEntityId);

communication.SetColumnValue("Number", number);

communication.Save();

 

{Удаление}

EntitySchema accountSchema = UserConnection.EntitySchemaManager.GetInstanceByName("Account");

Entity accountEntity = accountSchema.CreateEntity(UserConnection);

if (accountEntity.FetchFromDB("Name", accountName)) {

    accountEntity.Delete();

}

 

{{Получение колейции c применением фильтра}}

var result = 0.0;

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "OpportunityProductInterest");

string quantity = esq.AddColumn("Quantity").Name;

IEntitySchemaQueryFilterItem opportunityIdFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Opportunity.Account", accountId);

IEntitySchemaQueryFilterItem typesTariffServiceIdFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Product.PsTypesTariffServices", typesTariffServiceId);

esq.Filters.Add(opportunityIdFilter);

esq.Filters.Add(typesTariffServiceIdFilter);

var entities = esq.GetEntityCollection(UserConnection);

if (entities.Count > 0)

{

    result = entities[0].GetTypedColumnValue<int>(quantity);

}

return result;

{{Изменение колейции c применением фильтра}}

var result = "blabla";

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "OpportunityProductInterest");

esq.AddAllSchemaColumns();

string quantity = esq.AddColumn("Quantity").Name;

IEntitySchemaQueryFilterItem opportunityIdFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Opportunity.Account", accountId);

IEntitySchemaQueryFilterItem typesTariffServiceIdFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Product.PsTypesTariffServices", typesTariffServiceId);

esq.Filters.Add(opportunityIdFilter);

esq.Filters.Add(typesTariffServiceIdFilter);

var entities = esq.GetEntityCollection(UserConnection);

if (entities.Count > 0)

{

    foreach(var item in entities)

    {

        item.SetColumnValue("KtRequestId", result);

    }

}

Михаил, для добавления файлов используют FileApiService, примеры работы с ним см. тут. Вы хотите сделать такой же, но анонимный?

 

Что Вы имеете в виду под добавлением, обновлением и удалением объектов? Речь о файлах?

Александр,

Меня интересует API что бы можно было работать через C#.

{Получение одной записи}

var statusSchema = UserConnection.EntitySchemaManager.GetInstanceByName("OrderStatus");

var newStatus = statusSchema.CreateEntity(UserConnection);

newStatus.FetchFromDB("Name", "4. Completed");

var item = newStatus.GetTypedColumnValue<Guid>("Id");

 

{Изменение}

var schema = UserConnection.EntitySchemaManager.GetInstanceByName("OrderStatus");

var communication = schema.CreateEntity(UserConnection);

communication.FetchFromDB("Name", city);

communication.SetColumnValue("CommunicationTypeId", Guid.Parse(typeId));

communication.SetColumnValue("AccountId", primaryEntityId);

communication.SetColumnValue("Number", number);

communication.Save();

 

{Добавление}

var schema = UserConnection.EntitySchemaManager.GetInstanceByName("OrderStatus");

var communication = schema.CreateEntity(UserConnection);

communication.SetDefColumnValues();

communication.SetColumnValue("CommunicationTypeId", Guid.Parse(typeId));

communication.SetColumnValue("AccountId", primaryEntityId);

communication.SetColumnValue("Number", number);

communication.Save();

 

{Удаление}

EntitySchema accountSchema = UserConnection.EntitySchemaManager.GetInstanceByName("Account");

Entity accountEntity = accountSchema.CreateEntity(UserConnection);

if (accountEntity.FetchFromDB("Name", accountName)) {

    accountEntity.Delete();

}

 

{{Получение колейции c применением фильтра}}

var result = 0.0;

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "OpportunityProductInterest");

string quantity = esq.AddColumn("Quantity").Name;

IEntitySchemaQueryFilterItem opportunityIdFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Opportunity.Account", accountId);

IEntitySchemaQueryFilterItem typesTariffServiceIdFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Product.PsTypesTariffServices", typesTariffServiceId);

esq.Filters.Add(opportunityIdFilter);

esq.Filters.Add(typesTariffServiceIdFilter);

var entities = esq.GetEntityCollection(UserConnection);

if (entities.Count > 0)

{

    result = entities[0].GetTypedColumnValue<int>(quantity);

}

return result;

{{Изменение колейции c применением фильтра}}

var result = "blabla";

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "OpportunityProductInterest");

esq.AddAllSchemaColumns();

string quantity = esq.AddColumn("Quantity").Name;

IEntitySchemaQueryFilterItem opportunityIdFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Opportunity.Account", accountId);

IEntitySchemaQueryFilterItem typesTariffServiceIdFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Product.PsTypesTariffServices", typesTariffServiceId);

esq.Filters.Add(opportunityIdFilter);

esq.Filters.Add(typesTariffServiceIdFilter);

var entities = esq.GetEntityCollection(UserConnection);

if (entities.Count > 0)

{

    foreach(var item in entities)

    {

        item.SetColumnValue("KtRequestId", result);

    }

}

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

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

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

 

Пытаюсь загрузить dll на вкладке "Внешние сборки". После выбора файла вылетает ошибка

Action: Change

ControlId: FileUploadEdit

SubmitAjaxEventConfig: {"config":{"extraParams":{}}}

 

Как можно решить данную проблему?

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

Нравится

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

Елена, причина может быть в следующем:

Из-за системных настроек ограничивающих виды вложений (File extensions DenyList) невозможно к пакету добавить библиотеку — вместо ошибки будет просто текст «ошибка в работе приложения». В логах  при этом также ничего очевидного.

Обходное решение: в справочник «Управление файлами \ Список исключений из проверки безопасности файлов» добавить: «/FileUpload.aspx».

В 7.17 это уже решено.

Елена, причина может быть в следующем:

Из-за системных настроек ограничивающих виды вложений (File extensions DenyList) невозможно к пакету добавить библиотеку — вместо ошибки будет просто текст «ошибка в работе приложения». В логах  при этом также ничего очевидного.

Обходное решение: в справочник «Управление файлами \ Список исключений из проверки безопасности файлов» добавить: «/FileUpload.aspx».

В 7.17 это уже решено.

Надо прописать именно /FileUpload.aspx в справочнике.

Андрей, картинка не грузится. И в чём отличие от того, что написал я?

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

Строил ли кто-то подобные графики в Creatio?

Как пример - по оси X отложены группы (города), и для каждого города отобразить динамику по месяцам.



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

Нравится

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

На сколько я знаю, среди стандартных нет таких видов графика

Александр Тыра,

Среди стандартных точно нет. Но насколько я понимаю, можно создавать свои нестандартные. Потому и хочу узнать, не делал ли кто-то подобную задачу, чтобы не изобретать велосипед

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

 

Если делать полностью своё и без интерактивности, можно сделать веб-сервис, возвращающий HTML-страницу или просто картинку в нужном виде и выводить в блоке итогов «Web-страница». Или разрабатывать с нуля новый виджет.

 

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

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



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

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

Нравится

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

как минимум 2 варианта есть

1. Бизнес-процесс, реагирующий на создание записи и дополняющий данными

2. Механизм сообщений Sandbox. У нас много, где он используется для передачи дополнительных данных между объектами.

 

Алексей Следь пишет:

Механизм сообщений Sandbox. У нас много, где он используется

А можно попросить небольшой пример? 

тут хорошо описано

В 7.16.4 (на сколько помню) через бизнес-правила уже можно сделать в графическом интерфейсе.

Но и если не через него, то еще способ через встроенный в объект процесс перед созданием записи

Алексей Следь пишет:

тут хорошо описано

 А в моём случае как в карточке нового договора узнать Id документа, из которого этот договор (не деталь, а поле) создаётся?

Можно подойти с другой стороны: не дорабатывать окно выбора из справочника, а создать БП для выбранной записи раздела, в который передавать её Id. А там создавать договор, записывать в документ Id этого договора и в договоре заполнять нужные значения полей по данным связанного с ним документа. При этом можно показывать карточку новой записи. Либо же, если от пользователя требуется заполнение всего нескольких полей, можно получить их на преднастроенной странице, а затем добавлять договор элементом добавления данных.

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

Проблема: При выгрузке excel-отчёта через браузер Safari из карточки одного из разделов выгружается файл без расширения, файл прочитать не удаётся (скриншот 1). На IOS проблема такая же.

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

Замечание:

1) При выгрузке excel-отчёта в браузере Safari из детали в карточке другого раздела файл корректно загружается и читается

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

2) При выгрузке excel-отчёта в браузере Google Chrome и Яндекс.Браузер из любого из разделов файл корректно загружается и читается

Нравится

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

Мария, как именно формируете отчёт? Стандартно есть только FastReport и Word, речь о дополнении? Или о выгрузке реестра раздела по действию? Какая у Вас версия 7.Х и браузеров?

Ранее похожее было при выгрузке пользовательского пакета из конфигурации в Safari на MacOS, выгружался файл без расширения. Проблема тогда была в настройках браузера/ОС в невозможности конвертировать gz в zip.

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

Александр, как решить эту проблему?

 

Зверев Александр пишет:

Ранее похожее было при выгрузке пользовательского пакета из конфигурации в Safari на MacOS, выгружался файл без расширения. Проблема тогда была в настройках браузера/ОС в невозможности конвертировать gz в zip.

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

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

При использовании Data binding tool возникает ошибка, если пытаться привязать настройку колонок в детали. В основном это касается custom'ных деталей (добавленными стандартными инструментами через мастер деталей), но иногда возникает и со стандартными

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

Нравится

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

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

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

Владимир, добрый день!

 

уточните, пожалуйста, продукт и версию Creatio, на которой воспроизводится указанная ошибка? И также очень будет полезна информация, когда устанавливали приложение?

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

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

Лазоренко Ирина,

Спасибо большое! Действительно, после сохранения для всех пользователей, настройка колонок успешно привязалась!

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

Добрый день!

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

Контейнер под левую панель есть, даже отображаются кнопки действий при наведении на них, но самих разделов на панели нет.

В консоль при авторизации под новой ОР выкидывает: 

user: (Имя пользователя)/(ID Роли в БД) file: .../content/ModuleUtils.js

line: 32

column: 26

message: Uncaught TypeError: Cannot read property 'sectionModule' of undefined

в этом фрагменте кода: 

if (moduleStructure.sectionModule) {

         tag = moduleStructure.sectionModule + "/";

}

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

Нравится

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

Судя по тексту ошибки, у Вас при заходе под пользователем с этими правами не заполнилась структура Terrasoft.configuration.ModuleStructure. При нормальной работе там должен быть массив с информацией о разделах, это можно увидеть, введя название в консоли:

У Вас под этим пользователем что выдаёт?

Она, в свою очередь генерируется на серверной стороне в схеме ConfigurationSectionHelper.

Почему именно так с новой ролью, непонятно, ведь в серверном коде идёт считывание при помощи Select, не учитывающей права.

Проверьте, не поможет ли вызов действия «Актуализировать роли»?

 

Наконец, просто попробуйте очистить Redis, перезапустить сайт. Возможно, в ходе настроек ролей что-то неверно закешировалось.

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

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

 

Проблема такая не могу настроить фильтр в клиентской схеме так что бы выобрка действующих контактов была по Региону пользователя который открыл раздел.

 

К примеру если сотрудник зашёл в раздел контакты и сотрудник из региона "New York", то у него в раздел подтянуться только контакты у которых в поле Регион проставлен "New York"

 

Вот пример кода, нужна помощь с фильтром "RegionFilter"

filterGroup.add("ClientTypeFilter", this.Terrasoft.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL, "ClientType", "15796DCC-EC99-4D1D-A270-37EC8CB26A07"));

                    filterGroup.add("RegionFilter", this.Terrasoft.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL, "[Contact:Region]",

                        Terrasoft.core.enums.SysValue.CURRENT_USER_CONTACT.value));

Нравится

13 комментариев
Лучший ответ
esq.filters.add("RegionFilter", this.Terrasoft.createColumnFilterWithParameter(
       this.Terrasoft.ComparisonType.EQUAL, "Region.[Contact:Region].Id",
        Terrasoft.core.enums.SysValue.CURRENT_USER_CONTACT.value));

 

esq.filters.add("RegionFilter", this.Terrasoft.createColumnFilterWithParameter(
       this.Terrasoft.ComparisonType.EQUAL, "Region.[Contact:Region].Id",
        Terrasoft.core.enums.SysValue.CURRENT_USER_CONTACT.value));

 

Вообще, правильнее такое делать путём настройки прав по организационным ролям. Создать БП на создании контакта или изменении его региона и выдавать права на чтение нужной роли. Ну и для объекта настроить права на новые записи только тем, кому нужно видеть из всех регионов.

 

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

Зверев Александр, тут доработок было много до нас пока не будем рисковать. Но согласен, в идеале будет корректнее делать так

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

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

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

Нет, затираются все, к сожалению. По данному вопросу уже был разговор с Террасофт

Да, действительно, Александр, Вы недавно писали.

 

Уточнил у разработчиков ядра по результатам, проблема не подтвердилась, актуализация не затирает права, а вставляет новые, не трогая те, которые раздавались вручную либо через БП. Там дело немного в другом, то, что в системе все ещё есть запрещающие права, и при актуализации могут раздаваться разрешающие, и в итоге получается 2 противоречащих права. С этим вопросом пока не разбирались.

 

То есть, если не используете запрещающие права, должно работать корректно.

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

постараюсь найти ответ поддержки где указывали что права при актуализации затирают права созданные процессом

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

Добрый день, Александр!



В рамках данного обращения будет рассмотрен вопрос по тех.реализации доступов ролей



Вы верно заметили, что при актуализации прав доступа все изменения прав бизнес процессом затираются.



По сути актуализация прав удаляет и заново добавляет права доступа согласно настроек. 



Однако, бизнес процессом изменяются только права доступа по записям. 

Вы можете учесть этот момент в вашем кейсе. 



Права но операциям и на колонки, бизнес процессом не изменяются, на текущий момент. 



На текущий момент права доступа хранятся в таких таблицах:

Доступ по операциям

SysEntitySchemaOperationRight



Доступ по записям

Настройки прав хранятся в таблице: SysEntitySchemaRecordDefRight

Права хранятся в таблице: Sys[Объект]Right

Происхождение прав хранится в таблице: SysEntitySchemaRecRightSource



Доступ по колонкам

Настройки прав хранятся в таблице: SysEntitySchemaColumnRight

Уровень прав хранится в таблице: SysEntitySchemaColRightLevel



Я создам задачу на отдел разработки, по описанному кейсу для рассмотрения её решения в будущих версиях приложения.

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

как видно из ответа "Вы верно заметили, что при актуализации прав доступа все изменения прав бизнес процессом затираются." все же затираются

Уточнял, нет, не подтвердилось.

 Актуализация не трогает права которые розданы БП либо вручную. Все что она делает, удаляет права которые выданы дефолтной раздачей (права выданые вручную или БП отсекаются по источнику) и раздает по новым настройкам дефолтных прав.

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

"

Все что она делает, удаляет права которые выданы дефолтной раздачей (права выданые вручную или БП отсекаются по источнику) 

" - можно подробнее, так как не совсем понял Вас?

У записи в таблице прав есть справочное поле SourceId, оно ссылается на справочник SysEntitySchemaRecRightSource со значениями: Owner, Author, Manual, Default.

 

Возможно, ранее в БП раздали не с тем значением, вот их и удалило заодно.

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

Добрый день!

Подскажите можно ли в 3.х поменять сам логин пользователя без пересоздания нового пользователя к контакту?

 

Нравится

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