Здравствуйте! Наблюдается следующая проблема, а именно конфликт библиотек  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 комментария

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

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

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

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

Доброго времени суток. Возникла проблема с синхронизацией почты на 7.16.1

Настроили по инструкции на академии. В систему добавил два почтовых ящика: один на рабочем сервере, другой на yandex. Отправка писем работает, но с почтовых ящиков письма в Creatio не загружаются.

Может кто-то сталкивался с подобной проблемой?

Заранее благодарен.

Нравится

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

Кирилл, в 7.16 архитектуру интеграции с почтой меняли.

Создали отдельный от основной системы Exchange Listener, который устанавливается на своём сервере. А затем на сайте 7.Х в системной настройке ExchangeListenerServiceUri прописывается его адрес, а в другой настройке — адрес анонимного сервиса в системе, к которому он извне обращается.

 

Точно по этой инструкции со всеми её подстраницами настраивали?

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

Всем доброго времени суток!

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

Устанавливаю пакет через CLIO - выдает ошибки - https://prnt.sc/tqkuyw

В чем может быть проблема?

Версия системы 7.16.2.1600 

 

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

Нравится

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

так же при выполнении команды clio install-gate -e dev выдает ошибки - https://prnt.sc/tqnh3s

Алексей, по первому скриншоту, похоже, дело в файловой системе Вашего ПК, не может получить доступ к определённой папке.

 

По второму, у Вас как-то получилось вместо названия объекта «7.16.2», что делать нельзя, названия должны быть с латинскими буквами и без точек. Возможно, при оформлении перепутали с версией.

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

Странно как то получается создаю новый пакет Test и сразу  пушу его в систему и выдает такое - 

https://prnt.sc/tr3etj. Тут ну никак и нигде не задается имя 7.16.

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

Если и через интерфейс такое же, то тем более, дело в самом пакете. Сравните с теми, которые ставятся нормально, может, что-то перепутано в полях? Вы создали пакет командой к clio?

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

"Вы создали пакет командой к clio?" - пакет Test да. 

 

Просто создали так?

Creating new package

To create new package project, use the next command:

 clio new-pkg <PACKAGE_NAME>

you can set reference on local core assembly with using Creatio file design mode with command in Pkg directory

 clio new-pkg <PACKAGE_NAME> -r bin

Может, что-то делали с версией?

Set package version

Set a specified package version into descriptor.json by specified package path.

clio set-pkg-version <PACKAGE PATH> -v <PACKAGE VERSION>

 

Вообще, не видя создавшегося пакета, сложно  сказать, что в нём не так.

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

просто clio new-pkg <PACKAGE_NAME>

Значит, смотреть внутрь пакета, где там упоминается «7.16.2». А падает только при установке на конкретный Ваш сайт? А если ставить на демку, то то же самое?

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

Устанавливал созданный пакет через clio на облачный дев, через интерфейс системы, стал без ошибок.

 

Значит, всё же дело не в пакете, а в сайте, куда его ставили? Может, версии отличаются?

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

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

Теперь бы разобраться как вызывать классы из данного пакета в других схемах конфигурации)

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

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

Мотков Илья,

Добрый день. Я бы добавил, что есть способы достучаться из схем в функциональность Files. Через тот же ClassFactory

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

 

Ещё дополню, что все классы схем располагаются в неймспейсе Terrasoft.Configuration, если другое не задано.

 

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

 

Если речь о классах во внешних библиотеках – то обращаться так же как и из пакета в котором эта библиотека привязана.

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

Коллеги, разобрался в чем проблема... при создании нового пакета в этих папках - https://prnt.sc/u638lk генерируется текстовый файл placeholder, вот из-за него и вываливается ошибка при деплое пакета в среду, после удаления деплой прошел корректно и ошибка -

"Terrasoft.Common.InvalidNameException: Название объекта "7.16.2" некорректно" не выскакивала

Алексей, разработчики сообщили, что мы поищут способ решения этой проблемы, на текущий момент данную проблему можно обойти, указав в ConnectionStrings.config в секции tempDirectoryPath простой пусть С:\Temp

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

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

