Всем доброго времени суток. Версия 7.12.

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

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

"UsrValue":{
				"dataValueType": Terrasoft.DataValueType.TEXT,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
			},

И далее в diff добавляем текстовое поле стандартным образом.

На детали выглядит это следующим образом:

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

Вместо поля - пустое место, а в консоли - ошибка: "Невозможно найти колонку по конфигурации". 

Насколько я понимаю, ошибка возникает из-за того, что diff грузится быстрее, чем attributes и не срабатывает bindTo в свойствах.

В итоге сделал через всплывающие мини-карточки, но вообще можно ли как-то обойти эту ошибку?

 

Нравится

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

Привидите diff

Похожее делается на детали «Хронология» (схема TimelineSchema), там тоже в шапке есть текстовое поле поиска. Там блок фильтров реализован в отдельной TimelineFiltersSchema, виртуальная колонка SearchText добавляется точно так же, как у Вас. Посмотрите, как дальше с ней работают, может, что-то пропустили.

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

Добрый день!

1) Правильно я понимаю, что для интеграции Terrasoft с внешними приложениями необходимо развернуть его on-site? Или в админке где-то есть утилита для написания web-сервисов, где можно посмотреть примеры реализации?



2) Как отлаживать в VS?

Нравится

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

НЕ забывайте про интеграционные сервисы  (Odata) подробнее тут 

1) Не имеет значения, в облаке или у вас на сервере. Создаете схемы типа "Исходный код" и пишите всю логику. Так же есть вариант через бизнес процессы.

2) https://academy.terrasoft.ru/documents/technic-sdk/7-12/otladka-servern…

НЕ забывайте про интеграционные сервисы  (Odata) подробнее тут 

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

Добрый день.

Не запускается процесс "Загрузить письма из Exchange". Доступ к почтовому ящику предоставлен, рассылка писем с изменением статуса происходит, но регистрация новых сообщений нет.

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

Через командную строку так же не получается его запустить, т.к. его там нет.

Нравится

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

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

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

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

Добрый день. Прошу проконсультировать.

У некоторых контактов системы bpm'online может быть одна почта на несколько человек, то есть при написании пользователем на почту bpm создается обращение, пользователь сервиса выбирается наугад, какие пути решения можно найти, чтобы bpm правильно выбирал контакт? Сделать проверку какую то? Знаю что ящики должны быть персонализированы, но этот факт нельзя сменить.

Нравится

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

Написать БП  настроенный на создание активности с типом email и направлением входящая. В нем анализировать поля (от кого и тд) и менять поле ответственного и/или привязывать почту к нужной задаче клиенту и тд.

Те как вариант по полю от кого поискать в деталях средство связи контакта (контрагента), найти о какого контакта пришло письмо. И подвязать письмо в историю к контакту.

Или найти последний открытый заказ (проблему, обращение) и тд и привязать туда.

Или найти ответственное лицо контакта и к нему.

Определить (лиц группу лиц) на которых отправлять письма отправителя которых неудалось установить.

Написать БП  настроенный на создание активности с типом email и направлением входящая. В нем анализировать поля (от кого и тд) и менять поле ответственного и/или привязывать почту к нужной задаче клиенту и тд.

Те как вариант по полю от кого поискать в деталях средство связи контакта (контрагента), найти о какого контакта пришло письмо. И подвязать письмо в историю к контакту.

Или найти последний открытый заказ (проблему, обращение) и тд и привязать туда.

Или найти ответственное лицо контакта и к нему.

Определить (лиц группу лиц) на которых отправлять письма отправителя которых неудалось установить.

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

Коллеги, всем доброго дня!

Можно ли проводить настройку форм на портале силами аналитика? Если можно то как?

Видел что имеется 2 вида портальных лицензий: SELF-SERVICE PORTAL и  CUSTOMER PORTAL. У CUSTOMER PORTAL заявлена возможность создавать до 3 кастомных разделов на портале. 

Где можно почитать про это? Как это реализовывается? Нужна разработка или достаточно настройки аналитиком?

Нравится

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

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

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

Григорий Чех,

мастер не предоставляет практически ничего. Огромный минус для платформы, которая называет себя low cod

Шувалов Николай Юрьевич,

Значит нужно программировать, унаследовать и переопределить страничку обращения для портала или создать свою по аналогии. Аналогично с разделом. Для портала было огранчено количество объектов доступ к которым можно дать через портал (раньше было не больше 40) Подробности лучше запросить у тех поддержки!

Показать все комментарии
Отчёты
service_enterprise
7.12
service

Добрый день!

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

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

 

Нравится

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

Вариантов много например так: создайте объект (по которой в дальнейшем можно и деталь сделать прикрепленную к обращению и отчет построить ) в которой будут колонки:

1) Id обращения (или сразу номер обращения для отчета)

2) код статуса (или сразу название статуса для отчета)

2) время установки статуса

3) время закрытия статуса

Создайте БП который по смене статуса будет вносить корректировки в выше созданый объект. А по созданию обращения делать первую запись. Таким образом при переходе в согласование например смотрите какой статус был раньше (в обращениях была колонка - приведущий статус) и для объекта меняете время закрытия преведущего статуса для текущего обращения. И вносите время установки для текущего статуса. Как то так.

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

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

И как вариант можно настроить журнал изменения на отслеживание изменения статуса обращения и оттуда дергать данные для отчета. Вместо журнала изменений можно использовать вариант с тригером в БД для тех же целей (логирование изминения статуса обращения).

 

 

 

 

