Добрый день, Коллеги!

Кейс:

Возникла потребность запуска "Действия процесса" (аналог элемента "Выполнить действие процесса") скриптом.

Речь идёт о действии FillEmailTemplateUserTask - обработать шаблон письма с макросами.

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

Необходимо:

1) Вызвать скриптом Обработку подготовленного шаблона, передавая в него необходимые параметры такие как:

RecordId

TemplateId

SysEntitySchemaId

2) Создать активность типа email.

В тело и тему подставить соответственно Subject и Body, обработанные FillEmailTemplateUserTask.

 

Пример выполняемого скрипта:

var userConnection = Get<UserConnection>("UserConnection");
 
var processEmailTemplateUserTask = new FillEmailTemplateUserTask(userConnection);
//передал Guid шаблона
    processEmailTemplateUserTask.TemplateId = new Guid("7EDBEDDE-9E1E-4D80-953D-B7652E6B5F97");
//get UId схемы объекта Изменение
    processEmailTemplateUserTask.SysEntitySchemaId = Get<Guid>("UsrSysShemaUId");
//get Id записи объекта Изменение
    processEmailTemplateUserTask.RecordId = cangeId;
    processEmailTemplateUserTask.Execute(context);
        
var activity = new Terrasoft.Configuration.Activity(userConnection);
    activity.SetDefColumnValues();
    activity.TypeId = Terrasoft.Configuration.ActivityConsts.EmailTypeUId;
    activity.Recepient = "testRecepient@yandex.ru";
    activity.Title = processEmailTemplateUserTask.Subject;
    activity.Body = processEmailTemplateUserTask.Body;
    activity.ChangeId = cangeId;
    activity.IsHtmlBody = true;
    activity.Sender = "testSender@yandex.ru";
    activity.Save();

Проблема:

Пытаюсь передать в создаваемую активность Title и Body после выполнения по идее элемента FillEmailTemplateUserTask.

Однако БП завершается с ошибкой: "Заголовок должен быть заполнен" (обязательная колонка). То есть На моменте создания активности я не получаю обработанной темы и тела письма шаблона с макросами.

 

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

Такое впечатление, что просто не правильно задаю Execute или чего-то не хватает.

 

Нравится

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

Добрый день!!

Элемент [Задание сценарий] не предназначен для запуска и обработки элементов процесса.

Попробуйте использовать связку [Выполнить действие процесса] + [Задание-сценарий]. В ScriptTask замапиться на параметры элемента [Выполнить действие процесса - > Обработать шаблон письма с макросами].

Зарицкий Олег,

Спасибо за информацию! Вытащили скрипт действия в методы!

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

Всем привет, просветите пожалуйста.

Задача отправить некоторое сообщение из LeadPage в LeadSection.

Lead Page:
         messages: {
 
            "MESSAGE": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.PUBLISH
            }
        },
		methods: {
                 onEntityInitialized : function(){
		      	 this.callParent();
 
 
		         window.console.log("onEntityInitialized");
 
		         this.sandbox.publish("MESSAGE", { test: "param anything" }, [this.sandbox.id]);
                 console.log("MESSAGE IS PUBLISH...");
 
 
			}
        }

Вопрос в том как динамически перехватить это сообщение в LeadSection?

Т.е как организовать слушателя событий на стороне LeadSection?

Сейчас тупо использую простую функцию определенную в LeadSection, но она отрабатывает только если ее инициализировать руками.

LeadSection	  
 
       messages: {
 
            "MESSAGE": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.PUBLISH
            }
        },
 
         methods: {
		 initMessage: function() {
	      console.log("initMessage");
 
                this.sandbox.subscribe("MESSAGE", function(arg) {
                    console.log("test " + arg.test);
                }, this, [this.getSenderSandboxId()]);
 
            }
         }

 

Нравится

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

Все почти верно, кроме

LeadSection =&gt; 
    messages: {
"MESSAGE": {
        direction: Terrasoft.MessageDirectionType.SUBSCRIBE,
         mode: Terrasoft.MessageMode.PTP
    }
}