OsmMapsModule делает карту с надписью что использует для работы с апи OSM библиотеку js Leaflet. Я вижу что в OSMMapsModule пакета OSM нету метода для подключения сервиса маршрутизации, в этом случае как расширить модуль для вызова вот этого кода?

  L.Routing.control({
            waypoints: [
                L.latLng(57.874, 56.162), 
                L.latLng(52.574, 39.653)
            ],
            router: L.Routing....
        }).addTo(map);

 

Нравится

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

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

 

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

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

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

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

 

Вижу два решения задачи:

1) Вариант 1:

 - Создаем три таблицы: базовый справочник "Продукты", базовый объект "Деталь 1" с колонкой привязки к "Продукты", базовый объект "Деталь 2" с колонкой привязки к "Деталь 1".

- Создаем справочник на основе объекта "Продукты", деталь с добавлением из справочника на основе объекта "Деталь 1", деталь с добавлением из справочника на основе объекта "Деталь 2".

- Сталкиваемся с проблемой не рабочей делали "Деталь 2" так как для открытия окна добавления данных из "Деталь 1" необходимо с базовой колонкой текстового типа ("Отображаемое значение")!

2) Вариант 2:

- Создаем три таблицы: базовый справочник "Продукты", базовый объект "Деталь 1" с колонкой привязки к "Продукты" и колонкой "Зарезервировано" (что бы можно было отмечать значения что попадут далее в третью деталь).

- Создаем справочник на основе объекта "Продукты", деталь с добавлением из справочника на основе объекта "Деталь 1", деталь с добавлением из справочника на основе объекта "Деталь 1" (тут нам и пригодилась колонка "Зарезервировано" так как по ней и будет фильтр и мы просто проставляем значение в эту колонку, а точнее по колонке "Заявка" и "Зарезервировано").

- Сталкиваемся с проблемой не рабочей делали "Деталь 2" так как для открытия окна добавления данных из "Деталь 1" необходимо с базовой колонкой текстового типа ("Отображаемое значение")! Была идея сделать Вью для отображения не достающего текстового поля, которое заполнять из колонки "Продукты.Название".

Нравится

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

Александр, что-то мне не вполне понятно по структуре того, что хотите отобразить. Вы хотите две детали в разделе продуктов или в каком-то другом разделе, которые связывают его с продуктами (вроде раздела «Договоры» и детали развязки «Продукты в договоре»)? Как между собой связаны раздел и первая деталь, раздел и вторая, первая со второй?

 

Сами по себе двухуровневые детали обсуждались тут, тут и тут, но готового описания реализации не видно. Но в 7.Х, в отличие от прошлых версий, детали располагаются одна над другой, так что важнее сначала понять, что хотим отобразить, а потом искать техническую реализацию, через view или как-то ещё.

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

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

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

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

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

  Всем доброго времени суток! Подскажите, возможно ли использовать анонимный ws в качестве веб-хука, например для Telegram-bot?

Благодарю.

Нравится

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

1. Создаем анонимный сервис.

2. Добавляем в него метод по аналогии с HandleWebHookEvents в MandrillService:

[OperationContract]

        [WebInvoke(Method = "*", UriTemplate = "HandleWebHookEvents")]

        public void HandleWebHookEvents(Stream mandrill_events) {

}

Он принимает stream, и может ничего не возвращать. 



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

Алексей, по поводу веб-хуков см. в этом обсуждении. Там упоминаются готовые примеры в системе и сторонних дополнениях.

1. Создаем анонимный сервис.

2. Добавляем в него метод по аналогии с HandleWebHookEvents в MandrillService:

[OperationContract]

        [WebInvoke(Method = "*", UriTemplate = "HandleWebHookEvents")]

        public void HandleWebHookEvents(Stream mandrill_events) {

}

Он принимает stream, и может ничего не возвращать. 



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

Чтобы быстро понять, что приходить в вебхуке и как это парсить, используйте https://webhook.site/.&nbsp;

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

Коллеги, кто нибудь вел разработку по принципу пакет-проект, из статьи мало понятно как действовать. Есть вопросы:

  1. При выгрузки пакетов ФС папка Files не создалась(кастомный пакет) - можно добавить вручную?
  2. Можно ли добавлять данное решение в существующий пакет?
  3. В папку Files добавлять ProjectName.dll или весь solution?
  4. Проект создавать как библиотеку классов + подключать в зависимости пакет Terrasoft? 