Вариантов много например так: создайте объект (по которой в дальнейшем можно и деталь сделать прикрепленную к обращению и отчет построить ) в которой будут колонки:

1) Id обращения (или сразу номер обращения для отчета)

2) код статуса (или сразу название статуса для отчета)

2) время установки статуса

3) время закрытия статуса

Создайте БП который по смене статуса будет вносить корректировки в выше созданый объект. А по созданию обращения делать первую запись. Таким образом при переходе в согласование например смотрите какой статус был раньше (в обращениях была колонка - приведущий статус) и для объекта меняете время закрытия преведущего статуса для текущего обращения. И вносите время установки для текущего статуса. Как то так.

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

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

И как вариант можно настроить журнал изменения на отслеживание изменения статуса обращения и оттуда дергать данные для отчета. Вместо журнала изменений можно использовать вариант с тригером в БД для тех же целей (логирование изминения статуса обращения).

 

 

 

 

Показать все комментарии
Корпоративная символика
7.11
service

Можно ли сбросить изображение корпоративной символики на первоначальный bpm'online?

Нравится

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

Для єтого нужно віполнить sql запрос 

SET DATEFORMAT ymd
SET ARITHABORT, ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, NOCOUNT ON
SET NUMERIC_ROUNDABORT, IMPLICIT_TRANSACTIONS, XACT_ABORT OFF
GO
 