Ключевое - direction: Terrasoft.MessageDirectionType.SUBSCRIBE для сообщения на LeadSection

Соротюк Татьяна,

Спасибо)

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

Товарищи помогите решить задачу.

Есть справочное поле и собственно сам справочник, открывающийся в модальном окне.

Справочник вида :Название - Описание.

Задача фильтровать значения по колонке описание

Я так понимаю что в атрибутах я должен сделать что-то вроде

"UsrDebtorStatus":{
  dataValueType: Terrasoft.DataValueType.LOOKUP,
  lookupListConfig: {
      filter: function() {
      var description= "Дебитор";
      return Terrasoft.createColumnFilterWithParameter( Terrasoft.ComparisonType.EQUAL, "????????????",description);
              }
      }
  }

 

Нравится

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

если UsrDebtorStatus — обычный справочник, то скорее всего Name. Обычно 2 параметром идёт колонка из объекта (в "кубик" UsrDebtorStatus загляните). Ну и лучше всего по guid-у сортировать

Роман, добрый день!

Необходимую Вам фильтрацию поля в версии 7.11 можно реализовать с помощью пользовательской настройки "Бизнес-правила". 

Для реализации Вашей бизнес-задачи необходимо выполнить следующие шаги:

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

  - найти объект, который является Вашим справочником

  - открыть объект, развернуть его наполнение объекта, нажать правой кнопкой мыши на "Inherited Columns", выбрать "Добавить", выбрать тип колонки "Справочник";

  - в свойствах созданной колонки, в поле «Справочник» указать справочник типов, по которому необходимо будет выполнять фильтрацию;

  - опубликовать объект.



2. На странице раздела, в которой будет присутствовать справочное поле, настроить бизнес-правило:

  - добавить действие бизнес-правила "Добавлять фильтр значений в поле"

  - указать в поле "какую колонку фильтровать и по какой связи в справочнике этого поля" - созданное справочное поле по связи с полем, в котором указан тип клиента;

  - указать в поле "по какому полю фильтровать" поле на странице раздела, в котором указан тип клиента;

  - сохранить изменения.

Больше о настройке бизнес-правил Вы сможете узнать на Академии: https://academy.terrasoft.ru/documents/sales-enterprise/7-11/nastroyka-biznes-pravil

Также на Академии есть информация по разработке бизнес-правила фильтрации: https://academy.terrasoft.ru/documents/technic-sdk/7-11/primer-primeneniya-pravila-filtration, но мы рекомендуем использовать функционал Бизнес-правил в Мастере раздела.

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

Добрый день!

Как можно быстро убрать всех старых сотрудников из ответственных в записях разных разделов? При попытке удалить пользователя из системы выдает сообщение "Выбранного пользователя удалить невозможно, так как он используется в других объектах." Пробовал процессами переназначать ответственного в различных разделах, но все равно выдает данное сообщение. 

+ При попытке через @ указать сотрудника в сообщении ленты также выдает уволенных сотрудников.

Нравится

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

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

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

В качестве обходного решения можем предложить убрать признак "Активен" в карточке пользователя у старых сотрудников. После данных действий, пользователь будет не активен. Либо, если есть необходимость стереть все данные о неактивных сотрудниках, обратитесь, пожалуйста, в техническую поддержку по адресу support@terrasoft.ru.

Одеяненко Юлия,

Добрый день! Только что проверил еще раз. Признак активности пользователя не влияет на возможность его выбора (по крайне мере, попробовал в карточке Активности) 

В BaseFiltersGenerateModule описана очень простая функция по фильтрации. Возможно, её где-то можно переопределить



    function OwnerFilter() {

        return Terrasoft.createColumnIsNotNullFilter('[SysAdminUnit:Contact].Id');

    }

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

Пытаюсь соедениться с 1С, вот код:

namespace Terrasoft.Configuration.ImportAllAccountsService

{

    using System;

    using System.ServiceModel;

    using System.ServiceModel.Web;