В общем что то в этом роде.

Заранее благодарен!

Нравится

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

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

 

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

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

с установкой пакета разобрался, теперь вот вопрос как использовать встроенные классы при разработке в ФС?

Вот пытаюсь определить переменную с данным типом -https://prnt.sc/tqf1ps

Что делаю не так?

Если брать данную dll - https://prnt.sc/tqf4n0 и вставлять во Внешние сборки(https://prnt.sc/tqf4z5) тогда смысл данного решения?

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

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

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

 

Его автор ответил по поводу того, что Вы спрашивали о смысле этого решения: 

Взаимодействие между проектными-классами, и схемами исходного кода происходит через API-проекты.

Основная польза от такого решения – согласовав API, можно поставлять решение без компиляции основного приложения.

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

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

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

 

Пакет-проект - это пакет который содержит только файловый контент, который в папке пакета располагается в папке Files.

В файловом контенте расположен обычный проект .net, а компиляция у него настроена в папку Bin.

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

Приложение загружает библиотеки (dll) из папки Files\Bin и ищет в них сервисы, а найденные сервисы активирует.

В проекте не будут видны конфигурационные классы, так же как и классы из данного проекта не будут видны коду в конфигурации, это изолированные сервисы.

 

Ответы на вопросы:

 При выгрузки пакетов ФС папка Files не создалась(кастомный пакет) - можно добавить вручную?

Ее можно создать вручную

   Можно ли добавлять данное решение в существующий пакет?

Можно.

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

Для ее включения надо в Web.config загрузчика добавить

&lt;add key="Feature-UseCompilationByNecessity" value="true" /&gt; 

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

  В папку Files добавлять ProjectName.dll или весь solution?

Обязательно надо добавить ProjectName.dll в Files\Bin, а solution, на ваше усмотрение, обычно желательно, чтобы вы скачав пакет могли вести в нем разработку.

 Проект создавать как библиотеку классов + подключать в зависимости пакет Terrasoft?

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

Для работы с классами ядра можно к проекту подключить библиотеки из nugget:

 &lt;PackageReference Include="BpmonlineSDK" Version="7.14.4.844-rc" /&gt;
 &lt;PackageReference Include="Terrasoft.ServiceModel" Version="1.0.0" /&gt;
 &lt;PackageReference Include="Terrasoft.ServiceModel.Primitives" Version="1.0.0"&gt;

 

 как использовать встроенные классы при разработке в ФС?

Как и в любом другом проекте .net.

Вот пытаюсь определить переменную с данным типом -https://prnt.sc/tqf1ps

Что делаю не так?

По скриншотам сказать что-то сложно, пришлите пакет, мы тогда объясним что там идет не так.

Если брать данную dll - https://prnt.sc/tqf4n0 и вставлять во Внешние сборки(https://prnt.sc/tqf4z5) тогда смысл данного решения?

В проекте (пакета-проекта), нельзя подключать сборки добавленные во внешние сборки в конфигурации.

 

Мотков Илья,

Можно ли при использовании данного решения как-то избежать конфликт библиотек Google? А то пока не получается...

 

Мотков Илья,

Мотков Илья пишет:

В проекте (

т.е. я не смогу добавить более новые библиотеки Google.Apis, Google.Analytics.V3, Google.Apis.Core (latest stable version) и т.д.? И затем без проблем использовать?

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

 

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

По поводу Clio, лучше установить последнюю версию, после чего проинсталировать новую версию cliogate. Если будут ошибки, еще раз прислать лог, который выдала утилита.

Мотков Илья,

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

Мотков Илья пишет:

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

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

По поводу Clio, лучше установить последнюю версию, после чего проинсталировать новую версию cliogate. Если будут ошибки, еще раз прислать лог, который выдала утилита.

Что касается clio и инсталяции cliogate в результате выполнения команды возникает следующая ошибка - https://prnt.sc/ttvziv&nbsp;

Алексей, в соседней теме это Ваш же случай?

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

да, уже и систему переустанавливал, не помогает

 

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

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

Коллеги всем доброго времени суток! Подскажите, как правильно добавлять системную настройку кодом и есть ли такая возможность? При добавлении через БП она создаётся но значение не сохраняется. Благодарю.

Нравится

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

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

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

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

Системная настройка хранится в таблице SysSettings, а её значения в SysSettingsValue.

Алла Савельева,

здравствуйте, я это знаю, тут дело в другом, переменная создается, но значение не присваивается, по крайней мере через ui в системной настройке в поле значение по умолчанию пусто, и когда заполняеш вручную, то значение не сохраняется.

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

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

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

Добрый день!



Помогите разобраться.

Задача: изменить объект привязки в сквозной воронке (по умолчанию воронка строится по Лидам и Продажам). Необходимо изменить продажу на заказ.

Нашёл, что изначально объекты привязки объявляются в FullPipelineDesigner (пакет Platform):

 

_getDefaultEntities: function() {
                return [
                    {
                        "schemaName": "Lead",
                        "connectedWith": null,
                        "calculatedOperations": [{"operation": "Amount", "targetColumnName": "Budget"}],
                        "filters": null
                    },
                    {
                        "schemaName": "Opportunity",
                        "calculatedOperations": [{"operation": "Amount", "targetColumnName": "Budget"}],
                        "connectedWith": {
                            "type": 0,
                            "schemaName": "Lead",
                            "connectionSchemaName": "Lead",
                            "parentSchemaColumnName": "Opportunity",
                            "childSchemaColumnName": "Id"
                        },
                        "filters": null
                    }
                ];
            }



При попытке создать замещающий модуль c переопределенной _getDefaultEntities система говорит: "Замещение модулей запрещено".

Подскажите как решить такую задачу?

Нравится

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

Александр, вопрос невозможности замещения модулей обсуждался неоднократно, см. тут и тут.

 

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

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

Всем доброго времени суток! Столкнулся с такой проблемой. При добавлении БП в раздел "съезжает" ранее добавленная кнопка - https://prnt.sc/tn9xut.

Как с этим бороться?

Заранее благодарю.

Нравится

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

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

Вадим Косарев,

	diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "ActionButtonsContainer",
				"propertyName": "items",
				"name": "SimpleInfoButton",
				"values": {
					"layout": { "column": 1, "row": 6, "colSpan": 1},
					"itemType": Terrasoft.ViewItemType.INFORMATION_BUTTON,
					"content": { "bindTo": "Resources.Strings.InfoButtonCaption" }
				}
			}
		]/**SCHEMA_DIFF*/,

 

Алексей, процессы открывает кнопка ProcessRunButton. Она реализована в BaseDataView (базовой схеме раздела) кодом:

{
	"operation": "insert",
	"name": "ProcessRunButton",
	"parentName": "SeparateModeActionButtonsContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"caption": {"bindTo": "Resources.Strings.RunProsessButtonCaption"},
		"imageConfig": {"bindTo": "Resources.Images.ProcessButtonImage"},
		"iconAlign": Terrasoft.controls.ButtonEnums.iconAlign.LEFT,
		"classes": {
			"imageClass": ["t-btn-image left-12px t-btn-image-left proc-btn-img-top"],
			"textClass": ["t-btn-text t-btn-left actions-button-margin-right"]
		},
		"menu": {"items": {"bindTo": "getFilteredBySectionProcesses"}},
		"visible": {"bindTo": "getIsRunProcessButtonVisible"}
	}
},

В отличие от Вашего элемента, она входит в SeparateModeActionButtonsContainer, а уже тот —в ActionButtonsContainer:

{
	"operation": "insert",
	"name": "SeparateModeActionButtonsContainer",
	"parentName": "ActionButtonsContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.CONTAINER,
		"visible": {
			"bindTo": "IsCardVisible",
			"bindConfig": {
				"converter": function(value) {
					return !value;
				}
			}
		},
		"wrapClass": ["separate-action-buttons-container-wrapClass"],
		"items": []
	}
},

Возможно, Ваша кнопка с учётом иерархии контейнеров не там, где должна была находиться? Или дело в «"layout": { "column": 1, "row": 6, "colSpan": 1}», ведь нумерация идёт с нуля и 1 — это уже второй, с учётом видимой кнопки процессов?

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