EXEC(N'UPDATE SysSettingsValue SET ModifiedOn = ''2017-07-09 17:15:37.1080000'', CreatedOn = NULL, CreatedById = NULL, ModifiedById = ''410006e1-ca4e-4502-a9ec-e54d922d2c00'', SysSettingsId = ''709f0e87-f36c-1411-2684-001d6026abed'', SysAdminUnitId = ''a29a3ba5-4b0d-de11-9a51-005056c00008'', IsDef = CONVERT(bit, ''True''), TextValue = N'''', IntegerValue = 0, FloatValue = 0.00, BooleanValue = CONVERT(bit, ''False''), DateTimeValue = NULL, GuidValue = NULL, BinaryValue = 0x89504E470D0A1A0A0000000D49484452000000860000001C0806000000A484C7B40000001974455874536F6674776172650041646F626520496D616765526561647971C9653C0000038069545874584D4C3A636F6D2E61646F62652E786D7000000000003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D2241646F626520584D5020436F726520352E362D633036372037392E3135373734372C20323031352F30332F33302D32333A34303A34322020202020202020223E203C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61626F75743D222220786D6C6E733A786D704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E733A73745265663D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F73547970652F5265736F75726365526566232220786D6C6E733A786D703D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F2220786D704D4D3A4F726967696E616C446F63756D656E7449443D22786D702E6469643A44423734433539374237324445343131393931344133443346433841454236452220786D704D4D3A446F63756D656E7449443D22786D702E6469643A32384334443633443843363331314535413442434139323439453334413132342220786D704D4D3A496E7374616E636549443D22786D702E6969643A32384334443633433843363331314535413442434139323439453334413132342220786D703A43726561746F72546F6F6C3D2241646F62652050686F746F73686F702043432032303135202857696E646F777329223E203C786D704D4D3A4465726976656446726F6D2073745265663A696E7374616E636549443D22786D702E6969643A32353938616132362D346334622D393434302D616532642D666165633264653163373064222073745265663A646F63756D656E7449443D2261646F62653A646F6369643A70686F746F73686F703A31326565643931362D373063622D313165352D623265362D383761343838663664316533222F3E203C2F7264663A4465736372697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E203C3F787061636B657420656E643D2272223F3ECF9C56F8000007C34944415478DAEC5A0B944E5514FE8D3F8DF763500A0D91E5399256497AD1188FA2B27A8921427A501235A1A495C75A480A795494C74A1E23AF421E4B4645C2F2483283AC41C6908624FA3EBEBF75BADD7BFFFB8F6166D6BA7BAD6F9DFBDFBBCF3EFB9CB3CF3EFBECF307CBB51896190804F61E5EDCAF5EC0A7CB4618F73528EA02F530F67BF5EE7514838017F06E746EEA170594044AF85375D9A9B8C63E2A2F2A17E5CF8F4F7614F487204FD178601EF0AB6F183EFD4B882BD251A4E7598F8120A80C8322ED838780CD50FA6484C1551105579491016CCF868CA2286A01858134D44F73E0BB164515E00CB0037C99A16F2706C4D64471A5A5CA91626FA6EEB3C8B85A328A687228E7EF08F5653B6CAF14DB509FCF5CA2E0B51C8AEA0A07F6398D8D43DDD2EA6B31D5DD63E52900A6731AF4583C57C6F348A08DC568B28059C02BE03B68D310BF5D836F4DD4E8DB4022106DB0FD01CC015E0B45E11619935034049A00D46918F0A445C6F74037D4FF4175EE413114B8D9E061DDB9402FF0ED8761BC85E7572DCD25C03096A27E013C3F0CF4036EB4F01C05660283B592ADFA2E529FEBE3B9B8F4609F8B1A6C27B43D0CB42E0AD4D984228E13846FA97AD703053102EF3ED53B8E09C72619EF06E277033C8F02EEB0A8B41318009ECF5C0CA2117501E22DF1E56E8DF724D43FF71FC3005A02AB14292703EB0076A68E062F46DEA3192A6FB1E9642C504DF5AE07BE04560299B26CCAA8A8016F0119EB2D32C87B27701DF0055003582EA5B98A133811C0714D223B39553A2DD30AA5FC5632260E76C33D0DC7FD89F227A0829A5A02A36881F60AE1793AF0107016F80AE01192FC55F5BEBCE4DF6FA36FAA742DAD7AB581AF818D92C7096CCA31D6FB78D37B3818C6FF8EAB787797EA7FACFE2ED6225BA4792BA376AA4B7477D4FDC0C6289E434199F4820B80EFF44CAFDE4E5E99C698484F19344E273380639C1C7CD866119A84629A067D0E7EC78127CBC62827C98D36C1F7B53632C6025D80F9F85D1B3C476C644CD460D6C1F75D467D2A3E1FB8573C8D81C9F20C270DBE58191427B72F8CA03FBC06DB9EA2817851ACEF69F219'
+ N'E8B5818C0D167D5F463106E8CC85A23EA73B048C74C90DF07D93450657F512E06EA0BD2637BB7415406F301BE889B68E19ED70FE46A86F23F17B36BE6718DF5BA92FEC6B02BE6DB5999BF9D271073024E44E2AC9E2E2AD46A1A088ABFC41608BBC426F1BC54B680B6A67350AC93885E229790376F20D8701E060B6358D42F54F1AED720BE124F4B0BA68ADBED0D6D15A252784DBCFFB3094ED18086E3D5DE5119B5A8D42724EC88893E5390639E8FB00178CD5282463358AE1FAF9C8458615099AB48EA651A81D7AA8BEC02E6D6509C6A4D3334E50FCD5D26A14AABF4F6345634A429D0AE63E33060CBFB844CCA7B5179F7757362C5CE50BC1B7CA4506B7AD3EFAD9090A14B3619B05BEDD0EF5B74979D2580D881DAD54C9AD270063205F4FC3187BA91C05193BC3E8FBBCB68644E85BD2866D86DD62322859E50D3910730E720A8835160BF5B3A6F1E95180C1F974F06C76E9EB0179746EC389A6614CF7A0D852EDE5953148D5EC06C9C3918CFBFD7A5976631B96156144FCAEF25BB766AC093C18470A7044016773BD9EE241DF34EDF1851DF45D144644E8F453F6228D22CB3078274A33B2AA21BA4FE54C0F6DCC55D92CCA6874AB87413AAB934140418B953678ECE43A950D6CBEEDF52823238C9E4E544993F49B93678A50DFED61EAFE954327D4DDD93CFADE6AE9831B6DD3A92E2E147C1E0C3398261D705901E911CA88B1F996E9514676F303E52D2B39127DCBBB78B04B4D472F22683D5F1FDED26B9DB2C16C587568420ADA7C3BED5146A8BD42B998D48BC4B04EE7A2BE667E26D22418FB7A851180473C4891EC7F312E165CD6E3561013A177C849CA70F156E1F4CDC86729F633308E2CE581BAE900E1894231461908A8E8B14E9CCA5D36DFEA7A9451DFC8D65D6E4A5512AB0AFA5C2A427D7F0EE43F0AA5BB6B78F030050166726B4559CEE3E12AD6555693D9C71F6D58DA7A9051427908D2DA5C58455C35DFE878ED45DF68232FB02A1F1AC61A95F11E781B29DF33D2348C3EBAF872A32495D31CCED3ED21A36A18192FC9B5AD08A582738126AAECAF897723E63198F65E1DC129262FD1872A9FD1259F1B3DADF2F328C3A5337A9DA94C99DDCA793670217BC7287CB8CB997D8E2ED2EC647085F657C2282917078BA9E58D72AF935DFACC4CEE10057E03F2A151D04332DFC3241B6F53C72B7DEE34378F2B17F249D0386632EBF52E5D0998862A09C5CB9A3AB2A4369AD0AE76B7A3A2EE4AF8EC800CE6EE97C99078D9C49BC78EE2E32D6D4A2E0765BC385AADC1B809BF476B8B61B046AFC77B830EDA72FA2ABD9D5FA9ABF2189D80EA9A9B1485040C0DBAC833F28AA003AF1982C6608D45051E2379D89D6A97605164EB9699DCA4F881176E23ECE6845B16644CCB032B698FAEB4A9E713C0381B365E11F406EF827C6C14ECEB61F4F5363CBE13B89022B7CBE03251D739748B1C948B392501132080696D5EC1F31A9969E0835A49EBBC24C1E80920A3A602B65B0217AEF13365348B5DFEAC4385A38D649213DD2EBD8F87E1AB220FE7A62BFBD611FAF20EA8B9EAB0CF87B4C2525CFEAC13D2637F183D8E3BE8D2527911B33EBDD6479663718A3947618829FE797663837EB04F8FA1AFDC125BCB2B466B7EE90D979BF35B20272CD2F86F4169F3DF533EE55FF2FF25EE936F183EF986E1936F183E5D0AFA47800100EBF70302887CDF2D0000000049454E44AE426082, Position = 2147483647, ProcessListeners = 0 WHERE Id = ''a56ebc70-5813-e361-900c-00535d043266''')
GO

 

Откройте дизайнер системы. В группе [Настройка внешнего вида] щелкните по ссылке [Настройка корпоративной символики]. (Для открытия страницы настройки пользователь должен иметь доступ к системной операции “Изменения корпоративной символики” --"CanManageLogo").