    using System.ServiceModel.Activation;

    using System.Collections.Generic;

    using System.Collections.ObjectModel;

    using System.Data;

    using Terrasoft.Common;

    using Terrasoft.Core;

    using Terrasoft.Core.DB;

    using Terrasoft.Core.Entities;

    using Newtonsoft.Json;

    using Newtonsoft.Json.Linq;

    using System.CodeDom.Compiler;

    using System.Linq;

    using System.Runtime.Serialization;

    using System.Text;

    using System.Text.RegularExpressions;

    using System.Web;

    using Terrasoft.Core.Packages;

    using Terrasoft.Core.Factories;

    using V83;

    

    [ServiceContract]

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

    public class ImportAllAccountsService

    {

        [OperationContract]

        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,

        ResponseFormat = WebMessageFormat.Json)]

        public string ImportAllAccounts()

        {

            COMConnector comConnector = new COMConnector();

            return "Import complite1!!!";

            dynamic connection = comConnector.Connect(@"File='D:\1С-Install\FOP NEW';Usr='xxx';Pwd='yyy'");

            return "Import complite2!!!";

            dynamic dataArray1C = connection.Справочники.Контрагенты.Выбрать();

            return "Import complite3!!!";

            while (dataArray1C.Следующий == true)

            {

                return (string)dataArray1C.Наименование;

            }

        }

    }

}

в обычном проэкте в студии - работает, тут вылетает уже на строке  COMConnector comConnector = new COMConnector();

Нравится

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

У кого есть идеи почему BPM не хочет работать с библиотекой 1С? Хотя при компиляциии шибок - нет...

Нашел еще такой код:

string ConnectString = @"File='D:\1С-Install\FOP NEW';Usr='xxx';Pwd='yyy'";

            var v81comConnector = Type.GetTypeFromProgID("V83.ComConnector");

            var v81 = Activator.CreateInstance(v81comConnector);

            Object[] arguments = { ConnectString };

            dynamic Connect = v81comConnector.InvokeMember("Connect", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v81, arguments);

            int count = Connect.Метаданные.Справочники.Количество();

            MessageBox.Show(count.ToString());

Работает без библиотеки!!! Тут выбивает ошибку на строке

var v81 = Activator.CreateInstance(v81comConnector);

Хотя в визуалке этот код отрабатывает на ура

С чем вылетает-то? 

Виталий, какая ошибка?

УРА!!! Решено!!! проблема была в сервере 64, помогла вот эта ссылка:

https://infostart.ru/public/197627/

Показать все комментарии
var someData = "123"; //Как передать эту переменную в процесс?
 
var args = {
              sysProcessName: "UsrProcess34",
           };
            // Запуск пользовательского бизнес-процесса.
           ProcessModuleUtilities.executeProcess(args);

 

Нравится

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

Роман, привет!

Добавь объект parameters в свой объект args.

                        processArgs = {

                            sysProcessName: "Process1",

                            parameters: {

                                Contact: ContactId

                            }

                        };

                        ProcessModuleUtilities.executeProcess(processArgs);

Спасибо за ответ, все получилось

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

Настроил конфиг файлы Service, Scheduler, Worker.

 

При попытке AddSite получаю ошибку веб приложения Service. не подключилось подключиться к базе SQLLite.

Где настройка этой базы идет? 

 

 

Нравится

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

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

1. Web.config. То, что красным - закомментить, зеленым - раскомментить.

2. ConnectionStrings.config​ <add name="ConnectionDb" connectionString="ПОЛНЫЙ ПУТЬ к БИНАРЯМ\GlobalSearch.db"/>

В IIS нажать browse и бд GlobalSearch​ будет создана автоматом.

 

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

Подскажите как в отчете Word реализовать что бы сумма была прописью

Нравится

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

Реализуйте VIEW, который возвращает сумму и используйте его в отчете

скажите пожалуйста, а как его использовать

1) В базе данных bpm'online есть Scalar-value functions "tsp_nonbox_NumberToCurrency" и "tsp_nonbox_NumberToPhrase" - они конвертируют цифры в слова. Если необходимы другие языки или валюты, можно их модифицировать.

