Добрый день!

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

Задача в чем. Нужно получить это уже отфильтрованный грид, наложить на него свой фильтр и отобразить его.

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

Эти темы перечитывал:
https://community.terrasoft.ru/forum/topic/12723
https://community.terrasoft.ru/forum/topic/12327
https://community.terrasoft.ru/forum/topic/10834
https://community.terrasoft.ru/forum/topic/10764
https://community.terrasoft.ru/forum/topic/12978
https://community.terrasoft.ru/forum/topic/9063
https://community.terrasoft.ru/blogs/9136

Похожее, но не то...

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

P.S.: Прошу прощения за бестактность, но! Где можно узнать, какие методы и свойства мне доступны для какого-либо объекта в системе? Хоть какое-то минимальное SDK с объяснениями, пусть даже на китайском языке! Банально не хватает технической литературы по кодингу... =(

Нравится

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

Виталий, минимальный SDK находится здесь.
Свойства можно посмотреть в Visual Studio, подключившись к отладке сайта.
Возможно, то, что Вам нужно, можно посмотреть в скрипте ScriptBasePrepareFilters страницы BaseModulePage (базовая страница раздела). Там делается похожее, берётся датасорс страницы и добавляются и удаляются нужные фильтры. Также см. в других функциях и скриптах той же страницы.

Александр, как всегда выручаете) Спасибо за SDK! Ее находил. Думал, что есть еще какая-либо, которой пользуются немолодые программисты Terrasoft. Да вот только новый вопрос появился...

В исходном коде BaseModulePage в указанном Вами скрипте ScriptBasePrepareFilters имеется действительно все то, что мне нужно. НО! SDK не содержит описания метода CreateFiltersGroup. Вот и вопрос: какие перегрузки для него имеются и отработает ли он вообще? Я, конечно же, буду сейчас пробовать, но тем не менее, последний вопрос остается открытым... Выходит, что SDK не полная?

В SDK есть не всё. Намного больше можно узнать, просто выгрузив исходники конфигурации в виде cs-файлов и их изучая.

Тут на Community есть много примеров вызова этого метода. Похоже, всюду используется одна и та же перезагрузка, с 2 параметрами: текстовое название группы латинскими буквами и логическая операция («LogicalOperationStrict.And» или «LogicalOperationStrict.Or»).

Вас понял - спасибо за наставления!

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

Page.DataSource.LoadRows();