Замените [Логотип на странице входа в систему] - Логотип, который будет отображаться на странице авторизации. (61x310 пикселей). Изображение сохраняется в системной настройке “Логотип компании” (LogoImage).

Григорий, спасибо за ответ, но я имел в виду, как вернуть первоначальное лого bpm'online?

Для єтого нужно віполнить sql запрос 

SET DATEFORMAT ymd
SET ARITHABORT, ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, NOCOUNT ON
SET NUMERIC_ROUNDABORT, IMPLICIT_TRANSACTIONS, XACT_ABORT OFF
GO
 
EXEC(N'UPDATE SysSettingsValue SET ModifiedOn = ''2017-07-09 17:15:37.1080000'', CreatedOn = NULL, CreatedById = NULL, ModifiedById = ''410006e1-ca4e-4502-a9ec-e54d922d2c00'', SysSettingsId = ''709f0e87-f36c-1411-2684-001d6026abed'', SysAdminUnitId = ''a29a3ba5-4b0d-de11-9a51-005056c00008'', IsDef = CONVERT(bit, ''True''), TextValue = N'''', IntegerValue = 0, FloatValue = 0.00, BooleanValue = CONVERT(bit, ''False''), DateTimeValue = NULL, GuidValue = NULL, BinaryValue = 0x89504E470D0A1A0A0000000D49484452000000860000001C0806000000A484C7B40000001974455874536F6674776172650041646F626520496D616765526561647971C9653C0000038069545874584D4C3A636F6D2E61646F62652E786D7000000000003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D2241646F626520584D5020436F726520352E362D633036372037392E3135373734372C20323031352F30332F33302D32333A34303A34322020202020202020223E203C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61626F75743D222220786D6C6E733A786D704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E733A73745265663D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F73547970652F5265736F75726365526566232220786D6C6E733A786D703D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F2220786D704D4D3A4F726967696E616C446F63756D656E7449443D22786D702E6469643A44423734433539374237324445343131393931344133443346433841454236452220786D704D4D3A446F63756D656E7449443D22786D702E6469643A32384334443633443843363331314535413442434139323439453334413132342220786D704D4D3A496E7374616E636549443D22786D702E6969643A32384334443633433843363331314535413442434139323439453334413132342220786D703A43726561746F72546F6F6C3D2241646F62652050686F746F73686F702043432032303135202857696E646F777329223E203C786D704D4D3A4465726976656446726F6D2073745265663A696E7374616E636549443D22786D702E6969643A32353938616132362D346334622D393434302D616532642D666165633264653163373064222073745265663A646F63756D656E7449443D2261646F62653A646F6369643A70686F746F73686F703A31326565643931362D373063622D313165352D623265362D383761343838663664316533222F3E203C2F7264663A4465736372697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E203C3F787061636B657420656E643D2272223F3ECF9C56F8000007C34944415478DAEC5A0B944E5514FE8D3F8DF763500A0D91E5399256497AD1188FA2B27A8921427A501235A1A495C75A480A795494C74A1E23AF421E4B4645C2F2483283AC41C6908624FA3EBEBF75BADD7BFFFB8F6166D6BA7BAD6F9DFBDFBBCF3EFB9CB3CF3EFBECF307CBB51896190804F61E5EDCAF5EC0A7CB4618F73528EA02F530F67BF5EE7514838017F06E746EEA170594044AF85375D9A9B8C63E2A2F2A17E5CF8F4F7614F487204FD178601EF0AB6F183EFD4B882BD251A4E7598F8120A80C8322ED838780CD50FA6484C1551105579491016CCF868CA2286A01858134D44F73E0BB164515E00CB0037C99A16F2706C4D64471A5A5CA91626FA6EEB3C8B85A328A687228E7EF08F5653B6CAF14DB509FCF5CA2E0B51C8AEA0A07F6398D8D43DDD2EA6B31D5DD63E52900A6731AF4583C57C6F348A08DC568B28059C02BE03B68D310BF5D836F4DD4E8DB4022106DB0FD01CC015E0B45E11619935034049A00D46918F0A445C6F74037D4FF4175EE413114B8D9E061DDB9402FF0ED8761BC85E7572DCD25C03096A27E013C3F0CF4036EB4F01C05660283B592ADFA2E529FEBE3B9B8F4609F8B1A6C27B43D0CB42E0AD4D984228E13846FA97AD703053102EF3ED53B8E09C72619EF06E277033C8F02EEB0A8B41318009ECF5C0CA2117501E22DF1E56E8DF724D43FF71FC3005A02AB14292703EB0076A68E062F46DEA3192A6FB1E9642C504DF5AE07BE04560299B26CCAA8A8016F0119EB2D32C87B27701DF0055003582EA5B98A133811C0714D223B39553A2DD30AA5FC5632260E76C33D0DC7FD89F227A0829A5A02A36881F60AE1793AF0107016F80AE01192FC55F5BEBCE4DF6FA36FAA742DAD7AB581AF818D92C7096CCA31D6FB78D37B3818C6FF8EAB787797EA7FACFE2ED6225BA4792BA376AA4B7477D4FDC0C6289E434199F4820B80EFF44CAFDE4E5E99C698484F19344E273380639C1C7CD866119A84629A067D0E7EC78127CBC62827C98D36C1F7B53632C6025D80F9F85D1B3C476C644CD460D6C1F75D467D2A3E1FB8573C8D81C9F20C270DBE58191427B72F8CA03FBC06DB9EA2817851ACEF69F219'
+ N'E8B5818C0D167D5F463106E8CC85A23EA73B048C74C90DF07D93450657F512E06EA0BD2637BB7415406F301BE889B68E19ED70FE46A86F23F17B36BE6718DF5BA92FEC6B02BE6DB5999BF9D271073024E44E2AC9E2E2AD46A1A088ABFC41608BBC426F1BC54B680B6A67350AC93885E229790376F20D8701E060B6358D42F54F1AED720BE124F4B0BA68ADBED0D6D15A252784DBCFFB3094ED18086E3D5DE5119B5A8D42724EC88893E5390639E8FB00178CD5282463358AE1FAF9C8458615099AB48EA651A81D7AA8BEC02E6D6509C6A4D3334E50FCD5D26A14AABF4F6345634A429D0AE63E33060CBFB844CCA7B5179F7757362C5CE50BC1B7CA4506B7AD3EFAD9090A14B3619B05BEDD0EF5B74979D2580D881DAD54C9AD270063205F4FC3187BA91C05193BC3E8FBBCB68644E85BD2866D86DD62322859E50D3910730E720A8835160BF5B3A6F1E95180C1F974F06C76E9EB0179746EC389A6614CF7A0D852EDE5953148D5EC06C9C3918CFBFD7A5976631B96156144FCAEF25BB766AC093C18470A7044016773BD9EE241DF34EDF1851DF45D144644E8F453F6228D22CB3078274A33B2AA21BA4FE54C0F6DCC55D92CCA6874AB87413AAB934140418B953678ECE43A950D6CBEEDF52823238C9E4E544993F49B93678A50DFED61EAFE954327D4DDD93CFADE6AE9831B6DD3A92E2E147C1E0C3398261D705901E911CA88B1F996E9514676F303E52D2B39127DCBBB78B04B4D472F22683D5F1FDED26B9DB2C16C587568420ADA7C3BED5146A8BD42B998D48BC4B04EE7A2BE667E26D22418FB7A851180473C4891EC7F312E165CD6E3561013A177C849CA70F156E1F4CDC86729F633308E2CE581BAE900E1894231461908A8E8B14E9CCA5D36DFEA7A9451DFC8D65D6E4A5512AB0AFA5C2A427D7F0EE43F0AA5BB6B78F030050166726B4559CEE3E12AD6555693D9C71F6D58DA7A9051427908D2DA5C58455C35DFE878ED45DF68232FB02A1F1AC61A95F11E781B29DF33D2348C3EBAF872A32495D31CCED3ED21A36A18192FC9B5AD08A582738126AAECAF897723E63198F65E1DC129262FD1872A9FD1259F1B3DADF2F328C3A5337A9DA94C99DDCA793670217BC7287CB8CB997D8E2ED2EC647085F657C2282917078BA9E58D72AF935DFACC4CEE10057E03F2A151D04332DFC3241B6F53C72B7DEE34378F2B17F249D0386632EBF52E5D0998862A09C5CB9A3AB2A4369AD0AE76B7A3A2EE4AF8EC800CE6EE97C99078D9C49BC78EE2E32D6D4A2E0765BC385AADC1B809BF476B8B61B046AFC77B830EDA72FA2ABD9D5FA9ABF2189D80EA9A9B1485040C0DBAC833F28AA003AF1982C6608D45051E2379D89D6A97605164EB9699DCA4F881176E23ECE6845B16644CCB032B698FAEB4A9E713C0381B365E11F406EF827C6C14ECEB61F4F5363CBE13B89022B7CBE03251D739748B1C948B392501132080696D5EC1F31A9969E0835A49EBBC24C1E80920A3A602B65B0217AEF13365348B5DFEAC4385A38D649213DD2EBD8F87E1AB220FE7A62BFBD611FAF20EA8B9EAB0CF87B4C2525CFEAC13D2637F183D8E3BE8D2527911B33EBDD6479663718A3947618829FE797663837EB04F8FA1AFDC125BCB2B466B7EE90D979BF35B20272CD2F86F4169F3DF533EE55FF2FF25EE936F183EF986E1936F183E5D0AFA47800100EBF70302887CDF2D0000000049454E44AE426082, Position = 2147483647, ProcessListeners = 0 WHERE Id = ''a56ebc70-5813-e361-900c-00535d043266''')
GO

 