2) Необходимо сделать View с выборкой из таблицы Invoice (или другой, где хранится ваша сумма).

Можно добавить в этот View все данные, которые нужны в отчете



Как пример (в нем используются несколько полей, так как иногда требуется печатать прописью то одну, то другую сумму):

CREATE VIEW [dbo].[UsrVwInvoiceAmount]

AS

SELECT [Invoice].[Id] AS [Id],

        [Invoice].[Id] AS [UsrInvoiceId],

        [Invoice].[Number] As [UsrInvoiceName],

        [Invoice].CreatedOn, 

        [Invoice].CreatedById, 

        [Invoice].ModifiedOn,

        [Invoice].ModifiedById,

       [Invoice].[Amount] AS [UsrAmount],

       [Invoice].[PrimaryAmount] AS [UsrPrimaryAmount]               

       dbo.tsp_nonbox_NumberToCurrency([Amount],'EUR','LV',0) AS [UsrAmountText],

       dbo.tsp_nonbox_NumberToCurrency([Amount],'EUR','EN',0) AS [UsrAmountTextEN],

       dbo.tsp_nonbox_NumberToCurrency([PrimaryAmount],'EUR','LV',0) AS [UsrPrimaryAmountText],

       dbo.tsp_nonbox_NumberToCurrency([PrimaryAmount],'EUR','EN',0) AS [UsrPrimaryAmountTextEN]

     

FROM  [Invoice]

 

2) В bpm'online создаете объект на основе этого VIEW:

3) Создать отчет на основе этого объекта или подключить этот объект к отчету на основе Invoice

Владимир Соколов,

Здравствуйте. При создании запроса возникает ошибка

сообщение: 4121, уровень: 16, состояние: 1, процедура: UsrVwInvoiceAmount, строка: 11 [строка начала пакета: 0]

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

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

Для вывода поля «Сумма» прописью необходимо при создании шаблона добавить в выбранные поля не только поле «Сумма», но и поле, соответствующее сумме с примененным макросом (наглядный скриншот - http://prntscr.com/hnov0o). Данный макрос является преднастроенным, и его можно добавлять уже на этапе настройки колонок. При формировании шаблона непосредственно в MS Word необходимо добавлять на страницу шаблона именно колонку с заголовком Сумма[#NumberRU#].

Ссылку на Академию со статьей о базовых макросах очень кстати запостил Кропотов Александр Сергеевич в сообщении выше.

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

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

Программно вызываю открытие модального окна(Контрагенты).

Задача: по клику на элемент, вернуть данные(Например "название" или "ID") в вызывающий код.

Вот мой код:

 

//Выводим модальное окно
viewModal:function(){
var config = {
                    entitySchemaName: "Account",
                     multiSelect: false,
                     columns: ["Name","UsrINN"],
                     hideActions: false,//Скрываем кнопку "Добавить"
                     filters: contactFiler
                    };
               this.openLookup(config, this.myCallBack, this);
},
 
//Колбэк
 myCallBack:function(args){
 
                 args.???????????????????????????????(Что должно быть здесь?)
                 this.showInformationDialog("Callback");
  }

 

Нравится

2 комментария
myCallBack:function(args){
   debugger;
   //args.???????????????????????????????(Что должно быть здесь?)
   this.showInformationDialog("Callback");
}

Вы пишете дебаггер, открываете консоль(f12), ресстартите с кешем страницу, открываете ваше модальное окно(консоль всё ещё открыта), нажимате кнопку выбрать и тут выполнение кода должно приотстановиться. и уже через консоль смотрите какие переменные, что в них и т.п

По теме: в args вроде как хранится коллекция selectedRows, её уже перебирать через terrasoft.each

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

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

Вызывая из кода модальное окно (скажем раздела Контрагенты), есть ли возможность в вызывающий код вернуть информацию кол-ве отображенных элементов?

И это делается только запросом к БД?

Нравится

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