но предыдущие строки грида остаются (что, собственно, логично). Надо вручную обновлять, а это неудобно. В SDK, кстати, не нашел ничего о LoadRows, DataSource, Refresh, Reload, Update, Init и др.... =(

	Page.TreeGrid.Clear();
	Page.DataSource.LoadRows();

Теперь точно всё! Александр, еще раз Вам спасибо за помощь! Хорошего дня!

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

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

rules: {
          "UsrOSAGOPolicyEnsCompany": {
            "FiltrationEnsCompanyByIndustry": {
              "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
              "autocomplete": false,
              "baseAttributePath": "Industry",
              "comparisonType": this.Terrasoft.ComparisonType.EQUAL,
              "type": BusinessRuleModule.enums.ValueType.CONSTANT,
              "value": "ffbf1e56-f36b-1410-c493-00155d043205"
          }
  }
}

Проверяю. Правило не работает (пустой список). В консоли браузера обнаружил сообщение об ошибке:

POST https://myhost/1/DataService/json/SyncReply/SelectQuery 500 (ArgumentNullOrEmptyException)

При выполнении запроса возникла ошибка
        статус ответа: 500 (ArgumentNullOrEmptyException)
        url запроса: ../DataService/json/SyncReply/SelectQuery
        метод: POST
        данные запроса: {"rootSchemaName":"Account","operationType":0,"filters":{"items":{"searchFilter":{"items":{"94caf548-a573-4404-84df-4e20f3ae94cd":{"items":{"undefined...
       
Uncaught Значение аргумента "columnPath" не может быть пустым или неопределенным

Где допустил ошибку?

Нравится

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

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

Вы некорректно используете бизнес правила. Ваш код должен быть приблизительно следующим:

rules: {
                "UsrOSAGOPolicyEnsCompany": {
                    FiltrationEnsCompanyByIndustry: { 
                        ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
                        autocomplete: true,
                        autoClean: true,
                        baseAttributePatch: "Industry",
                        comparisonType: Terrasoft.ComparisonType.EQUAL,
                        type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                        attribute: "Id"
                    }

В случае использования этого кода, значение поля Industry объекта UsrOSAGOPolicyEnsCompany будет сравниваться с значением поля Id объекта Industry.

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

"Демьяник Алексей Олегович" написал:
В случае использования этого кода, значение поля Industry объекта UsrOSAGOPolicyEnsCompany будет сравниваться с значением поля Id объекта Industry.

Дело в том, что мне не нужен биндинг к объекту Industry. Мне просто нужно сделать доступными для выбора только записи с определенным значениемм поля IndustryId.

Попробуйте сделать так:

rules: {
          "UsrOSAGOPolicyEnsCompany": {
            FiltrationEnsCompanyByIndustry: {
              ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
              autocomplete: false,
              baseAttributePatсh: "Industry", /*здесь пропущена буква*/
              comparisonType: this.Terrasoft.ComparisonType.EQUAL,
              type: BusinessRuleModule.enums.ValueType.CONSTANT,
              value: "ffbf1e56-f36b-1410-c493-00155d043205"
          }
  }
}

Точно!
Алексей, спасибо большое! Теперь все получилось (ох, уж эти опечатки) :)

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

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

Создал БП UsrTestChangeRight, содержащий только элемент "Изменить права доступа". Запуская процесс вручную, через раздел "Библиотека процессов", он отрабатывает и в таблицу SysAccountRight добавляются записи.
Но если запускать процесс используя AppScheduler, он завершается без ошибок (появляется запись в журнале процессов) но записи в таблице SysAccountRight не добавляются. Запуск происходит при сохранении контрагента, пробовал использовать элемент "Изменить права доступа" напрямую в событийном подпроцессе замещающей схемы, но там нет возможности открыть окно настроек этого элемента.
Код запуска через AppScheduler:

Dictionarystring, object> parameters = new Dictionarystring, object>();
AppScheduler.ScheduleImmediateProcessJob("TestChangeRight", "Account", "UsrTestChangeRight", "Default", "Supervisor", parameters);

Подскажите пожалуйста, в чем может быть проблема?
И какие еще есть способы запустить БП из серверного кода, с передачей параметров?

Насколько я понимаю когда БП запускается через AppScheduler, не получиться получить UserConnetion, какие есть альтернативы UserConnetion, для того что бы подобный код работал:

StoredProcedure SomeProcedure= new StoredProcedure(UserConnection, "SomeProcedure") as StoredProcedure;
SomeProcedure.PackageName = UserConnection.DBEngine.SystemPackageName;
SomeProcedure.Execute();
return true;

Нравится

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

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

Как-то все смешалось.
UserConnection берется пользователя, указанного в параметре userName. Вы точно передаете корректные параметры в процесс?

По вызову хранимой процедуры из элемента "Задание-сценарий". Корректный вызов следующий:
StoredProcedure SomeProcedure = new StoredProcedure(UserConnection, "SomeProcedure") as StoredProcedure;
SomeProcedure.Execute();

Также Вы можете задавать права доступа непосредственно из процедурой SomeProcedure, вызвав ее из процесса, передавая в нее нужные параметры, например, Id записи. Код элемента "Задание-сценарий":

var Id=new.Guid("e24018bf-4ef6-49ef-a331-4fdb6b742e4c");
StoredProcedure SomeProcedure = new StoredProcedure(UserConnection, "SomeProcedure")
.WithParameter("Id", Id) as StoredProcedure;
SomeProcedure.Execute();
return true;

Алексей, со второй частью понятно. А что насчет первой "не отрабатывает элемент процесса "Изменить права доступа", при запуске процесса используя AppScheduler" и какие еще есть способы запустить БП из серверного кода, с передачей параметров?

Как вариант вызвать процесс через вебсервис. Более подробно описано здесь.

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

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

Возникает ошибка при попытке вывода из bpm'online 7.5 раздел "Договор" печатной формы MS Word.
При формировании печатных форм все работает корректно, но после добавления табличных данных из детали "продукты в договоре" возникает следующая ошибка:

Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: "Ссылка на объект не указывает на экземпляр объекта.". Дополнительные сведения см. в журналах сервера. Трассировка стека исключений:
в Terrasoft.Configuration.ReportService.ReportHelper.GetReportFile(String key)
в Terrasoft.Configuration.ReportService.ReportService.GetReportFile(String key)
в SyncInvokeGetReportFile(Object , Object[] , Object[] )
в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

возможно на данную ошибку повлияли проблемы при установке 760_Terrasoft.Setup.Desktop.MSWordReportDesigner_RUS, который не до конца проинсталлировался, но работает.

Нравится

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

Добрый день, Андрей.

Сообщите, пожалуйста подробнее, на каком этапе появляется данная ошибка?
Также, Вы пробовали создать печатную форму с "нуля"?

Илья,

я создал несколько печатных форм MS Word, при этом использовал поля из раздела "Документы", все работает корректно, печатные формы формируются из раздела "Договоры".
Затем понадобилось добавить в печатные формы данные из детали "Продукты". Настроил поля, добавил в шаблон печатной формы, сохранил. Ошибка возникает при попытке сформировать печатную форму, нажатием кнопки "печать" и выбором наименования печ. формы при нахождении в разделе "Договоры".

И еще одна особенность - как только я удаляю в шаблоне поля из детали (табличное представление данных) все работает, ошибки нет.

Формы создавал "с нуля".

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

После удаления всех шаблонных форм получилось, пока вопрос снимаю, спасибо!

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

Добрый день!

Хотел поинтересоваться у знатоков, как добавлять системные переменные и каков синтаксис по их использованию: запись и считывание значения? Нашел пример для 7-ки:

https://community.terrasoft.ua/forum/topic/12369

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

Нравится

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

Если речь о системных настройках, как по ссылке, то так:

var maxFileSize = (int)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "MaxFileSize");
...
Terrasoft.Core.Configuration.SysSettings.SetValue(UserConnection, "GoogleContactSynchInterval", GoogleContactSynchInterval);

Тип переменной может быть различным.

Добрый день!
В инструментах есть вкладка "Системные настройки", там Вы можете ее добавлять/изменять
Из С# кода (пример):

var value = (Guid)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "SomeName");
 
Terrasoft.Core.Configuration.SysSettings.SetValue(UserConnection, UserConnection.RootAdminUnitGroupId, "SomeName", someValue);

Спасибо, коллеги! Очень признателен за ответы!

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

Здравствуйте. Это кусок кода из документации.

  1. Создать новый проект в Visual Studio, в котором будет выполняться отладка.
  2. Выгрузить исходные коды конфигурации bpm'online в локальную папку и загрузить их в проект.
  3. Из проекта прикрепиться к рабочему процессу сервера IIS и начать процесс отладки.

Выгрузить исходные коды конфигурации bpm'online - откуда берутся эти файлы. Т.е. где взять исходные коды конфигурации.
Спасибо.

Нравится

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

Здравствуйте.
Если это on-demand, то отлаживаться не получится. Если он-сайт, то исходники выгружаются во время компиляции конфигурации в одну из подпапок (зависит от номера воркспейса) папки %Temp%\BPMonline\.

Здравствуйте. Спасибо за ответ!
Ситуация такая... Клиент просто купил лицензию real estate. Дошло время до того, чтобы развернуть локально проект. Как это сделать? Все что у нас есть, доступ к административной панели (сайту). Спасибо.

Это невозможно получается?

Здравствуйте.
Технически возможно, но нужно решить ряд организационных вопросов. Дело в том, что при переносе системы с On-Demand на On-Site нужно будет перезаказывать лицензии. Они отличаются по стоимости (On-Demand и On-Site).

Всё делаю именно так.
Но почему то при выполнении процесса, но на breakpoint процесс не останавливается?

"Александр Зубков" написал:

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

Взгляните сюда: http://academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/ServerCodeD...

Здравствуйте. Ваша ссылка нерабочая. Не могли бы вы её обновить?

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

Добрый день!
Подскажите, как в планировании зафиксировать шапку таблицы, чтоб она не уезжала при прокрутке.
Также интересует, как добавить столбцы, которые также будут фиксированы?

Нравится

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

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

Детализируйте, пожалуйста, свой запрос, желательно с использованием скриншотов.

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

Добрый день!

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

Спасибо заранее!

Нравится

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

Здравствуйте, Виталий!

Не совсем ясна Ваша задача. Вам необходимо проводить отладку процесса, но при этом Вам необходимы данные страницы. Вы можете создать параметры процесса и передать туда параметры со страницы (на самом деле достаточно передать Id записи, а потом элементом "Чтение данных" подтянуть остальные параметры). Уточните, пожалуйста, Вашу задачу.

А также уточните, пожалуйста, версию и продукт, в котором Вы работаете.

Спасибо, что уделили время моему вопросу!

Программный продукт: Realty v5.4. (вроде ж тему создал в нужном разделе...)

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

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

Page.someCheckBox1Edit.Value

А вот если я беру произвольный процесс (запущенный по множественной цепочке и модуля процесса моей формы), и при этом моя форма остается открыта, как я могу взять то же значение моего чекбокса?

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

UserConnection.OpenedPages.GetPage("MyPage").someCheckBox1Edit.Value

Это не реальный код, а просто прообраз того, как (может быть - потому и спрашиваю!) мне получить то, что мне нужно.

Думал как-то прикрутить это:

GetInstanceByName()

но как-то ума не приложу, что и к чему...(

Боюсь, что такого механизма нет и придётся вручную записывать и считывать значения в UserConnection.SessionData. Примеры работы с ней можно найти на Community или в исходниках других страниц.

Нашел по "UserConnection.SessionData" вот это:

http://www.community.terrasoft.ua/forum/topic/9471

Среди всех постов есть вот такой код, по которому у меня еще несколько вопросов:

var defValuesId = new Guid("775F0C4C-9176-449E-B284-4108272F87AA");
var defValues = new Dictionary <string, object>();
 
defValues.Add("Type", new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6"));
defValues.Add("Account", Customer );
defValues.Add("PGNHK_AuctionLot", AuctionLot );
defValues.Add("Notes", Notes );
 
UserConnection.SessionData[defValuesId.ToString()] = defValues;

Правильно ли я понял. Для текущего пользователя создается переменная с названием "defValuesId.ToString()" и в нее передается коллекция "defValues" типа "Dictionary()" с ранее инициализированными значениями этой коллекции. В любом (в любом?) другом месте я, используя код:

var myDefValues = UserConnection.SessionData["775F0C4C-9176-449E-B284-4108272F87AA"];

могу получить значения, сохраненные в той переменной моей же сессии (только этого пользователя). При чем могу эти значения вычитать произвольное количество раз и записать произвольное количество раз.

Всё ли я правильно понял? Самое основное, что меня интересует - это отсутствие привязки к месту, где я обращаюсь к значению, сохраненному в переменной моей сессии.

Да, Вы правы. Но только в пределах сессии пользователя. Если параллельный процес запущен по какому-то событию в пользовательском интерфейсе, то нормально. А если по таймеру-кварцу или внешней интеграции — сессия уже, наверно, другая.

Это как раз то, что мне нужно. Александр, очень благодарен Вам!

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

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

Нравится

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

Здравствуйте! Посмотрите, пожалуйста, эту ветку https://community.terrasoft.ru/questions/kak-uznat-v-kakom-kanale-sozda…. Если у Вас возникнут вопросы по решению - буду готов ответить.

Здравствуйте. Возникли, да. Делают так же, как в предпоследнем посте

"Татаровская Дарья" написал:
Демьяник Алексей Олегович пишет:

Ну и остался последний шаг - элементом "Добавить данные" необходимо добавить запись в объект "Уведомления", указав значения полям "Кому" (ответственному), "Объект" (UId объекта), "Уникальный идентификатор записи" (Экземпляр объекта), Время (Текущая дата и время).

Хотела бы добавить уведомление по объекту(обращение) с помощью элеманта "Добавить данные"

у уведомления есть следующие поля

"Кому" - это ответственный

"Объект" - UID схемы объекта, по которому должно прийти уведомление

"Уникальный идентификатор заголовка" - это идентификатор самого объекта

"Время" - текущая дата и время

"Автор" - текущий контакт

SubjectCaption - это наименование уведомления

но есть еще

"SourceId" (Источник) - что такое источник? что необходимо туда вписывать?

"Hash" - хэш код. что такое хэш код в данном случае, каким образом его формировать, напишите, пожалуйста

Предполагаю, что влияет на заголовок самого уведомления?(чтобы писалось не просто обращение, а обращение № такое-то)


но после выполнения ничего не появляется в ленте. Давайте опишу ситуацию полностью) Есть БП в котором выполняется какая то выборка(расчет зп водителя)и для каждого контакта добавляется объект, а по окончанию всего этого в ленту должно падать типа "все добавлено\посчитано" не важно какой текст, главное что бы в ленте как то это отображалось. В " добавить данные 2" беру объект уведомления, значения полей: кому из словаря контакты, время - системное время, а вот поля объект и уникальный идентифекатор заголовка не понимаю откуда брать. Ставил объект который добавляется для каждого контакта, а никальный ид не помню чей уже, но не сработало. Ничего не появилось в уведомлениях. Вт хотел бы уточнить, как заполнить объект и уникальный ид или мб в другом дело?

Павел, добрый день!

Уведомления привязаны к конкретной записи. Во вложении пример БП, который создает уведомления для существующей активности(пример был создан в версии 7.6).
1. Уникальный идентификатор заголовка – Id записи, к которой привязано уведомление (например, Id активности в таблице Activity).
2. Объект – идентификатор схемы объекта. Значение можно выбрать из справочника (например, Объект раздела (представление).Активность)
usrcreateremind.rar

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

defValues.Add("Symptoms", Page.TitleEdit.Value.ToString());

А если поле имеет тип дата/время, то, подскажите, пожалуйста, как правильно написать то же самое?

Нравится

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