Или просто создать демо-сайт, скачать картинку оттуда и загрузить себе.

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

Добрый день!

Может кто сталкивался с подобной задачей:

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

Задача довольно интересная, надеюсь кто-то ее действительно решал.

Нравится

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

Правильно разделять. Система позволяет добавлять несколько телефонов одного типа. Разделите и потом не будет проблем с поиском/объединением дублей,  IP телефонией и sms рассылками. 

Правильно разделять. Система позволяет добавлять несколько телефонов одного типа. Разделите и потом не будет проблем с поиском/объединением дублей,  IP телефонией и sms рассылками. 

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

Добрый день!



Стал вопрос об обновлении реестра детали в конце работы БП. 



В чем суть:



1) На детали, в редактируемом реестре, изменяются значения (кол-во работ) или добавляется новая строка

2) БП ловит добавление/изменение и высчитывает сумму (кол-во работ * стоимость) и записывает это в поле, отображающееся в реестре детали



3) Требуется обновление этого реестра



И если первые 2 пункта выполняются на "ура" и без проблем, то с реализацией 3 пункта у меня появились проблемы. При этом хотелось бы выполнить все в одном БП, возможно поможет элемент процесса [Задание-сценарий]? Был бы благодарен за предоставленную помощь.

Нравится

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

Опишу более подробно 2й варинат

1) в конце БП  добавить скрипт таск и в нем

//ваше сообщение
string sender = "MyBpFinish";
//Доп. информация
string messageText
// Публикация сообщения по WebSocket.
MsgChannelUtilities.PostMessageToAll(sender, messageText);

2) Создать замещающий клиентский модуль ,  задав родительский объект схему ClientMessageBridge

define("ClientMessageBridge", ["ConfigurationConstants"],
    function(ConfigurationConstants) {
        return {
            // Сообщения.
            messages: {
                //Имя сообщения.
                "MyBpFinish": {
                    // Тип сообщения — широковещательное, без указания конкретного подписчика.
                    "mode": Terrasoft.MessageMode.BROADCAST,
                    // Направление сообщения — публикация.
                    "direction": Terrasoft.MessageDirectionType.PUBLISH
                }
            },
            methods: {
                // Инициализация схемы.
                init: function() {
                    // Вызов родительского метода.
                    this.callParent(arguments);
                    // Добавление нового конфигурационного объекта в коллекцию конфигурационных объектов.
                    this.addMessageConfig({
                        // Имя сообщения, получаемого по WebSocket.
                        sender: "MyBpFinish",
                        // Имя сообщения с которым оно будет разослано внутри системы.
                        messageName: "MyBpFinish"
                    });
                },
                // Метод, выполняемый после публикации сообщения.
                afterPublishMessage: function(
                    // Имя сообщения с которым оно было разослано внутри системы.
                    sandboxMessageName,
                    // Содержимое сообщения.
                    webSocketBody,
                    // Результат отправки сообщения.
                    result,
                    // Конфигурационный объект рассылки сообщения.
                    publishConfig) {
                    if (sandboxMessageName === "MyBpFinish") {
                        var name = webSocketBody.name;
                        window.console.info("Опубликовано сообщение: " + sandboxMessageName +
                            ". Данные: name: " + name );
                    }
                }
            }
        };
    });

3) Подписаться на получение сообщений MyBpFinish в любой клиентской схеме

 

define("AccountSectionV2", [],
    function(BusinessRuleModule, ConfigurationConstants) {
        return {
            //entitySchemaName: "Contact",
            messages: {
                //Имя сообщения.
                "MyBpFinish": {
                    "mode": Terrasoft.MessageMode.BROADCAST,
                    "direction": Terrasoft.MessageDirectionType.SUBSCRIBE
                }
            },
            methods: {
                // Инициализация схемы.
                init: function() {
                    this.callParent(arguments);
                    this.sandbox.subscribe("MyBpFinish", this.onMyBpFinish, this);
                },
                // Обработчик события получения сообщения NewUserSet.
                onMyBpFinish: function(args) {
                    //Обновим грид
                    this.refreshGridData();
                }
 
            }
        };
    });

 

При запуске БП передавай callback который вызовется после отработки БП

Примерно так

 

ProcessModuleUtilities.executeProcess({
	"sysProcessName": ProcessName,
	"parameters": {
		UsrParam1: paramValue
	},
	"callback": this.greadReloadProcessCallback(),
	scope: this
}

 

Григорий Чех,

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

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

Посмотри действие процесса Обновить запись в реестре

Второй вариант отправить по вєб сокету сообщение и подписатся в  реестре на него и по приходу сообщения обновить реестр.

Третий вариант убрать БП и по изминению поля или добавлению записи в детали пересчитывать в клиентском модуле сумму.

 

 

 

 

Опишу более подробно 2й варинат

1) в конце БП  добавить скрипт таск и в нем

//ваше сообщение
string sender = "MyBpFinish";
//Доп. информация
string messageText
// Публикация сообщения по WebSocket.
MsgChannelUtilities.PostMessageToAll(sender, messageText);

2) Создать замещающий клиентский модуль ,  задав родительский объект схему ClientMessageBridge

define("ClientMessageBridge", ["ConfigurationConstants"],
    function(ConfigurationConstants) {
        return {
            // Сообщения.
            messages: {
                //Имя сообщения.
                "MyBpFinish": {
                    // Тип сообщения — широковещательное, без указания конкретного подписчика.
                    "mode": Terrasoft.MessageMode.BROADCAST,
                    // Направление сообщения — публикация.
                    "direction": Terrasoft.MessageDirectionType.PUBLISH
                }
            },
            methods: {
                // Инициализация схемы.
                init: function() {
                    // Вызов родительского метода.
                    this.callParent(arguments);
                    // Добавление нового конфигурационного объекта в коллекцию конфигурационных объектов.
                    this.addMessageConfig({
                        // Имя сообщения, получаемого по WebSocket.
                        sender: "MyBpFinish",
                        // Имя сообщения с которым оно будет разослано внутри системы.
                        messageName: "MyBpFinish"
                    });
                },
                // Метод, выполняемый после публикации сообщения.
                afterPublishMessage: function(
                    // Имя сообщения с которым оно было разослано внутри системы.
                    sandboxMessageName,
                    // Содержимое сообщения.
                    webSocketBody,
                    // Результат отправки сообщения.
                    result,
                    // Конфигурационный объект рассылки сообщения.
                    publishConfig) {
                    if (sandboxMessageName === "MyBpFinish") {
                        var name = webSocketBody.name;
                        window.console.info("Опубликовано сообщение: " + sandboxMessageName +
                            ". Данные: name: " + name );
                    }
                }
            }
        };
    });

3) Подписаться на получение сообщений MyBpFinish в любой клиентской схеме

 

define("AccountSectionV2", [],
    function(BusinessRuleModule, ConfigurationConstants) {
        return {
            //entitySchemaName: "Contact",
            messages: {
                //Имя сообщения.
                "MyBpFinish": {
                    "mode": Terrasoft.MessageMode.BROADCAST,
                    "direction": Terrasoft.MessageDirectionType.SUBSCRIBE
                }
            },
            methods: {
                // Инициализация схемы.
                init: function() {
                    this.callParent(arguments);
                    this.sandbox.subscribe("MyBpFinish", this.onMyBpFinish, this);
                },
                // Обработчик события получения сообщения NewUserSet.
                onMyBpFinish: function(args) {
                    //Обновим грид
                    this.refreshGridData();
                }
 
            }
        };
    });

 

Григорий Чех 

добрый день! сделал все по вашему совету, коды один в один но почему то деталь не обновляется( что может быть? где искать? в консоле ошибка на 

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

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



В примере академии есть описание действия по реализации этого: https://academy.terrasoft.ru/documents/technic-sdk/7-12/mnozhestvennoe-…;



Но я не до конца понимаю концовку:

            getMultiSelectLookupConfig: function() {
                return {
                    // Корневая схема — [Продажа].
                    rootEntitySchemaName: "Opportunity",
                    // Колонка корневой схемы.
                    rootColumnName: "Opportunity",
                    // Связанная схема — [Контакт].
                    relatedEntitySchemaName: "Contact",
                    // Колонка связанной схемы.
                    relatedColumnName: "Contact"

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

relatedEntitySchemaName: "Мой справочник", - это, я так понимаю, как раз то, что будет показываться при добавлении



А что указывать в других строчках, если моя деталь находится на странице обращения и создана мною вручную? 

Нравится

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

Добрый день!

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

пример объекта:

 

 

А это пример детали:

define("UsrSchema6Detail", ["LookupMultiAddMixin"], function() {
	return {
		entitySchemaName: "UsrRecipientsPetitionsOrg",// схема детали будет состоятьиз двух полей справочного типа
		mixins: {
			// Подключение миксина к схеме.
			LookupMultiAddMixin: "Terrasoft.LookupMultiAddMixin"
		},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		 methods: {
			// Переопределение базового метода инициализации схемы.
			init: function() {
				this.callParent(arguments);
				//Инициализация миксина.
				this.mixins.LookupMultiAddMixin.init.call(this);
			},
			// Переопределение базового метода отображения кнопки добавления.
			getAddRecordButtonVisible: function() {
				//Отображать кнопку добавления если деталь развернута, даже если для детали не реализована страница редактирования.
				return this.getToolsVisible();
			},
			// Переопределение базового метода.
			// Обработчик события сохранения страницы редактирования детали.
			onCardSaved: function() {
				// Открывает справочное окно с множественным выбором записей.
				this.openLookupWithMultiSelect();
			},
			// Переопределение базового метода добавления записи на деталь.
			addRecord: function() {
				// Открывает справочное окно с множественным выбором записей.
				this.openLookupWithMultiSelect(true);
			},
 
			// Метод, возвращающий конфигурационный объект для справочного окна.
			getMultiSelectLookupConfig: function() {
					return {
					// Корневая схема — [Петиции]. объект к которому будет относиться деталь
					rootEntitySchemaName: "UsrPetitions",
					// Колонка корневой схемы. колонка в схеме детали (*) справочное поле
					rootColumnName: "UsrPetition",
					// Связанная схема — [Средство связи контрагента]. объект из которого будут выбираться значения
					relatedEntitySchemaName: "AccountCommunication",
					// Колонка связанной схемы. Данная колонка так же объявлена в схеме детали (*) справочное поле 
					relatedColumnName: "UsrEmailFromAccountCom"
				};
 
			},
			getLookupColumns: function() {
				return ["SearchNumber","Account","CommunicationType","Number"]
				},
 
			getLookupConfig: function() {
					return {
						entitySchemaName: this.getRelatedSchemaName(),
						multiSelect: true,
						columns: this.getLookupColumns()
					};
				},
 
			getAllLookupFilters: function(notExistingFilter) {
					var filters = this.Terrasoft.createFilterGroup();
					var additionalFilters = this.getAdditionalLookupFilters();
					if (!this.Ext.isEmpty(notExistingFilter)) {
						filters.add("NotExistsFilter", notExistingFilter);
					}
					if (!this.Ext.isEmpty(additionalFilters)) {
						filters.add("AdditionalFilters", additionalFilters);
					}
					//добавление фильтра на тип = Email
					var idList = ["ee1c85c3-cfcb-df11-9b2A-001d60e938c6", "EE1C85C3-CFCB-DF11-9B2A-001D60E938C6"];
					var filterById = Terrasoft.createColumnInFilterWithParameters("CommunicationType", idList);
					filterById.comparisonType = Terrasoft.ComparisonType.EQUAL;
					filters.add("filterById", filterById);
					return filters;
			}
		}
	};
});

 

Добрый день!

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

пример объекта:

 

 

А это пример детали:

define("UsrSchema6Detail", ["LookupMultiAddMixin"], function() {
	return {
		entitySchemaName: "UsrRecipientsPetitionsOrg",// схема детали будет состоятьиз двух полей справочного типа
		mixins: {
			// Подключение миксина к схеме.
			LookupMultiAddMixin: "Terrasoft.LookupMultiAddMixin"
		},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		 methods: {
			// Переопределение базового метода инициализации схемы.
			init: function() {
				this.callParent(arguments);
				//Инициализация миксина.
				this.mixins.LookupMultiAddMixin.init.call(this);
			},
			// Переопределение базового метода отображения кнопки добавления.
			getAddRecordButtonVisible: function() {
				//Отображать кнопку добавления если деталь развернута, даже если для детали не реализована страница редактирования.
				return this.getToolsVisible();
			},
			// Переопределение базового метода.
			// Обработчик события сохранения страницы редактирования детали.
			onCardSaved: function() {
				// Открывает справочное окно с множественным выбором записей.
				this.openLookupWithMultiSelect();
			},
			// Переопределение базового метода добавления записи на деталь.
			addRecord: function() {
				// Открывает справочное окно с множественным выбором записей.
				this.openLookupWithMultiSelect(true);
			},
 
			// Метод, возвращающий конфигурационный объект для справочного окна.
			getMultiSelectLookupConfig: function() {
					return {
					// Корневая схема — [Петиции]. объект к которому будет относиться деталь
					rootEntitySchemaName: "UsrPetitions",
					// Колонка корневой схемы. колонка в схеме детали (*) справочное поле
					rootColumnName: "UsrPetition",
					// Связанная схема — [Средство связи контрагента]. объект из которого будут выбираться значения
					relatedEntitySchemaName: "AccountCommunication",
					// Колонка связанной схемы. Данная колонка так же объявлена в схеме детали (*) справочное поле 
					relatedColumnName: "UsrEmailFromAccountCom"
				};
 
			},
			getLookupColumns: function() {
				return ["SearchNumber","Account","CommunicationType","Number"]
				},
 
			getLookupConfig: function() {
					return {
						entitySchemaName: this.getRelatedSchemaName(),
						multiSelect: true,
						columns: this.getLookupColumns()
					};
				},
 
			getAllLookupFilters: function(notExistingFilter) {
					var filters = this.Terrasoft.createFilterGroup();
					var additionalFilters = this.getAdditionalLookupFilters();
					if (!this.Ext.isEmpty(notExistingFilter)) {
						filters.add("NotExistsFilter", notExistingFilter);
					}
					if (!this.Ext.isEmpty(additionalFilters)) {
						filters.add("AdditionalFilters", additionalFilters);
					}
					//добавление фильтра на тип = Email
					var idList = ["ee1c85c3-cfcb-df11-9b2A-001d60e938c6", "EE1C85C3-CFCB-DF11-9B2A-001D60E938C6"];
					var filterById = Terrasoft.createColumnInFilterWithParameters("CommunicationType", idList);
					filterById.comparisonType = Terrasoft.ComparisonType.EQUAL;
					filters.add("filterById", filterById);
					return filters;
			}
		}
	};
});

 

Спасибо большое, как раз помогло разобраться :3

Добрый день. Начал изучать креатио и столкнулся с похожей задачей. Помогите пожалуйста добавить фильтр для ServiceItem у него есть булевое значение UsrBooleanBR, хотел бы фильтровать по true.

Вот пример кода:

define("UsrSchema6830a0c2Detail", ["LookupMultiAddMixin"], function() {
	return {
		entitySchemaName: "UsrDetailLinkServiceBR",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		mixins: {
            // Подключение миксина к схеме.
            LookupMultiAddMixin: "Terrasoft.LookupMultiAddMixin"
        },
		methods: {
            // Переопределение базового метода инициализации схемы.
            init: function() {
                this.callParent(arguments);
                //Инициализация миксина.
                this.mixins.LookupMultiAddMixin.init.call(this);
            },
            // Переопределение базового метода отображения кнопки добавления.
            getAddRecordButtonVisible: function() {
                //Отображать кнопку добавления если деталь развернута, 
                //даже если для детали не реализована страница редактирования.
                return this.getToolsVisible();
            },
            // Переопределение базового метода.
            // Обработчик события сохранения страницы редактирования детали.
            onCardSaved: function() {
                // Открывает справочное окно с множественным выбором записей.
                this.openLookupWithMultiSelect();
            },
            // Переопределение базового метода добавления записи на деталь.
            addRecord: function() {
                // Открывает справочное окно с множественным выбором записей.
 
                this.openLookupWithMultiSelect(true);
            },
            // Метод, возвращающий конфигурационный объект для справочного окна.
            getMultiSelectLookupConfig: function() {
 
                return {
                    rootEntitySchemaName: "UsrBusinessRequestV2",
                    rootColumnName: "UsrLookupBR",
                    relatedEntitySchemaName: "ServiceItem",
                    relatedColumnName: "UsrLookupService"
                };
            }
		}
	};
});

 

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

 /**
* Returns additional filters for lookup.
* @protected
* @return {Terrasoft.FilterGroup} Filters.
*/
getAdditionalLookupFilters: this.Terrasoft.emptyFn,

Аналогично тому, как в приведенном выше в теме коде определяют функцию getMultiSelectLookupConfig, которая в LookupMultiAddMixin тоже пустая.

 

Вот пример такой функции для определения фильтра с нужным Вам условием:

getAdditionalLookupFilters: function () {
 var additionalFilter = this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL,
"UsrBooleanBR",
true
);
 return additionalFilter;
 },

 

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

Спасибо огромное , фильтр сработал !

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